/ Hex Artifact Content
Login

Artifact be328c7c1e3ef671a1e833eb2b29048c22ebad73:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 70 72 69 6c  /*.** 2008 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
0180: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0190: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
01a0: 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 69 74 65  ion of an SQLite
01b0: 20 76 66 73 20 77 72 61 70 70 65 72 20 74 68 61   vfs wrapper tha
01c0: 74 0a 2a 2a 20 61 64 64 73 20 69 6e 73 74 72 75  t.** adds instru
01d0: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 61 6c 6c  mentation to all
01e0: 20 76 66 73 20 61 6e 64 20 66 69 6c 65 20 6d 65   vfs and file me
01f0: 74 68 6f 64 73 2e 20 43 20 61 6e 64 20 54 63 6c  thods. C and Tcl
0200: 20 69 6e 74 65 72 66 61 63 65 73 0a 2a 2a 20 61   interfaces.** a
0210: 72 65 20 70 72 6f 76 69 64 65 64 20 74 6f 20 63  re provided to c
0220: 6f 6e 74 72 6f 6c 20 74 68 65 20 69 6e 73 74 72  ontrol the instr
0230: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a  umentation..*/..
0240: 2f 2a 0a 2a 2a 20 43 20 69 6e 74 65 72 66 61 63  /*.** C interfac
0250: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  e:.**.**   sqlit
0260: 65 33 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74  e3_instvfs_creat
0270: 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  e().**   sqlite3
0280: 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79  _instvfs_destroy
0290: 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  ().**   sqlite3_
02a0: 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72  instvfs_configur
02b0: 65 28 29 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69  e().**.**   sqli
02c0: 74 65 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65  te3_instvfs_rese
02d0: 74 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  t().**   sqlite3
02e0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 29 0a 2a  _instvfs_get().*
02f0: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69  *.**   sqlite3_i
0300: 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67  nstvfs_binarylog
0310: 0a 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72  .**.** Tcl inter
0320: 66 61 63 65 20 28 6f 6d 69 74 74 65 64 20 69 66  face (omitted if
0330: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
0340: 6e 6f 74 20 73 65 74 29 3a 0a 2a 2a 20 0a 2a 2a  not set):.** .**
0350: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76     sqlite3_instv
0360: 66 73 20 63 72 65 61 74 65 20 4e 41 4d 45 20 3f  fs create NAME ?
0370: 50 41 52 45 4e 54 3f 0a 2a 2a 0a 2a 2a 20 20 20  PARENT?.**.**   
0380: 20 20 20 20 43 72 65 61 74 65 20 61 6e 64 20 72      Create and r
0390: 65 67 69 73 74 65 72 20 6e 65 77 20 76 66 73 20  egister new vfs 
03a0: 63 61 6c 6c 65 64 20 24 4e 41 4d 45 2c 20 77 68  called $NAME, wh
03b0: 69 63 68 20 69 73 20 61 20 77 72 61 70 70 65 72  ich is a wrapper
03c0: 20 61 72 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20   around.**      
03d0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 76 66   the existing vf
03e0: 73 20 24 50 41 52 45 4e 54 2e 20 49 66 20 74 68  s $PARENT. If th
03f0: 65 20 50 41 52 45 4e 54 20 61 72 67 75 6d 65 6e  e PARENT argumen
0400: 74 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  t is omitted, th
0410: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77 20 76  e.**       new v
0420: 66 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  fs is a wrapper 
0430: 61 72 6f 75 6e 64 20 74 68 65 20 63 75 72 72 65  around the curre
0440: 6e 74 20 64 65 66 61 75 6c 74 20 76 66 73 2e 0a  nt default vfs..
0450: 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  **.**   sqlite3_
0460: 69 6e 73 74 76 66 73 20 64 65 73 74 72 6f 79 20  instvfs destroy 
0470: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  NAME.**.**      
0480: 20 44 65 72 65 67 69 73 74 65 72 20 61 6e 64 20   Deregister and 
0490: 64 65 73 74 72 6f 79 20 74 68 65 20 76 66 73 20  destroy the vfs 
04a0: 6e 61 6d 65 64 20 24 4e 41 4d 45 2c 20 77 68 69  named $NAME, whi
04b0: 63 68 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ch must have bee
04c0: 6e 0a 2a 2a 20 20 20 20 20 20 20 63 72 65 61 74  n.**       creat
04d0: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
04e0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 5b   invocation of [
04f0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20  sqlite3_instvfs 
0500: 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a 2a 2a 20 20  create]..**.**  
0510: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
0520: 20 63 6f 6e 66 69 67 75 72 65 20 4e 41 4d 45 20   configure NAME 
0530: 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 20 20 20  SCRIPT.**.**    
0540: 20 20 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65     Configure the
0550: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
0560: 20 66 6f 72 20 74 68 65 20 76 66 73 20 24 4e 41   for the vfs $NA
0570: 4d 45 2c 20 77 68 69 63 68 20 6d 75 63 68 20 68  ME, which much h
0580: 61 76 65 0a 2a 2a 20 20 20 20 20 20 20 62 65 65  ave.**       bee
0590: 6e 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  n created by an 
05a0: 65 61 72 6c 69 65 72 20 69 6e 76 6f 63 61 74 69  earlier invocati
05b0: 6f 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f 69  on of [sqlite3_i
05c0: 6e 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e 0a  nstvfs create]..
05d0: 2a 2a 20 20 20 20 20 20 20 41 66 74 65 72 20 61  **       After a
05e0: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
05f0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
0600: 75 72 65 64 2c 20 69 74 20 69 73 20 69 6e 76 6f  ured, it is invo
0610: 6b 65 64 20 65 61 63 68 0a 2a 2a 20 20 20 20 20  ked each.**     
0620: 20 20 74 69 6d 65 20 61 20 76 66 73 20 6f 72 20    time a vfs or 
0630: 66 69 6c 65 20 6d 65 74 68 6f 64 20 69 73 20 63  file method is c
0640: 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 2e  alled by SQLite.
0650: 20 42 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67   Before invoking
0660: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 63 61  .**       the ca
0670: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 2c 20 66  llback script, f
0680: 69 76 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72  ive arguments ar
0690: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74  e appended to it
06a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
06b0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
06c0: 65 20 69 6e 76 6f 6b 65 64 20 6d 65 74 68 6f 64  e invoked method
06d0: 20 2d 20 69 2e 65 2e 20 22 78 52 65 61 64 22 2e   - i.e. "xRead".
06e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a  .**.**         *
06f0: 20 54 68 65 20 74 69 6d 65 20 63 6f 6e 73 75 6d   The time consum
0700: 65 64 20 62 79 20 74 68 65 20 6d 65 74 68 6f 64  ed by the method
0710: 20 63 61 6c 6c 20 61 73 20 6d 65 61 73 75 72 65   call as measure
0720: 64 20 62 79 20 68 77 74 69 6d 65 28 29 20 28 61  d by hwtime() (a
0730: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  n.**           i
0740: 6e 74 65 67 65 72 20 76 61 6c 75 65 29 0a 2a 2a  nteger value).**
0750: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20  .**         * A 
0760: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 77 69 74  string value wit
0770: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 65  h a different me
0780: 61 6e 69 6e 67 20 66 6f 72 20 64 69 66 66 65 72  aning for differ
0790: 65 6e 74 20 63 61 6c 6c 73 2e 20 0a 2a 2a 20 20  ent calls. .**  
07a0: 20 20 20 20 20 20 20 20 20 46 6f 72 20 66 69 6c           For fil
07b0: 65 20 6d 65 74 68 6f 64 73 2c 20 74 68 65 20 6e  e methods, the n
07c0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
07d0: 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
07e0: 6e 2e 20 46 6f 72 0a 2a 2a 20 20 20 20 20 20 20  n. For.**       
07f0: 20 20 20 20 6f 74 68 65 72 20 6d 65 74 68 6f 64      other method
0800: 73 20 69 74 20 69 73 20 74 68 65 20 66 69 6c 65  s it is the file
0810: 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 2c 20 69  name argument, i
0820: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  f any..**.**    
0830: 20 20 20 20 20 2a 20 41 20 33 32 2d 62 69 74 20       * A 32-bit 
0840: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 69  integer value wi
0850: 74 68 20 61 20 63 61 6c 6c 2d 73 70 65 63 69 66  th a call-specif
0860: 69 63 20 6d 65 61 6e 69 6e 67 2e 0a 2a 2a 0a 2a  ic meaning..**.*
0870: 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20 36 34  *         * A 64
0880: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
0890: 75 65 2e 20 46 6f 72 20 78 52 65 61 64 28 29 20  ue. For xRead() 
08a0: 61 6e 64 20 78 57 72 69 74 65 28 29 20 63 61 6c  and xWrite() cal
08b0: 6c 73 20 74 68 69 73 0a 2a 2a 20 20 20 20 20 20  ls this.**      
08c0: 20 20 20 20 20 69 73 20 74 68 65 20 66 69 6c 65       is the file
08d0: 20 6f 66 66 73 65 74 20 62 65 69 6e 67 20 77 72   offset being wr
08e0: 69 74 74 65 6e 20 74 6f 20 6f 72 20 72 65 61 64  itten to or read
08f0: 20 66 72 6f 6d 2e 20 55 6e 75 73 65 64 20 62 79   from. Unused by
0900: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 6c  .**           al
0910: 6c 20 6f 74 68 65 72 20 63 61 6c 6c 73 2e 0a 2a  l other calls..*
0920: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69  *.**   sqlite3_i
0930: 6e 73 74 76 66 73 20 72 65 73 65 74 20 4e 41 4d  nstvfs reset NAM
0940: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 5a 65  E.**.**       Ze
0950: 72 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ro the internal 
0960: 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 73 20 61  event counters a
0970: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 76  ssociated with v
0980: 66 73 20 24 4e 41 4d 45 2c 20 0a 2a 2a 20 20 20  fs $NAME, .**   
0990: 20 20 20 20 77 68 69 63 68 20 6d 75 73 74 20 68      which must h
09a0: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
09b0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 69   by an earlier i
09c0: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  nvocation of .**
09d0: 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 5f         [sqlite3_
09e0: 69 6e 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e  instvfs create].
09f0: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  .**.**   sqlite3
0a00: 5f 69 6e 73 74 76 66 73 20 72 65 70 6f 72 74 20  _instvfs report 
0a10: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  NAME.**.**      
0a20: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
0a30: 65 73 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  es of the intern
0a40: 61 6c 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72  al event counter
0a50: 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  s associated .**
0a60: 20 20 20 20 20 20 20 77 69 74 68 20 76 66 73 20         with vfs 
0a70: 24 4e 41 4d 45 2e 20 54 68 65 20 72 65 70 6f 72  $NAME. The repor
0a80: 74 20 66 6f 72 6d 61 74 20 69 73 20 61 20 6c 69  t format is a li
0a90: 73 74 20 77 69 74 68 20 6f 6e 65 20 65 6c 65 6d  st with one elem
0aa0: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72  ent.**       for
0ab0: 20 65 61 63 68 20 6d 65 74 68 6f 64 20 63 61 6c   each method cal
0ac0: 6c 20 28 78 57 72 69 74 65 2c 20 78 52 65 61 64  l (xWrite, xRead
0ad0: 20 65 74 63 2e 29 2e 20 45 61 63 68 20 65 6c 65   etc.). Each ele
0ae0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  ment is.**      
0af0: 20 69 74 73 65 6c 66 20 61 20 6c 69 73 74 20 77   itself a list w
0b00: 69 74 68 20 74 68 72 65 65 20 65 6c 65 6d 65 6e  ith three elemen
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ts:.**.**       
0b20: 20 20 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20    * The name of 
0b30: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 20  the method call 
0b40: 2d 20 69 2e 65 2e 20 22 78 57 72 69 74 65 22 2c  - i.e. "xWrite",
0b50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 54 68  .**         * Th
0b60: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
0b70: 66 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6d  f calls to the m
0b80: 65 74 68 6f 64 20 28 61 6e 20 69 6e 74 65 67 65  ethod (an intege
0b90: 72 29 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a  r)..**         *
0ba0: 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 74   The aggregate t
0bb0: 69 6d 65 20 63 6f 6e 73 75 6d 65 64 20 62 79 20  ime consumed by 
0bc0: 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  all calls to the
0bd0: 20 6d 65 74 68 6f 64 20 61 73 0a 2a 2a 20 20 20   method as.**   
0be0: 20 20 20 20 20 20 20 20 6d 65 61 73 75 72 65 64          measured
0bf0: 20 62 79 20 68 77 74 69 6d 65 28 29 20 28 61 6e   by hwtime() (an
0c00: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2f 0a 0a 23   integer)..*/..#
0c10: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0c20: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h".#include "sq
0c30: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
0c40: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0c50: 6d 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f 72  me length suppor
0c60: 74 65 64 20 62 79 20 74 68 65 20 69 6e 73 74 20  ted by the inst 
0c70: 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23 64 65 66  backend..*/.#def
0c80: 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f 50 41 54  ine INST_MAX_PAT
0c90: 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f 2a 20 46  HNAME 512.../* F
0ca0: 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 2f  ile methods */./
0cb0: 2a 20 56 66 73 20 6d 65 74 68 6f 64 73 20 2a 2f  * Vfs methods */
0cc0: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 41 43 43 45  .#define OS_ACCE
0cd0: 53 53 20 20 20 20 20 20 20 20 20 20 20 20 31 0a  SS            1.
0ce0: 23 64 65 66 69 6e 65 20 4f 53 5f 43 48 45 43 4b  #define OS_CHECK
0cf0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 20 32 0a 23  RESERVEDLOCK 2.#
0d00: 64 65 66 69 6e 65 20 4f 53 5f 43 4c 4f 53 45 20  define OS_CLOSE 
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 33 0a 23 64              3.#d
0d20: 65 66 69 6e 65 20 4f 53 5f 43 55 52 52 45 4e 54  efine OS_CURRENT
0d30: 54 49 4d 45 20 20 20 20 20 20 20 34 0a 23 64 65  TIME       4.#de
0d40: 66 69 6e 65 20 4f 53 5f 44 45 4c 45 54 45 20 20  fine OS_DELETE  
0d50: 20 20 20 20 20 20 20 20 20 20 35 0a 23 64 65 66            5.#def
0d60: 69 6e 65 20 4f 53 5f 44 45 56 43 48 41 52 20 20  ine OS_DEVCHAR  
0d70: 20 20 20 20 20 20 20 20 20 36 0a 23 64 65 66 69           6.#defi
0d80: 6e 65 20 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f  ne OS_FILECONTRO
0d90: 4c 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e  L       7.#defin
0da0: 65 20 4f 53 5f 46 49 4c 45 53 49 5a 45 20 20 20  e OS_FILESIZE   
0db0: 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65         8.#define
0dc0: 20 4f 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45   OS_FULLPATHNAME
0dd0: 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20        9.#define 
0de0: 4f 53 5f 47 45 54 54 45 4d 50 4e 41 4d 45 20 20  OS_GETTEMPNAME  
0df0: 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20       10.#define 
0e00: 4f 53 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20  OS_LOCK         
0e10: 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20       11.#define 
0e20: 4f 53 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  OS_OPEN         
0e30: 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20       12.#define 
0e40: 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 20 20 20  OS_RANDOMNESS   
0e50: 20 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65 20       13.#define 
0e60: 4f 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  OS_READ         
0e70: 20 20 20 20 20 31 34 20 0a 23 64 65 66 69 6e 65       14 .#define
0e80: 20 4f 53 5f 53 45 43 54 4f 52 53 49 5a 45 20 20   OS_SECTORSIZE  
0e90: 20 20 20 20 20 20 31 35 0a 23 64 65 66 69 6e 65        15.#define
0ea0: 20 4f 53 5f 53 4c 45 45 50 20 20 20 20 20 20 20   OS_SLEEP       
0eb0: 20 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65        16.#define
0ec0: 20 4f 53 5f 53 59 4e 43 20 20 20 20 20 20 20 20   OS_SYNC        
0ed0: 20 20 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65        17.#define
0ee0: 20 4f 53 5f 54 52 55 4e 43 41 54 45 20 20 20 20   OS_TRUNCATE    
0ef0: 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e 65        18.#define
0f00: 20 4f 53 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20   OS_UNLOCK      
0f10: 20 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65        19.#define
0f20: 20 4f 53 5f 57 52 49 54 45 20 20 20 20 20 20 20   OS_WRITE       
0f30: 20 20 20 20 20 20 32 30 0a 0a 23 64 65 66 69 6e        20..#defin
0f40: 65 20 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 20 20  e OS_NUMEVENTS  
0f50: 20 20 20 20 20 20 20 32 31 0a 0a 73 74 72 75 63         21..struc
0f60: 74 20 49 6e 73 74 56 66 73 20 7b 0a 20 20 73 71  t InstVfs {.  sq
0f70: 6c 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 0a  lite3_vfs base;.
0f80: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0f90: 56 66 73 3b 0a 20 20 0a 20 20 76 6f 69 64 20 2a  Vfs;.  .  void *
0fa0: 70 43 6c 69 65 6e 74 3b 0a 20 20 76 6f 69 64 20  pClient;.  void 
0fb0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 20 2a 29 3b  (*xDel)(void *);
0fc0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 29  .  void (*xCall)
0fd0: 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 73 71  (void *, int, sq
0fe0: 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 63 6f 6e  lite3_int64, con
0ff0: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  st char *, int, 
1000: 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  int, sqlite3_int
1010: 36 34 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  64);..  /* Count
1020: 65 72 73 20 2a 2f 0a 20 20 69 36 34 20 61 54 69  ers */.  i64 aTi
1030: 6d 65 5b 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 5d  me[OS_NUMEVENTS]
1040: 3b 0a 20 20 69 6e 74 20 61 43 6f 75 6e 74 5b 4f  ;.  int aCount[O
1050: 53 5f 4e 55 4d 45 56 45 4e 54 53 5d 3b 0a 7d 3b  S_NUMEVENTS];.};
1060: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1070: 49 6e 73 74 56 66 73 20 49 6e 73 74 56 66 73 3b  InstVfs InstVfs;
1080: 0a 0a 23 64 65 66 69 6e 65 20 52 45 41 4c 56 46  ..#define REALVF
1090: 53 28 70 29 20 28 28 28 49 6e 73 74 56 66 73 20  S(p) (((InstVfs 
10a0: 2a 29 28 70 29 29 2d 3e 70 56 66 73 29 0a 0a 74  *)(p))->pVfs)..t
10b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 69 6e  ypedef struct in
10c0: 73 74 5f 66 69 6c 65 20 69 6e 73 74 5f 66 69 6c  st_file inst_fil
10d0: 65 3b 0a 73 74 72 75 63 74 20 69 6e 73 74 5f 66  e;.struct inst_f
10e0: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
10f0: 66 69 6c 65 20 62 61 73 65 3b 0a 20 20 73 71 6c  file base;.  sql
1100: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
1110: 3b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e  ;.  InstVfs *pIn
1120: 73 74 56 66 73 3b 0a 20 20 63 6f 6e 73 74 20 63  stVfs;.  const c
1130: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e  har *zName;.  in
1140: 74 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a  t flags;.};../*.
1150: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72  ** Method declar
1160: 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f  ations for inst_
1170: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1180: 69 6e 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71  int instClose(sq
1190: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
11a0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65 61  atic int instRea
11b0: 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  d(sqlite3_file*,
11c0: 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74   void*, int iAmt
11d0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
11e0: 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69  iOfst);.static i
11f0: 6e 74 20 69 6e 73 74 57 72 69 74 65 28 73 71 6c  nt instWrite(sql
1200: 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74  ite3_file*,const
1210: 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c   void*,int iAmt,
1220: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1230: 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  Ofst);.static in
1240: 74 20 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73  t instTruncate(s
1250: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71  qlite3_file*, sq
1260: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65  lite3_int64 size
1270: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  );.static int in
1280: 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  stSync(sqlite3_f
1290: 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29  ile*, int flags)
12a0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  ;.static int ins
12b0: 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  tFileSize(sqlite
12c0: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  3_file*, sqlite3
12d0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a  _int64 *pSize);.
12e0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4c  static int instL
12f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1300: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
1310: 69 6e 74 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73  int instUnlock(s
1320: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1330: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  t);.static int i
1340: 6e 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64  nstCheckReserved
1350: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1360: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
1370: 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  instFileControl(
1380: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
1390: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
13a0: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  g);.static int i
13b0: 6e 73 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nstSectorSize(sq
13c0: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
13d0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 76  atic int instDev
13e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
13f0: 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  cs(sqlite3_file*
1400: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64  );../*.** Method
1410: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   declarations fo
1420: 72 20 69 6e 73 74 5f 76 66 73 2e 0a 2a 2f 0a 73  r inst_vfs..*/.s
1430: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4f 70  tatic int instOp
1440: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
1450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73   const char *, s
1460: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1470: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  t , int *);.stat
1480: 69 63 20 69 6e 74 20 69 6e 73 74 44 65 6c 65 74  ic int instDelet
1490: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
14a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
14b0: 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b  e, int syncDir);
14c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
14d0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76  Access(sqlite3_v
14e0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
14f0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
1500: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  s);.static int i
1510: 6e 73 74 47 65 74 54 65 6d 70 4e 61 6d 65 28 73  nstGetTempName(s
1520: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74  qlite3_vfs*, int
1530: 20 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a 4f 75   nOut, char *zOu
1540: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  t);.static int i
1550: 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nstFullPathname(
1560: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
1570: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1580: 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75 74   int, char *zOut
1590: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
15a0: 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74  instDlOpen(sqlit
15b0: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63  e3_vfs*, const c
15c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 3b  har *zFilename);
15d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
15e0: 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  tDlError(sqlite3
15f0: 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65  _vfs*, int nByte
1600: 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29  , char *zErrMsg)
1610: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69  ;.static void *i
1620: 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nstDlSym(sqlite3
1630: 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e  _vfs*,void*, con
1640: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
1650: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  );.static void i
1660: 6e 73 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nstDlClose(sqlit
1670: 65 33 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b  e3_vfs*, void*);
1680: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
1690: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
16a0: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79  e3_vfs*, int nBy
16b0: 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b  te, char *zOut);
16c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
16d0: 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
16e0: 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  s*, int microsec
16f0: 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  onds);.static in
1700: 74 20 69 6e 73 74 43 75 72 72 65 6e 74 54 69 6d  t instCurrentTim
1710: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
1720: 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74 69  double*);..stati
1730: 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6e  c sqlite3_vfs in
1740: 73 74 5f 76 66 73 20 3d 20 7b 0a 20 20 31 2c 20  st_vfs = {.  1, 
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1770: 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 69 6e 73   */.  sizeof(ins
1780: 74 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 2f 2a  t_file),      /*
1790: 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 49   szOsFile */.  I
17a0: 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45  NST_MAX_PATHNAME
17b0: 2c 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68  ,      /* mxPath
17c0: 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  name */.  0,    
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
17f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1800: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
1810: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1830: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 69   pAppData */.  i
1840: 6e 73 74 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nstOpen,        
1850: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
1860: 2a 2f 0a 20 20 69 6e 73 74 44 65 6c 65 74 65 2c  */.  instDelete,
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1880: 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 73  xDelete */.  ins
1890: 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  tAccess,        
18a0: 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
18b0: 2a 2f 0a 20 20 69 6e 73 74 47 65 74 54 65 6d 70  */.  instGetTemp
18c0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
18d0: 78 47 65 74 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a  xGetTempName */.
18e0: 20 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61    instFullPathna
18f0: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75  me,       /* xFu
1900: 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
1910: 69 6e 73 74 44 6c 4f 70 65 6e 2c 20 20 20 20 20  instDlOpen,     
1920: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
1930: 65 6e 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 45 72  en */.  instDlEr
1940: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
1950: 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
1960: 20 69 6e 73 74 44 6c 53 79 6d 2c 20 20 20 20 20   instDlSym,     
1970: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
1980: 79 6d 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 43 6c  ym */.  instDlCl
1990: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
19a0: 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
19b0: 20 69 6e 73 74 52 61 6e 64 6f 6d 6e 65 73 73 2c   instRandomness,
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
19d0: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 73  domness */.  ins
19e0: 74 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  tSleep,         
19f0: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
1a00: 2f 0a 20 20 69 6e 73 74 43 75 72 72 65 6e 74 54  /.  instCurrentT
1a10: 69 6d 65 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ime         /* x
1a20: 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d  CurrentTime */.}
1a30: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
1a40: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 69 6e 73  3_io_methods ins
1a50: 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b  t_io_methods = {
1a60: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
1a90: 20 20 69 6e 73 74 43 6c 6f 73 65 2c 20 20 20 20    instClose,    
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
1ac0: 20 69 6e 73 74 52 65 61 64 2c 20 20 20 20 20 20   instRead,      
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 69   /* xRead */.  i
1af0: 6e 73 74 57 72 69 74 65 2c 20 20 20 20 20 20 20  nstWrite,       
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b10: 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 69 6e  * xWrite */.  in
1b20: 73 74 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  stTruncate,     
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b40: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
1b50: 69 6e 73 74 53 79 6e 63 2c 20 20 20 20 20 20 20  instSync,       
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 69 6e  /* xSync */.  in
1b80: 73 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  stFileSize,     
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba0: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
1bb0: 69 6e 73 74 4c 6f 63 6b 2c 20 20 20 20 20 20 20  instLock,       
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  /* xLock */.  in
1be0: 73 74 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  stUnlock,       
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   xUnlock */.  in
1c10: 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  stCheckReservedL
1c20: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ock,          /*
1c30: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1c40: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 73 74 46 69 6c  ock */.  instFil
1c50: 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1c70: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 69 6e  eControl */.  in
1c80: 73 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  stSectorSize,   
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
1cb0: 20 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72    instDeviceChar
1cc0: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20  acteristics     
1cd0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
1ce0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 7d  acteristics */.}
1cf0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
1d00: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 6f  lowing routine o
1d10: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 6e  nly works on pen
1d20: 74 69 75 6d 2d 63 6c 61 73 73 20 70 72 6f 63 65  tium-class proce
1d30: 73 73 6f 72 73 2e 0a 2a 2a 20 49 74 20 75 73 65  ssors..** It use
1d40: 73 20 74 68 65 20 52 44 54 53 43 20 6f 70 63 6f  s the RDTSC opco
1d50: 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63  de to read the c
1d60: 79 63 6c 65 20 63 6f 75 6e 74 20 76 61 6c 75 65  ycle count value
1d70: 20 6f 75 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70   out of the.** p
1d80: 72 6f 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74  rocessor and ret
1d90: 75 72 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e  urns that value.
1da0: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1db0: 65 64 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0a  ed for high-res.
1dc0: 2a 2a 20 70 72 6f 66 69 6c 69 6e 67 2e 0a 2a 2f  ** profiling..*/
1dd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 33 38  .#if defined(i38
1de0: 36 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  6) || defined(__
1df0: 69 33 38 36 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  i386__) || defin
1e00: 65 64 28 5f 4d 5f 49 58 38 36 29 0a 5f 5f 69 6e  ed(_M_IX86).__in
1e10: 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e 65 64 20  line__ unsigned 
1e20: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 68 77  long long int hw
1e30: 74 69 6d 65 28 76 6f 69 64 29 7b 0a 20 20 20 75  time(void){.   u
1e40: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 6f 2c 20  nsigned int lo, 
1e50: 68 69 3b 0a 20 20 20 2f 2a 20 57 65 20 63 61 6e  hi;.   /* We can
1e60: 6e 6f 74 20 75 73 65 20 22 3d 41 22 2c 20 73 69  not use "=A", si
1e70: 6e 63 65 20 74 68 69 73 20 77 6f 75 6c 64 20 75  nce this would u
1e80: 73 65 20 25 72 61 78 20 6f 6e 20 78 38 36 5f 36  se %rax on x86_6
1e90: 34 20 2a 2f 0a 20 20 20 5f 5f 61 73 6d 5f 5f 20  4 */.   __asm__ 
1ea0: 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 72  __volatile__ ("r
1eb0: 64 74 73 63 22 20 3a 20 22 3d 61 22 20 28 6c 6f  dtsc" : "=a" (lo
1ec0: 29 2c 20 22 3d 64 22 20 28 68 69 29 29 3b 0a 20  ), "=d" (hi));. 
1ed0: 20 20 72 65 74 75 72 6e 20 28 75 6e 73 69 67 6e    return (unsign
1ee0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74  ed long long int
1ef0: 29 68 69 20 3c 3c 20 33 32 20 7c 20 6c 6f 3b 0a  )hi << 32 | lo;.
1f00: 7d 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63  }.#else.  static
1f10: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
1f20: 6f 6e 67 20 69 6e 74 20 68 77 74 69 6d 65 28 76  ong int hwtime(v
1f30: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  oid){ return 0; 
1f40: 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
1f50: 65 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 65 45 76  e OS_TIME_IO(eEv
1f60: 65 6e 74 2c 20 41 2c 20 42 2c 20 43 61 6c 6c 29  ent, A, B, Call)
1f70: 20 7b 20 20 20 20 20 5c 0a 20 20 69 6e 73 74 5f   {     \.  inst_
1f80: 66 69 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f  file *p = (inst_
1f90: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 20 20 20  file *)pFile;   
1fa0: 20 20 20 20 20 20 5c 0a 20 20 49 6e 73 74 56 66        \.  InstVf
1fb0: 73 20 2a 70 49 6e 73 74 56 66 73 20 3d 20 70 2d  s *pInstVfs = p-
1fc0: 3e 70 49 6e 73 74 56 66 73 3b 20 20 20 20 20 20  >pInstVfs;      
1fd0: 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 72 63 3b       \.  int rc;
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 5c 0a 20 20 69 36 34 20 74 20 3d 20      \.  i64 t = 
2010: 68 77 74 69 6d 65 28 29 3b 20 20 20 20 20 20 20  hwtime();       
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c     \.  rc = Call
2040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 5c 0a 20 20 74 20 3d 20 68 77 74 69 6d 65    \.  t = hwtime
2070: 28 29 20 2d 20 74 3b 20 20 20 20 20 20 20 20 20  () - t;         
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61   \.  pInstVfs->a
20a0: 54 69 6d 65 5b 65 45 76 65 6e 74 5d 20 2b 3d 20  Time[eEvent] += 
20b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20c0: 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43  \.  pInstVfs->aC
20d0: 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20  ount[eEvent] += 
20e0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  1;             \
20f0: 0a 20 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d  .  if( pInstVfs-
2100: 3e 78 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20  >xCall ){       
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2120: 20 20 20 20 70 49 6e 73 74 56 66 73 2d 3e 78 43      pInstVfs->xC
2130: 61 6c 6c 28 70 49 6e 73 74 56 66 73 2d 3e 70 43  all(pInstVfs->pC
2140: 6c 69 65 6e 74 2c 20 65 45 76 65 6e 74 2c 20 74  lient, eEvent, t
2150: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 66  , p->zName, p->f
2160: 6c 61 67 73 2c 20 41 2c 20 42 29 3b 20 5c 0a 20  lags, A, B); \. 
2170: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21a0: 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
21d0: 23 64 65 66 69 6e 65 20 4f 53 5f 54 49 4d 45 5f  #define OS_TIME_
21e0: 56 46 53 28 65 45 76 65 6e 74 2c 20 5a 2c 20 41  VFS(eEvent, Z, A
21f0: 2c 20 42 2c 20 43 61 6c 6c 29 20 7b 20 20 20 20  , B, Call) {    
2200: 20 20 5c 0a 20 20 49 6e 73 74 56 66 73 20 2a 70    \.  InstVfs *p
2210: 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73 74 56  InstVfs = (InstV
2220: 66 73 20 2a 29 70 56 66 73 3b 20 20 20 5c 0a 20  fs *)pVfs;   \. 
2230: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 36 34 20          \.  i64 
2260: 74 20 3d 20 68 77 74 69 6d 65 28 29 3b 20 20 20  t = hwtime();   
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c     \.  rc = Call
2290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22b0: 20 20 74 20 3d 20 68 77 74 69 6d 65 28 29 20 2d    t = hwtime() -
22c0: 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   t;             
22d0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 70 49 6e           \.  pIn
22e0: 73 74 56 66 73 2d 3e 61 54 69 6d 65 5b 65 45 76  stVfs->aTime[eEv
22f0: 65 6e 74 5d 20 2b 3d 20 74 3b 20 20 20 20 20 20  ent] += t;      
2300: 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 73      \.  pInstVfs
2310: 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d  ->aCount[eEvent]
2320: 20 2b 3d 20 31 3b 20 20 20 20 20 20 20 20 20 5c   += 1;         \
2330: 0a 20 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d  .  if( pInstVfs-
2340: 3e 78 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20  >xCall ){       
2350: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2360: 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 28  pInstVfs->xCall(
2370: 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65 6e  pInstVfs->pClien
2380: 74 2c 20 65 45 76 65 6e 74 2c 20 74 2c 20 5a 2c  t, eEvent, t, Z,
2390: 20 30 2c 20 41 2c 20 42 29 3b 20 5c 0a 20 20 7d   0, A, B); \.  }
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
23d0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   \.}../*.** Clos
2400: 65 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a  e an inst-file..
2410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
2420: 73 74 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  stClose(sqlite3_
2430: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
2440: 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 43 4c  OS_TIME_IO(OS_CL
2450: 4f 53 45 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74  OSE, 0, 0, sqlit
2460: 65 33 4f 73 43 6c 6f 73 65 28 70 2d 3e 70 52 65  e3OsClose(p->pRe
2470: 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  al));.}../*.** R
2480: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
2490: 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73   inst-file..*/.s
24a0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65  tatic int instRe
24b0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
24c0: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
24d0: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
24e0: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
24f0: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
2500: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f    OS_TIME_IO(OS_
2510: 52 45 41 44 2c 20 69 41 6d 74 2c 20 69 4f 66 73  READ, iAmt, iOfs
2520: 74 2c 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  t, sqlite3OsRead
2530: 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c  (p->pReal, zBuf,
2540: 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 29 3b 0a   iAmt, iOfst));.
2550: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
2560: 61 74 61 20 74 6f 20 61 6e 20 69 6e 73 74 2d 66  ata to an inst-f
2570: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2580: 6e 74 20 69 6e 73 74 57 72 69 74 65 28 0a 20 20  nt instWrite(.  
2590: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
25a0: 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ile,.  const voi
25b0: 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74  d *z,.  int iAmt
25c0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
25d0: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4f 53 5f 54   iOfst.){.  OS_T
25e0: 49 4d 45 5f 49 4f 28 4f 53 5f 57 52 49 54 45 2c  IME_IO(OS_WRITE,
25f0: 20 69 41 6d 74 2c 20 69 4f 66 73 74 2c 20 73 71   iAmt, iOfst, sq
2600: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e  lite3OsWrite(p->
2610: 70 52 65 61 6c 2c 20 7a 2c 20 69 41 6d 74 2c 20  pReal, z, iAmt, 
2620: 69 4f 66 73 74 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iOfst));.}../*.*
2630: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  * Truncate an in
2640: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  st-file..*/.stat
2650: 69 63 20 69 6e 74 20 69 6e 73 74 54 72 75 6e 63  ic int instTrunc
2660: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
2670: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
2680: 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 4f  int64 size){.  O
2690: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 54 52 55  S_TIME_IO(OS_TRU
26a0: 4e 43 41 54 45 2c 20 30 2c 20 73 69 7a 65 2c 20  NCATE, 0, size, 
26b0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
26c0: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65  e(p->pReal, size
26d0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  ));.}../*.** Syn
26e0: 63 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a  c an inst-file..
26f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
2700: 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  stSync(sqlite3_f
2710: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
2720: 66 6c 61 67 73 29 7b 0a 20 20 4f 53 5f 54 49 4d  flags){.  OS_TIM
2730: 45 5f 49 4f 28 4f 53 5f 53 59 4e 43 2c 20 66 6c  E_IO(OS_SYNC, fl
2740: 61 67 73 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f  ags, 0, sqlite3O
2750: 73 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20  sSync(p->pReal, 
2760: 66 6c 61 67 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  flags));.}../*.*
2770: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
2780: 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f  rent file-size o
2790: 66 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a  f an inst-file..
27a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
27b0: 73 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  stFileSize(sqlit
27c0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
27d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53  sqlite_int64 *pS
27e0: 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f  ize){.  OS_TIME_
27f0: 49 4f 28 4f 53 5f 46 49 4c 45 53 49 5a 45 2c 20  IO(OS_FILESIZE, 
2800: 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 46  0, 0, sqlite3OsF
2810: 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c  ileSize(p->pReal
2820: 2c 20 70 53 69 7a 65 29 29 3b 0a 7d 0a 0a 2f 2a  , pSize));.}../*
2830: 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 69 6e 73 74  .** Lock an inst
2840: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2850: 20 69 6e 74 20 69 6e 73 74 4c 6f 63 6b 28 73 71   int instLock(sq
2860: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2870: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
2880: 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 4c   OS_TIME_IO(OS_L
2890: 4f 43 4b 2c 20 65 4c 6f 63 6b 2c 20 30 2c 20 73  OCK, eLock, 0, s
28a0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 2d 3e  qlite3OsLock(p->
28b0: 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a  pReal, eLock));.
28c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
28d0: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f  an inst-file..*/
28e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
28f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
2900: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
2910: 65 4c 6f 63 6b 29 7b 0a 20 20 4f 53 5f 54 49 4d  eLock){.  OS_TIM
2920: 45 5f 49 4f 28 4f 53 5f 55 4e 4c 4f 43 4b 2c 20  E_IO(OS_UNLOCK, 
2930: 65 4c 6f 63 6b 2c 20 30 2c 20 73 71 6c 69 74 65  eLock, 0, sqlite
2940: 33 4f 73 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65  3OsUnlock(p->pRe
2950: 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a  al, eLock));.}..
2960: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61  /*.** Check if a
2970: 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64  nother file-hand
2980: 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  le holds a RESER
2990: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 69  VED lock on an i
29a0: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
29b0: 74 69 63 20 69 6e 74 20 69 6e 73 74 43 68 65 63  tic int instChec
29c0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
29d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
29e0: 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f  e){.  OS_TIME_IO
29f0: 28 4f 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45  (OS_CHECKRESERVE
2a00: 44 4c 4f 43 4b 2c 20 30 2c 20 30 2c 20 73 71 6c  DLOCK, 0, 0, sql
2a10: 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2a20: 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  vedLock(p->pReal
2a30: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  ));.}../*.** Fil
2a40: 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e control method
2a50: 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65  . For custom ope
2a60: 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 69 6e  rations on an in
2a70: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  st-file..*/.stat
2a80: 69 63 20 69 6e 74 20 69 6e 73 74 46 69 6c 65 43  ic int instFileC
2a90: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
2aa0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
2ab0: 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
2ac0: 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53  .  OS_TIME_IO(OS
2ad0: 5f 46 49 4c 45 43 4f 4e 54 52 4f 4c 2c 20 30 2c  _FILECONTROL, 0,
2ae0: 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 46 69 6c   0, sqlite3OsFil
2af0: 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  eControl(p->pRea
2b00: 6c 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 7d  l, op, pArg));.}
2b10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2b20: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
2b30: 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 69  n bytes for an i
2b40: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
2b50: 74 69 63 20 69 6e 74 20 69 6e 73 74 53 65 63 74  tic int instSect
2b60: 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
2b70: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f  ile *pFile){.  O
2b80: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 45 43  S_TIME_IO(OS_SEC
2b90: 54 4f 52 53 49 5a 45 2c 20 30 2c 20 30 2c 20 73  TORSIZE, 0, 0, s
2ba0: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
2bb0: 7a 65 28 70 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d  ze(p->pReal));.}
2bc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2bd0: 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
2be0: 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73  teristic flags s
2bf0: 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20 69  upported by an i
2c00: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
2c10: 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 76 69  tic int instDevi
2c20: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2c30: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
2c40: 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d  pFile){.  OS_TIM
2c50: 45 5f 49 4f 28 4f 53 5f 44 45 56 43 48 41 52 2c  E_IO(OS_DEVCHAR,
2c60: 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f 73   0, 0, sqlite3Os
2c70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2c80: 73 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 29  stics(p->pReal))
2c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2ca0: 61 6e 20 69 6e 73 74 20 66 69 6c 65 20 68 61 6e  an inst file han
2cb0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
2cc0: 6e 74 20 69 6e 73 74 4f 70 65 6e 28 0a 20 20 73  nt instOpen(.  s
2cd0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ce0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2cf0: 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33  zName,.  sqlite3
2d00: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20  _file *pFile,.  
2d10: 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74  int flags,.  int
2d20: 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20   *pOutFlags.){. 
2d30: 20 69 6e 73 74 5f 66 69 6c 65 20 2a 70 20 3d 20   inst_file *p = 
2d40: 28 69 6e 73 74 5f 66 69 6c 65 20 2a 29 70 46 69  (inst_file *)pFi
2d50: 6c 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  le;.  pFile->pMe
2d60: 74 68 6f 64 73 20 3d 20 26 69 6e 73 74 5f 69 6f  thods = &inst_io
2d70: 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 70 2d 3e 70  _methods;.  p->p
2d80: 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  Real = (sqlite3_
2d90: 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  file *)&p[1];.  
2da0: 70 2d 3e 70 49 6e 73 74 56 66 73 20 3d 20 28 49  p->pInstVfs = (I
2db0: 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20  nstVfs *)pVfs;. 
2dc0: 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d   p->zName = zNam
2dd0: 65 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  e;.  p->flags = 
2de0: 66 6c 61 67 73 3b 0a 0a 20 20 4f 53 5f 54 49 4d  flags;..  OS_TIM
2df0: 45 5f 56 46 53 28 4f 53 5f 4f 50 45 4e 2c 20 7a  E_VFS(OS_OPEN, z
2e00: 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 30 2c 0a  Name, flags, 0,.
2e10: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2e20: 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  n(REALVFS(pVfs),
2e30: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c   zName, p->pReal
2e40: 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
2e50: 67 73 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gs).  );.}../*.*
2e60: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
2e70: 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61  e located at zPa
2e80: 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
2e90: 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
2ea0: 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20 74  rue,.** ensure t
2eb0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6d  he file-system m
2ec0: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65  odifications are
2ed0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
2ee0: 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
2ef0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2f00: 6e 74 20 69 6e 73 74 44 65 6c 65 74 65 28 73 71  nt instDelete(sq
2f10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2f20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2f30: 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
2f40: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28  {.  OS_TIME_VFS(
2f50: 4f 53 5f 44 45 4c 45 54 45 2c 20 7a 50 61 74 68  OS_DELETE, zPath
2f60: 2c 20 64 69 72 53 79 6e 63 2c 20 30 2c 0a 20 20  , dirSync, 0,.  
2f70: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2f80: 65 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  e(REALVFS(pVfs),
2f90: 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29   zPath, dirSync)
2fa0: 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   .  );.}../*.** 
2fb0: 54 65 73 74 20 66 6f 72 20 61 63 63 65 73 73 20  Test for access 
2fc0: 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74  permissions. Ret
2fd0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2fe0: 72 65 71 75 65 73 74 65 64 20 70 65 72 6d 69 73  requested permis
2ff0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sion.** is avail
3000: 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f  able, or false o
3010: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
3020: 74 69 63 20 69 6e 74 20 69 6e 73 74 41 63 63 65  tic int instAcce
3030: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
3040: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
3050: 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
3060: 67 73 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56  gs){.  OS_TIME_V
3070: 46 53 28 4f 53 5f 41 43 43 45 53 53 2c 20 7a 50  FS(OS_ACCESS, zP
3080: 61 74 68 2c 20 66 6c 61 67 73 2c 20 30 2c 20 0a  ath, flags, 0, .
3090: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 41 63 63      sqlite3OsAcc
30a0: 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66 73  ess(REALVFS(pVfs
30b0: 29 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73 29  ), zPath, flags)
30c0: 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   .  );.}../*.** 
30d0: 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72 20  Populate buffer 
30e0: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 61 20 70  zBufOut with a p
30f0: 61 74 68 6e 61 6d 65 20 73 75 69 74 61 62 6c 65  athname suitable
3100: 20 66 6f 72 20 75 73 65 20 61 73 20 61 20 0a 2a   for use as a .*
3110: 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
3120: 2e 20 7a 42 75 66 4f 75 74 20 69 73 20 67 75 61  . zBufOut is gua
3130: 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74  ranteed to point
3140: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
3150: 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 28 49 4e  .** at least (IN
3160: 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  ST_MAX_PATHNAME+
3170: 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  1) bytes..*/.sta
3180: 74 69 63 20 69 6e 74 20 69 6e 73 74 47 65 74 54  tic int instGetT
3190: 65 6d 70 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empName(sqlite3_
31a0: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
31b0: 4f 75 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Out, char *zBufO
31c0: 75 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56  ut){.  OS_TIME_V
31d0: 46 53 28 20 4f 53 5f 47 45 54 54 45 4d 50 4e 41  FS( OS_GETTEMPNA
31e0: 4d 45 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20  ME, 0, 0, 0,.   
31f0: 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
3200: 70 6e 61 6d 65 28 52 45 41 4c 56 46 53 28 70 56  pname(REALVFS(pV
3210: 66 73 29 2c 20 6e 4f 75 74 2c 20 7a 42 75 66 4f  fs), nOut, zBufO
3220: 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ut);.  );.}../*.
3230: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66  ** Populate buff
3240: 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65  er zOut with the
3250: 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20   full canonical 
3260: 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70  pathname corresp
3270: 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  onding.** to the
3280: 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61   pathname in zPa
3290: 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72  th. zOut is guar
32a0: 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  anteed to point 
32b0: 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f  to a buffer.** o
32c0: 66 20 61 74 20 6c 65 61 73 74 20 28 49 4e 53 54  f at least (INST
32d0: 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29  _MAX_PATHNAME+1)
32e0: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
32f0: 63 20 69 6e 74 20 69 6e 73 74 46 75 6c 6c 50 61  c int instFullPa
3300: 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
3310: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
3320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
3330: 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20  h, .  int nOut, 
3340: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b  .  char *zOut.){
3350: 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20  .  OS_TIME_VFS( 
3360: 4f 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 2c  OS_FULLPATHNAME,
3370: 20 7a 50 61 74 68 2c 20 30 2c 20 30 2c 0a 20 20   zPath, 0, 0,.  
3380: 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50    sqlite3OsFullP
3390: 61 74 68 6e 61 6d 65 28 52 45 41 4c 56 46 53 28  athname(REALVFS(
33a0: 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 6e 4f  pVfs), zPath, nO
33b0: 75 74 2c 20 7a 4f 75 74 29 3b 0a 20 20 29 3b 0a  ut, zOut);.  );.
33c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
33d0: 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
33e0: 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61  y located at zPa
33f0: 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  th and return a 
3400: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
3410: 63 20 76 6f 69 64 20 2a 69 6e 73 74 44 6c 4f 70  c void *instDlOp
3420: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
3430: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
3440: 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74 75   *zPath){.  retu
3450: 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 6c 4f 70  rn sqlite3OsDlOp
3460: 65 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29  en(REALVFS(pVfs)
3470: 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  , zPath);.}../*.
3480: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
3490: 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28  buffer zErrMsg (
34a0: 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73  size nByte bytes
34b0: 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72  ) with a human r
34c0: 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38  eadable.** utf-8
34d0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
34e0: 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ng the most rece
34f0: 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  nt error encount
3500: 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20  ered associated 
3510: 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63  .** with dynamic
3520: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73   libraries..*/.s
3530: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 44  tatic void instD
3540: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
3550: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
3560: 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d  yte, char *zErrM
3570: 73 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73  sg){.  sqlite3Os
3580: 44 6c 45 72 72 6f 72 28 52 45 41 4c 56 46 53 28  DlError(REALVFS(
3590: 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45  pVfs), nByte, zE
35a0: 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrMsg);.}../*.**
35b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
35c0: 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20  r to the symbol 
35d0: 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64  zSymbol in the d
35e0: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70  ynamic library p
35f0: 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
3600: 63 20 76 6f 69 64 20 2a 69 6e 73 74 44 6c 53 79  c void *instDlSy
3610: 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
3620: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
3630: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
3640: 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75  zSymbol){.  retu
3650: 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 6c 53 79  rn sqlite3OsDlSy
3660: 6d 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  m(REALVFS(pVfs),
3670: 20 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f   pHandle, zSymbo
3680: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  l);.}../*.** Clo
3690: 73 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  se the dynamic l
36a0: 69 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48  ibrary handle pH
36b0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
36c0: 20 76 6f 69 64 20 69 6e 73 74 44 6c 43 6c 6f 73   void instDlClos
36d0: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
36e0: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
36f0: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73  le){.  sqlite3Os
3700: 44 6c 43 6c 6f 73 65 28 52 45 41 4c 56 46 53 28  DlClose(REALVFS(
3710: 70 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 29 3b  pVfs), pHandle);
3720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
3730: 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  te the buffer po
3740: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66  inted to by zBuf
3750: 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20 62  Out with nByte b
3760: 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64  ytes of .** rand
3770: 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  om data..*/.stat
3780: 69 63 20 69 6e 74 20 69 6e 73 74 52 61 6e 64 6f  ic int instRando
3790: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
37a0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
37b0: 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
37c0: 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46  t){.  OS_TIME_VF
37d0: 53 28 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53  S( OS_RANDOMNESS
37e0: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 0a 20  , 0, nByte, 0,. 
37f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64     sqlite3OsRand
3800: 6f 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70  omness(REALVFS(p
3810: 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75  Vfs), nByte, zBu
3820: 66 4f 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f  fOut);.  );.}../
3830: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
3840: 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
3850: 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
3860: 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
3870: 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
3880: 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
3890: 74 69 63 20 69 6e 74 20 69 6e 73 74 53 6c 65 65  tic int instSlee
38a0: 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
38b0: 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29  Vfs, int nMicro)
38c0: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28  {.  OS_TIME_VFS(
38d0: 20 4f 53 5f 53 4c 45 45 50 2c 20 30 2c 20 6e 4d   OS_SLEEP, 0, nM
38e0: 69 63 72 6f 2c 20 30 2c 20 0a 20 20 20 20 73 71  icro, 0, .    sq
38f0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 52 45 41  lite3OsSleep(REA
3900: 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 4d 69 63  LVFS(pVfs), nMic
3910: 72 6f 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ro) .  );.}../*.
3920: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
3930: 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20  rrent time as a 
3940: 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
3950: 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a  r in *pTimeOut..
3960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
3970: 73 74 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  stCurrentTime(sq
3980: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3990: 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75   double *pTimeOu
39a0: 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46  t){.  OS_TIME_VF
39b0: 53 28 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d  S( OS_CURRENTTIM
39c0: 45 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  E, 0, 0, 0,.    
39d0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
39e0: 54 69 6d 65 28 52 45 41 4c 56 46 53 28 70 56 66  Time(REALVFS(pVf
39f0: 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 20 0a 20  s), pTimeOut) . 
3a00: 20 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 76   );.}..sqlite3_v
3a10: 66 73 20 2a 73 71 6c 69 74 65 33 5f 69 6e 73 74  fs *sqlite3_inst
3a20: 76 66 73 5f 63 72 65 61 74 65 28 63 6f 6e 73 74  vfs_create(const
3a30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
3a40: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
3a50: 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  t){.  int nByte;
3a60: 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 3b 0a 20  .  InstVfs *p;. 
3a70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50   sqlite3_vfs *pP
3a80: 61 72 65 6e 74 3b 0a 0a 20 20 70 50 61 72 65 6e  arent;..  pParen
3a90: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  t = sqlite3_vfs_
3aa0: 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20  find(zParent);. 
3ab0: 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 29 7b   if( !pParent ){
3ac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3ad0: 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 74   }..  nByte = st
3ae0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20  rlen(zName) + 1 
3af0: 2b 20 73 69 7a 65 6f 66 28 49 6e 73 74 56 66 73  + sizeof(InstVfs
3b00: 29 3b 0a 20 20 70 20 3d 20 28 49 6e 73 74 56 66  );.  p = (InstVf
3b10: 73 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  s *)sqlite3_mall
3b20: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  oc(nByte);.  if(
3b30: 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a   p ){.    char *
3b40: 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29  zCopy = (char *)
3b50: 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  &p[1];.    memse
3b60: 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  t(p, 0, nByte);.
3b70: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 26 69      memcpy(p, &i
3b80: 6e 73 74 5f 76 66 73 2c 20 73 69 7a 65 6f 66 28  nst_vfs, sizeof(
3b90: 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20  sqlite3_vfs));. 
3ba0: 20 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 50 61     p->pVfs = pPa
3bb0: 72 65 6e 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79  rent;.    memcpy
3bc0: 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c 20 73  (zCopy, zName, s
3bd0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
3be0: 20 20 20 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65     p->base.zName
3bf0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
3c00: 29 7a 43 6f 70 79 3b 0a 20 20 20 20 70 2d 3e 62  )zCopy;.    p->b
3c10: 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 2b 3d 20  ase.szOsFile += 
3c20: 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c  pParent->szOsFil
3c30: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e;.    sqlite3_v
3c40: 66 73 5f 72 65 67 69 73 74 65 72 28 28 73 71 6c  fs_register((sql
3c50: 69 74 65 33 5f 76 66 73 20 2a 29 70 2c 20 30 29  ite3_vfs *)p, 0)
3c60: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
3c70: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70  (sqlite3_vfs *)p
3c80: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
3c90: 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67  3_instvfs_config
3ca0: 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ure(.  sqlite3_v
3cb0: 66 73 20 2a 70 56 66 73 2c 0a 20 20 76 6f 69 64  fs *pVfs,.  void
3cc0: 20 28 2a 78 43 61 6c 6c 29 28 76 6f 69 64 2a 2c   (*xCall)(void*,
3cd0: 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e   int, sqlite3_in
3ce0: 74 36 34 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  t64, const char*
3cf0: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 36 34 29  , int, int, i64)
3d00: 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  ,.  void *pClien
3d10: 74 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  t,.  void (*xDel
3d20: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 49  )(void *).){.  I
3d30: 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49 6e 73  nstVfs *p = (Ins
3d40: 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 61  tVfs *)pVfs;.  a
3d50: 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78 4f 70  ssert( pVfs->xOp
3d60: 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29 3b 0a  en==instOpen );.
3d70: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
3d80: 0a 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e  .    p->xDel(p->
3d90: 70 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pClient);.  }.  
3da0: 70 2d 3e 78 43 61 6c 6c 20 3d 20 78 43 61 6c 6c  p->xCall = xCall
3db0: 3b 0a 20 20 70 2d 3e 78 44 65 6c 20 3d 20 78 44  ;.  p->xDel = xD
3dc0: 65 6c 3b 0a 20 20 70 2d 3e 70 43 6c 69 65 6e 74  el;.  p->pClient
3dd0: 20 3d 20 70 43 6c 69 65 6e 74 3b 0a 7d 0a 0a 76   = pClient;.}..v
3de0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  oid sqlite3_inst
3df0: 76 66 73 5f 64 65 73 74 72 6f 79 28 73 71 6c 69  vfs_destroy(sqli
3e00: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29 7b 0a  te3_vfs *pVfs){.
3e10: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
3e20: 72 65 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a  register(pVfs);.
3e30: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66    sqlite3_instvf
3e40: 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 56 66 73  s_configure(pVfs
3e50: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
3e60: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 66 73 29  lite3_free(pVfs)
3e70: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
3e80: 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28  3_instvfs_reset(
3e90: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3ea0: 73 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70  s){.  InstVfs *p
3eb0: 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56   = (InstVfs *)pV
3ec0: 66 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56  fs;.  assert( pV
3ed0: 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f  fs->xOpen==instO
3ee0: 70 65 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  pen );.  memset(
3ef0: 70 2d 3e 61 54 69 6d 65 2c 20 30 2c 20 73 69 7a  p->aTime, 0, siz
3f00: 65 6f 66 28 69 36 34 29 2a 4f 53 5f 4e 55 4d 45  eof(i64)*OS_NUME
3f10: 56 45 4e 54 53 29 3b 0a 20 20 6d 65 6d 73 65 74  VENTS);.  memset
3f20: 28 70 2d 3e 61 43 6f 75 6e 74 2c 20 30 2c 20 73  (p->aCount, 0, s
3f30: 69 7a 65 6f 66 28 69 6e 74 29 2a 4f 53 5f 4e 55  izeof(int)*OS_NU
3f40: 4d 45 56 45 4e 54 53 29 3b 0a 7d 0a 0a 63 6f 6e  MEVENTS);.}..con
3f50: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
3f60: 5f 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 69 6e  _instvfs_name(in
3f70: 74 20 65 45 76 65 6e 74 29 7b 0a 20 20 63 6f 6e  t eEvent){.  con
3f80: 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 20  st char *zEvent 
3f90: 3d 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  = 0;..  switch( 
3fa0: 65 45 76 65 6e 74 20 29 7b 0a 20 20 20 20 63 61  eEvent ){.    ca
3fb0: 73 65 20 4f 53 5f 43 4c 4f 53 45 3a 20 20 20 20  se OS_CLOSE:    
3fc0: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
3fd0: 3d 20 22 78 43 6c 6f 73 65 22 3b 20 62 72 65 61  = "xClose"; brea
3fe0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 52  k;.    case OS_R
3ff0: 45 41 44 3a 20 20 20 20 20 20 20 20 20 20 20 20  EAD:            
4000: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 52 65 61    zEvent = "xRea
4010: 64 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  d"; break;.    c
4020: 61 73 65 20 4f 53 5f 57 52 49 54 45 3a 20 20 20  ase OS_WRITE:   
4030: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74            zEvent
4040: 20 3d 20 22 78 57 72 69 74 65 22 3b 20 62 72 65   = "xWrite"; bre
4050: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4060: 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 20 20  TRUNCATE:       
4070: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 54 72     zEvent = "xTr
4080: 75 6e 63 61 74 65 22 3b 20 62 72 65 61 6b 3b 0a  uncate"; break;.
4090: 20 20 20 20 63 61 73 65 20 4f 53 5f 53 59 4e 43      case OS_SYNC
40a0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
40b0: 45 76 65 6e 74 20 3d 20 22 78 53 79 6e 63 22 3b  Event = "xSync";
40c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
40d0: 20 4f 53 5f 46 49 4c 45 53 49 5a 45 3a 20 20 20   OS_FILESIZE:   
40e0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
40f0: 22 78 46 69 6c 65 73 69 7a 65 22 3b 20 62 72 65  "xFilesize"; bre
4100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4110: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20 20  LOCK:           
4120: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 4c 6f     zEvent = "xLo
4130: 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ck"; break;.    
4140: 63 61 73 65 20 4f 53 5f 55 4e 4c 4f 43 4b 3a 20  case OS_UNLOCK: 
4150: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
4160: 74 20 3d 20 22 78 55 6e 6c 6f 63 6b 22 3b 20 62  t = "xUnlock"; b
4170: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
4180: 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  S_CHECKRESERVEDL
4190: 4f 43 4b 3a 20 7a 45 76 65 6e 74 20 3d 20 22 78  OCK: zEvent = "x
41a0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
41b0: 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  k"; break;.    c
41c0: 61 73 65 20 4f 53 5f 46 49 4c 45 43 4f 4e 54 52  ase OS_FILECONTR
41d0: 4f 4c 3a 20 20 20 20 20 20 20 7a 45 76 65 6e 74  OL:       zEvent
41e0: 20 3d 20 22 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   = "xFileControl
41f0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4200: 73 65 20 4f 53 5f 53 45 43 54 4f 52 53 49 5a 45  se OS_SECTORSIZE
4210: 3a 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20  :        zEvent 
4220: 3d 20 22 78 53 65 63 74 6f 72 53 69 7a 65 22 3b  = "xSectorSize";
4230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4240: 20 4f 53 5f 44 45 56 43 48 41 52 3a 20 20 20 20   OS_DEVCHAR:    
4250: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
4260: 22 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  "xDeviceCharacte
4270: 72 69 73 74 69 63 73 22 3b 20 62 72 65 61 6b 3b  ristics"; break;
4280: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 4f 50 45  .    case OS_OPE
4290: 4e 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N:              
42a0: 7a 45 76 65 6e 74 20 3d 20 22 78 4f 70 65 6e 22  zEvent = "xOpen"
42b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
42c0: 65 20 4f 53 5f 44 45 4c 45 54 45 3a 20 20 20 20  e OS_DELETE:    
42d0: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
42e0: 20 22 78 44 65 6c 65 74 65 22 3b 20 62 72 65 61   "xDelete"; brea
42f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 41  k;.    case OS_A
4300: 43 43 45 53 53 3a 20 20 20 20 20 20 20 20 20 20  CCESS:          
4310: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 41 63 63    zEvent = "xAcc
4320: 65 73 73 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ess"; break;.   
4330: 20 63 61 73 65 20 4f 53 5f 47 45 54 54 45 4d 50   case OS_GETTEMP
4340: 4e 41 4d 45 3a 20 20 20 20 20 20 20 7a 45 76 65  NAME:       zEve
4350: 6e 74 20 3d 20 22 78 47 65 74 54 65 6d 70 4e 61  nt = "xGetTempNa
4360: 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  me"; break;.    
4370: 63 61 73 65 20 4f 53 5f 46 55 4c 4c 50 41 54 48  case OS_FULLPATH
4380: 4e 41 4d 45 3a 20 20 20 20 20 20 7a 45 76 65 6e  NAME:      zEven
4390: 74 20 3d 20 22 78 46 75 6c 6c 50 61 74 68 6e 61  t = "xFullPathna
43a0: 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  me"; break;.    
43b0: 63 61 73 65 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45  case OS_RANDOMNE
43c0: 53 53 3a 20 20 20 20 20 20 20 20 7a 45 76 65 6e  SS:        zEven
43d0: 74 20 3d 20 22 78 52 61 6e 64 6f 6d 6e 65 73 73  t = "xRandomness
43e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
43f0: 73 65 20 4f 53 5f 53 4c 45 45 50 3a 20 20 20 20  se OS_SLEEP:    
4400: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
4410: 3d 20 22 78 53 6c 65 65 70 22 3b 20 62 72 65 61  = "xSleep"; brea
4420: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43  k;.    case OS_C
4430: 55 52 52 45 4e 54 54 49 4d 45 3a 20 20 20 20 20  URRENTTIME:     
4440: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 75 72    zEvent = "xCur
4450: 72 65 6e 74 54 69 6d 65 22 3b 20 62 72 65 61 6b  rentTime"; break
4460: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4470: 7a 45 76 65 6e 74 3b 0a 7d 0a 0a 76 6f 69 64 20  zEvent;.}..void 
4480: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
4490: 67 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  get(.  sqlite3_v
44a0: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 69 6e 74  fs *pVfs, .  int
44b0: 20 65 45 76 65 6e 74 2c 20 0a 20 20 63 6f 6e 73   eEvent, .  cons
44c0: 74 20 63 68 61 72 20 2a 2a 70 7a 45 76 65 6e 74  t char **pzEvent
44d0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  , .  sqlite3_int
44e0: 36 34 20 2a 70 6e 43 6c 69 63 6b 2c 20 0a 20 20  64 *pnClick, .  
44f0: 69 6e 74 20 2a 70 6e 43 61 6c 6c 0a 29 7b 0a 20  int *pnCall.){. 
4500: 20 49 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49   InstVfs *p = (I
4510: 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20  nstVfs *)pVfs;. 
4520: 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78   assert( pVfs->x
4530: 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29  Open==instOpen )
4540: 3b 0a 20 20 69 66 28 20 65 45 76 65 6e 74 3c 31  ;.  if( eEvent<1
4550: 20 7c 7c 20 65 45 76 65 6e 74 3e 3d 4f 53 5f 4e   || eEvent>=OS_N
4560: 55 4d 45 56 45 4e 54 53 20 29 7b 0a 20 20 20 20  UMEVENTS ){.    
4570: 2a 70 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20  *pzEvent = 0;.  
4580: 20 20 2a 70 6e 43 6c 69 63 6b 20 3d 20 30 3b 0a    *pnClick = 0;.
4590: 20 20 20 20 2a 70 6e 43 61 6c 6c 20 3d 20 30 3b      *pnCall = 0;
45a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
45b0: 0a 0a 20 20 2a 70 7a 45 76 65 6e 74 20 3d 20 73  ..  *pzEvent = s
45c0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 6e  qlite3_instvfs_n
45d0: 61 6d 65 28 65 45 76 65 6e 74 29 3b 0a 20 20 2a  ame(eEvent);.  *
45e0: 70 6e 43 6c 69 63 6b 20 3d 20 70 2d 3e 61 54 69  pnClick = p->aTi
45f0: 6d 65 5b 65 45 76 65 6e 74 5d 3b 0a 20 20 2a 70  me[eEvent];.  *p
4600: 6e 43 61 6c 6c 20 3d 20 70 2d 3e 61 43 6f 75 6e  nCall = p->aCoun
4610: 74 5b 65 45 76 65 6e 74 5d 3b 0a 7d 0a 0a 23 64  t[eEvent];.}..#d
4620: 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47 5f  efine BINARYLOG_
4630: 42 55 46 46 45 52 53 49 5a 45 20 31 30 32 34 0a  BUFFERSIZE 1024.
4640: 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 42  .struct InstVfsB
4650: 69 6e 61 72 79 4c 6f 67 20 7b 0a 20 20 69 6e 74  inaryLog {.  int
4660: 20 6e 42 75 66 3b 0a 20 20 63 68 61 72 20 2a 7a   nBuf;.  char *z
4670: 42 75 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  Buf;.  sqlite3_i
4680: 6e 74 36 34 20 69 4f 66 66 73 65 74 3b 0a 20 20  nt64 iOffset;.  
4690: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4f  sqlite3_file *pO
46a0: 75 74 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  ut;.};.typedef s
46b0: 74 72 75 63 74 20 49 6e 73 74 56 66 73 42 69 6e  truct InstVfsBin
46c0: 61 72 79 4c 6f 67 20 49 6e 73 74 56 66 73 42 69  aryLog InstVfsBi
46d0: 6e 61 72 79 4c 6f 67 3b 0a 0a 73 74 61 74 69 63  naryLog;..static
46e0: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
46f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4700: 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d  , u32 v){.  p[0]
4710: 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d   = v>>24;.  p[1]
4720: 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d   = v>>16;.  p[2]
4730: 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20   = v>>8;.  p[3] 
4740: 3d 20 76 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = v;.}..static v
4750: 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f 78 63  oid binarylog_xc
4760: 61 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  all(.  void *p,.
4770: 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 0a 20 20    int eEvent,.  
4780: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 43  sqlite3_int64 nC
4790: 6c 69 63 6b 2c 0a 20 20 63 6f 6e 73 74 20 63 68  lick,.  const ch
47a0: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
47b0: 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 6e 42   flags,.  int nB
47c0: 79 74 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  yte,.  sqlite3_i
47d0: 6e 74 36 34 20 69 4f 66 66 73 65 74 0a 29 7b 0a  nt64 iOffset.){.
47e0: 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c    InstVfsBinaryL
47f0: 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74  og *pLog = (Inst
4800: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70  VfsBinaryLog *)p
4810: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
4820: 72 20 2a 7a 52 65 63 3b 0a 20 20 69 66 28 20 28  r *zRec;.  if( (
4830: 32 30 2b 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e 42  20+pLog->nBuf)>B
4840: 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53  INARYLOG_BUFFERS
4850: 49 5a 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  IZE ){.    sqlit
4860: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
4870: 20 70 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 20 20 20   pLog->pOut;.   
4880: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
4890: 2d 3e 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20  ->xWrite(pFile, 
48a0: 70 4c 6f 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67  pLog->zBuf, pLog
48b0: 2d 3e 6e 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f  ->nBuf, pLog->iO
48c0: 66 66 73 65 74 29 3b 0a 20 20 20 20 70 4c 6f 67  ffset);.    pLog
48d0: 2d 3e 69 4f 66 66 73 65 74 20 2b 3d 20 70 4c 6f  ->iOffset += pLo
48e0: 67 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70 4c 6f  g->nBuf;.    pLo
48f0: 67 2d 3e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 7d  g->nBuf = 0;.  }
4900: 0a 20 20 7a 52 65 63 20 3d 20 28 75 6e 73 69 67  .  zRec = (unsig
4910: 6e 65 64 20 63 68 61 72 20 2a 29 26 70 4c 6f 67  ned char *)&pLog
4920: 2d 3e 7a 42 75 66 5b 70 4c 6f 67 2d 3e 6e 42 75  ->zBuf[pLog->nBu
4930: 66 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  f];.  put32bits(
4940: 26 7a 52 65 63 5b 30 5d 2c 20 65 45 76 65 6e 74  &zRec[0], eEvent
4950: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
4960: 7a 52 65 63 5b 34 5d 2c 20 28 69 6e 74 29 6e 43  zRec[4], (int)nC
4970: 6c 69 63 6b 29 3b 0a 20 20 70 75 74 33 32 62 69  lick);.  put32bi
4980: 74 73 28 26 7a 52 65 63 5b 38 5d 2c 20 66 6c 61  ts(&zRec[8], fla
4990: 67 73 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  gs);.  put32bits
49a0: 28 26 7a 52 65 63 5b 31 32 5d 2c 20 6e 42 79 74  (&zRec[12], nByt
49b0: 65 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  e);.  put32bits(
49c0: 26 7a 52 65 63 5b 31 36 5d 2c 20 28 69 6e 74 29  &zRec[16], (int)
49d0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 70 4c 6f 67  iOffset);.  pLog
49e0: 2d 3e 6e 42 75 66 20 2b 3d 20 32 30 3b 0a 7d 0a  ->nBuf += 20;.}.
49f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e  .static void bin
4a00: 61 72 79 6c 6f 67 5f 78 64 65 6c 28 76 6f 69 64  arylog_xdel(void
4a10: 20 2a 70 29 7b 0a 20 20 2f 2a 20 43 6c 6f 73 65   *p){.  /* Close
4a20: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 61 6e   the log file an
4a30: 64 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72  d free the memor
4a40: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
4a50: 74 68 65 20 0a 20 20 2a 2a 20 49 6e 73 74 56 66  the .  ** InstVf
4a60: 73 42 69 6e 61 72 79 4c 6f 67 20 73 74 72 75 63  sBinaryLog struc
4a70: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 49 6e 73  ture..  */.  Ins
4a80: 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70  tVfsBinaryLog *p
4a90: 4c 6f 67 20 3d 20 28 49 6e 73 74 56 66 73 42 69  Log = (InstVfsBi
4aa0: 6e 61 72 79 4c 6f 67 20 2a 29 70 3b 0a 20 20 73  naryLog *)p;.  s
4ab0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
4ac0: 6c 65 20 3d 20 70 4c 6f 67 2d 3e 70 4f 75 74 3b  le = pLog->pOut;
4ad0: 0a 20 20 69 66 28 20 70 4c 6f 67 2d 3e 6e 42 75  .  if( pLog->nBu
4ae0: 66 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  f ){.    pFile->
4af0: 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65  pMethods->xWrite
4b00: 28 70 46 69 6c 65 2c 20 70 4c 6f 67 2d 3e 7a 42  (pFile, pLog->zB
4b10: 75 66 2c 20 70 4c 6f 67 2d 3e 6e 42 75 66 2c 20  uf, pLog->nBuf, 
4b20: 70 4c 6f 67 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  pLog->iOffset);.
4b30: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65    }.  pFile->pMe
4b40: 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 46  thods->xClose(pF
4b50: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
4b60: 66 72 65 65 28 70 4c 6f 67 2d 3e 7a 42 75 66 29  free(pLog->zBuf)
4b70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4b80: 28 70 4c 6f 67 29 3b 0a 7d 0a 0a 73 71 6c 69 74  (pLog);.}..sqlit
4b90: 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 5f  e3_vfs *sqlite3_
4ba0: 69 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f  instvfs_binarylo
4bb0: 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g(.  const char 
4bc0: 2a 7a 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *zVfs,.  const c
4bd0: 68 61 72 20 2a 7a 50 61 72 65 6e 74 56 66 73 2c  har *zParentVfs,
4be0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4bf0: 7a 4c 6f 67 0a 29 7b 0a 20 20 49 6e 73 74 56 66  zLog.){.  InstVf
4c00: 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 3b 0a 20  sBinaryLog *p;. 
4c10: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
4c20: 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  fs;.  sqlite3_vf
4c30: 73 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 69 6e  s *pParent;.  in
4c40: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 66  t nByte;.  int f
4c50: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lags;.  int rc;.
4c60: 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c  .  pParent = sql
4c70: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50  ite3_vfs_find(zP
4c80: 61 72 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28  arentVfs);.  if(
4c90: 20 21 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20   !pParent ){.   
4ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
4cb0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
4cc0: 28 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f  (InstVfsBinaryLo
4cd0: 67 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73 7a  g) + pParent->sz
4ce0: 4f 73 46 69 6c 65 3b 0a 0a 20 20 70 20 3d 20 28  OsFile;..  p = (
4cf0: 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67  InstVfsBinaryLog
4d00: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
4d10: 63 28 6e 42 79 74 65 29 3b 0a 20 20 6d 65 6d 73  c(nByte);.  mems
4d20: 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b  et(p, 0, nByte);
4d30: 0a 20 20 70 2d 3e 7a 42 75 66 20 3d 20 73 71 6c  .  p->zBuf = sql
4d40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 42 49 4e 41  ite3_malloc(BINA
4d50: 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45  RYLOG_BUFFERSIZE
4d60: 29 3b 0a 20 20 70 2d 3e 70 4f 75 74 20 3d 20 28  );.  p->pOut = (
4d70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
4d80: 70 5b 31 5d 3b 0a 0a 20 20 66 6c 61 67 73 20 3d  p[1];..  flags =
4d90: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
4da0: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
4db0: 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
4dc0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
4dd0: 52 4e 41 4c 3b 0a 20 20 72 63 20 3d 20 70 50 61  RNAL;.  rc = pPa
4de0: 72 65 6e 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72  rent->xOpen(pPar
4df0: 65 6e 74 2c 20 7a 4c 6f 67 2c 20 70 2d 3e 70 4f  ent, zLog, p->pO
4e00: 75 74 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67  ut, flags, &flag
4e10: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
4e20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
4e30: 63 20 3d 20 70 2d 3e 70 4f 75 74 2d 3e 70 4d 65  c = p->pOut->pMe
4e40: 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d  thods->xWrite(p-
4e50: 3e 70 4f 75 74 2c 20 22 73 71 6c 69 74 65 5f 6f  >pOut, "sqlite_o
4e60: 73 74 72 61 63 65 31 2e 2e 2e 2e 2e 22 2c 20 32  strace1.....", 2
4e70: 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  0, 0);.    p->iO
4e80: 66 66 73 65 74 20 3d 20 32 30 3b 0a 20 20 7d 0a  ffset = 20;.  }.
4e90: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
4ea0: 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28 70  binarylog_xdel(p
4eb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
4ec0: 0a 20 20 7d 0a 0a 20 20 70 56 66 73 20 3d 20 73  .  }..  pVfs = s
4ed0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63  qlite3_instvfs_c
4ee0: 72 65 61 74 65 28 7a 56 66 73 2c 20 7a 50 61 72  reate(zVfs, zPar
4ef0: 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20 70  entVfs);.  if( p
4f00: 56 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Vfs ){.    sqlit
4f10: 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69  e3_instvfs_confi
4f20: 67 75 72 65 28 70 56 66 73 2c 20 62 69 6e 61 72  gure(pVfs, binar
4f30: 79 6c 6f 67 5f 78 63 61 6c 6c 2c 20 70 2c 20 62  ylog_xcall, p, b
4f40: 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 29 3b 0a  inarylog_xdel);.
4f50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 56    }..  return pV
4f60: 66 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  fs;.}../********
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fb0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5000: 2a 20 54 63 6c 20 69 6e 74 65 72 66 61 63 65 20  * Tcl interface 
5010: 73 74 61 72 74 73 20 68 65 72 65 2e 0a 2a 2f 0a  starts here..*/.
5020: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
5030: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
5040: 3e 0a 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66  >..struct InstVf
5050: 73 43 61 6c 6c 20 7b 0a 20 20 54 63 6c 5f 49 6e  sCall {.  Tcl_In
5060: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
5070: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
5080: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
5090: 75 63 74 20 49 6e 73 74 56 66 73 43 61 6c 6c 20  uct InstVfsCall 
50a0: 49 6e 73 74 56 66 73 43 61 6c 6c 3b 0a 0a 73 74  InstVfsCall;..st
50b0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 69  atic void test_i
50c0: 6e 73 74 76 66 73 5f 78 63 61 6c 6c 28 0a 20 20  nstvfs_xcall(.  
50d0: 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 65  void *p,.  int e
50e0: 45 76 65 6e 74 2c 0a 20 20 73 71 6c 69 74 65 33  Event,.  sqlite3
50f0: 5f 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20  _int64 nClick,. 
5100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5110: 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  me,.  int flags,
5120: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a 20 20  .  int nByte,.  
5130: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
5140: 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 72  ffset.){.  int r
5150: 63 3b 0a 20 20 49 6e 73 74 56 66 73 43 61 6c 6c  c;.  InstVfsCall
5160: 20 2a 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56   *pCall = (InstV
5170: 66 73 43 61 6c 6c 20 2a 29 70 3b 0a 20 20 54 63  fsCall *)p;.  Tc
5180: 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20 54 63  l_Obj *pObj = Tc
5190: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 20  l_DuplicateObj( 
51a0: 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b  pCall->pScript);
51b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
51c0: 45 76 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  Event = sqlite3_
51d0: 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65 45 76  instvfs_name(eEv
51e0: 65 6e 74 29 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63  ent);..  Tcl_Inc
51f0: 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a 29 3b  rRefCount(pObj);
5200: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5220: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Obj, Tcl_NewStri
5230: 6e 67 4f 62 6a 28 7a 45 76 65 6e 74 2c 20 2d 31  ngObj(zEvent, -1
5240: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5250: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5260: 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57  , pObj, Tcl_NewW
5270: 69 64 65 49 6e 74 4f 62 6a 28 6e 43 6c 69 63 6b  ideIntObj(nClick
5280: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
52a0: 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  , pObj, Tcl_NewS
52b0: 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20  tringObj(zName, 
52c0: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
52d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
52e0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65  (0, pObj, Tcl_Ne
52f0: 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b  wIntObj(nByte));
5300: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5310: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5320: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Obj, Tcl_NewWide
5330: 49 6e 74 4f 62 6a 28 69 4f 66 66 73 65 74 29 29  IntObj(iOffset))
5340: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  ;..  rc = Tcl_Ev
5350: 61 6c 4f 62 6a 45 78 28 70 43 61 6c 6c 2d 3e 69  alObjEx(pCall->i
5360: 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54 43 4c  nterp, pObj, TCL
5370: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c  _EVAL_GLOBAL|TCL
5380: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5390: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
53a0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
53b0: 6f 72 28 70 43 61 6c 6c 2d 3e 69 6e 74 65 72 70  or(pCall->interp
53c0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63  );.  }.  Tcl_Dec
53d0: 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a 29 3b  rRefCount(pObj);
53e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
53f0: 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 64 65  test_instvfs_xde
5400: 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 49 6e  l(void *p){.  In
5410: 73 74 56 66 73 43 61 6c 6c 20 2a 70 43 61 6c 6c  stVfsCall *pCall
5420: 20 3d 20 28 49 6e 73 74 56 66 73 43 61 6c 6c 20   = (InstVfsCall 
5430: 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  *)p;.  Tcl_DecrR
5440: 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d 3e 70  efCount(pCall->p
5450: 53 63 72 69 70 74 29 3b 0a 20 20 73 71 6c 69 74  Script);.  sqlit
5460: 65 33 5f 66 72 65 65 28 70 43 61 6c 6c 29 3b 0a  e3_free(pCall);.
5470: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
5480: 73 74 5f 73 71 6c 69 74 65 33 5f 69 6e 73 74 76  st_sqlite3_instv
5490: 66 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  fs(.  void * cli
54a0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
54b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
54c0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
54d0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
54e0: 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  [].){.  static c
54f0: 6f 6e 73 74 20 63 68 61 72 20 2a 49 56 5f 73 74  onst char *IV_st
5500: 72 73 5b 5d 20 3d 20 0a 20 20 20 20 20 20 20 20  rs[] = .        
5510: 20 20 20 20 20 20 20 7b 20 22 63 72 65 61 74 65         { "create
5520: 22 2c 20 20 22 64 65 73 74 72 6f 79 22 2c 20 20  ",  "destroy",  
5530: 22 72 65 73 65 74 22 2c 20 20 22 72 65 70 6f 72  "reset",  "repor
5540: 74 22 2c 20 22 63 6f 6e 66 69 67 75 72 65 22 2c  t", "configure",
5550: 20 22 62 69 6e 61 72 79 6c 6f 67 22 2c 20 30 20   "binarylog", 0 
5560: 7d 3b 0a 20 20 65 6e 75 6d 20 49 56 5f 65 6e 75  };.  enum IV_enu
5570: 6d 20 7b 20 49 56 5f 43 52 45 41 54 45 2c 20 49  m { IV_CREATE, I
5580: 56 5f 44 45 53 54 52 4f 59 2c 20 49 56 5f 52 45  V_DESTROY, IV_RE
5590: 53 45 54 2c 20 49 56 5f 52 45 50 4f 52 54 2c 20  SET, IV_REPORT, 
55a0: 49 56 5f 43 4f 4e 46 49 47 55 52 45 2c 20 49 56  IV_CONFIGURE, IV
55b0: 5f 42 49 4e 41 52 59 4c 4f 47 20 7d 3b 0a 20 20  _BINARYLOG };.  
55c0: 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20 69 66 28  int iSub;..  if(
55d0: 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
55e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
55f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
5600: 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 2e 2e   "SUB-COMMAND ..
5610: 2e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  .");.  }.  if( T
5620: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
5630: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
5640: 31 5d 2c 20 49 56 5f 73 74 72 73 2c 20 22 73 75  1], IV_strs, "su
5650: 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26  b-command", 0, &
5660: 69 53 75 62 29 20 29 7b 0a 20 20 20 20 72 65 74  iSub) ){.    ret
5670: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5680: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
5690: 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75 62  num IV_enum)iSub
56a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 56 5f   ){.    case IV_
56b0: 43 52 45 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  CREATE: {.      
56c0: 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20  char *zParent = 
56d0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
56e0: 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69  _vfs *p;.      i
56f0: 6e 74 20 69 73 44 65 66 61 75 6c 74 20 3d 20 30  nt isDefault = 0
5700: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
5710: 3e 32 20 26 26 20 30 3d 3d 73 74 72 63 6d 70 28  >2 && 0==strcmp(
5720: 22 2d 64 65 66 61 75 6c 74 22 2c 20 54 63 6c 5f  "-default", Tcl_
5730: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
5740: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ])) ){.        i
5750: 73 44 65 66 61 75 6c 74 20 3d 20 31 3b 0a 20 20  sDefault = 1;.  
5760: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5770: 28 6f 62 6a 63 2d 69 73 44 65 66 61 75 6c 74 29  (objc-isDefault)
5780: 21 3d 34 20 26 26 20 28 6f 62 6a 63 2d 69 73 44  !=4 && (objc-isD
5790: 65 66 61 75 6c 74 29 21 3d 33 20 29 7b 0a 20 20  efault)!=3 ){.  
57a0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
57b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
57c0: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61 75  , objv, "?-defau
57d0: 6c 74 3f 20 4e 41 4d 45 20 3f 50 41 52 45 4e 54  lt? NAME ?PARENT
57e0: 2d 56 46 53 3f 22 29 3b 0a 20 20 20 20 20 20 20  -VFS?");.       
57f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5800: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
5810: 20 69 66 28 20 6f 62 6a 63 3d 3d 28 34 2b 69 73   if( objc==(4+is
5820: 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
5830: 20 20 20 20 7a 50 61 72 65 6e 74 20 3d 20 54 63      zParent = Tc
5840: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
5850: 5b 33 2b 69 73 44 65 66 61 75 6c 74 5d 29 3b 0a  [3+isDefault]);.
5860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20        }.      p 
5870: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66  = sqlite3_instvf
5880: 73 5f 63 72 65 61 74 65 28 54 63 6c 5f 47 65 74  s_create(Tcl_Get
5890: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 2b 69 73  String(objv[2+is
58a0: 44 65 66 61 75 6c 74 5d 29 2c 20 7a 50 61 72 65  Default]), zPare
58b0: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  nt);.      if( !
58c0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  p ){.        Tcl
58d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
58e0: 74 65 72 70 2c 20 22 65 72 72 6f 72 20 63 72 65  terp, "error cre
58f0: 61 74 69 6e 67 20 76 66 73 20 22 2c 20 30 29 3b  ating vfs ", 0);
5900: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
5920: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 44   }.      if( isD
5930: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
5940: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
5950: 67 69 73 74 65 72 28 70 2c 20 31 29 3b 0a 20 20  gister(p, 1);.  
5960: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
5970: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
5980: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 29 3b 0a 20  erp, objv[2]);. 
5990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
59a0: 7d 0a 20 20 20 20 63 61 73 65 20 49 56 5f 42 49  }.    case IV_BI
59b0: 4e 41 52 59 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  NARYLOG: {.     
59c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
59d0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c  ;.      char *zL
59e0: 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  og = 0;.      sq
59f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20  lite3_vfs *p;.  
5a00: 20 20 20 20 69 6e 74 20 69 73 44 65 66 61 75 6c      int isDefaul
5a10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
5a20: 20 6f 62 6a 63 3e 32 20 26 26 20 30 3d 3d 73 74   objc>2 && 0==st
5a30: 72 63 6d 70 28 22 2d 64 65 66 61 75 6c 74 22 2c  rcmp("-default",
5a40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
5a50: 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
5a60: 20 20 20 20 69 73 44 65 66 61 75 6c 74 20 3d 20      isDefault = 
5a70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5a80: 20 69 66 28 20 28 6f 62 6a 63 2d 69 73 44 65 66   if( (objc-isDef
5a90: 61 75 6c 74 29 21 3d 34 20 29 7b 0a 20 20 20 20  ault)!=4 ){.    
5aa0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
5ab0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
5ac0: 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61 75 6c 74  objv, "?-default
5ad0: 3f 20 4e 41 4d 45 20 4c 4f 47 46 49 4c 45 22 29  ? NAME LOGFILE")
5ae0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
5af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5b00: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20    }.      zName 
5b10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
5b20: 6f 62 6a 76 5b 32 2b 69 73 44 65 66 61 75 6c 74  objv[2+isDefault
5b30: 5d 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 20 3d  ]);.      zLog =
5b40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
5b50: 62 6a 76 5b 33 2b 69 73 44 65 66 61 75 6c 74 5d  bjv[3+isDefault]
5b60: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c  );.      p = sql
5b70: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e  ite3_instvfs_bin
5b80: 61 72 79 6c 6f 67 28 7a 4e 61 6d 65 2c 20 30 2c  arylog(zName, 0,
5b90: 20 7a 4c 6f 67 29 3b 0a 20 20 20 20 20 20 69 66   zLog);.      if
5ba0: 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !p ){.        
5bb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5bc0: 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 20  (interp, "error 
5bd0: 63 72 65 61 74 69 6e 67 20 76 66 73 20 22 2c 20  creating vfs ", 
5be0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
5bf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5c10: 69 73 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  isDefault ){.   
5c20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
5c30: 5f 72 65 67 69 73 74 65 72 28 70 2c 20 31 29 3b  _register(p, 1);
5c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
5c50: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
5c60: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 29  interp, objv[2])
5c70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5c80: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 49     }..    case I
5c90: 56 5f 43 4f 4e 46 49 47 55 52 45 3a 20 7b 0a 20  V_CONFIGURE: {. 
5ca0: 20 20 20 20 20 49 6e 73 74 56 66 73 43 61 6c 6c       InstVfsCall
5cb0: 20 2a 70 43 61 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pCall;..      
5cc0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a  sqlite3_vfs *p;.
5cd0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
5ce0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
5cf0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5d00: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5d10: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
5d20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
5d30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
5d40: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
5d50: 65 33 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c 5f  e3_vfs_find(Tcl_
5d60: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
5d70: 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ]));.      if( !
5d80: 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d 69  p || p->xOpen!=i
5d90: 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nstOpen ){.     
5da0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5db0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
5dc0: 73 75 63 68 20 76 66 73 3a 20 22 2c 20 54 63 6c  such vfs: ", Tcl
5dd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
5de0: 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  2]), 0);.       
5df0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5e00: 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  R;.      }..    
5e10: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 54 63 6c    if( strlen(Tcl
5e20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
5e30: 33 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  3])) ){.        
5e40: 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73  pCall = (InstVfs
5e50: 43 61 6c 6c 20 2a 29 73 71 6c 69 74 65 33 5f 6d  Call *)sqlite3_m
5e60: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 73  alloc(sizeof(Ins
5e70: 74 56 66 73 43 61 6c 6c 29 29 3b 0a 20 20 20 20  tVfsCall));.    
5e80: 20 20 20 20 70 43 61 6c 6c 2d 3e 69 6e 74 65 72      pCall->inter
5e90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
5ea0: 20 20 20 20 70 43 61 6c 6c 2d 3e 70 53 63 72 69      pCall->pScri
5eb0: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
5ec0: 74 65 4f 62 6a 28 6f 62 6a 76 5b 33 5d 29 3b 0a  teObj(objv[3]);.
5ed0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
5ee0: 52 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d 3e  RefCount(pCall->
5ef0: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20  pScript);.      
5f00: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66    sqlite3_instvf
5f10: 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 2c 20 0a  s_configure(p, .
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
5f30: 5f 69 6e 73 74 76 66 73 5f 78 63 61 6c 6c 2c 20  _instvfs_xcall, 
5f40: 28 76 6f 69 64 20 2a 29 70 43 61 6c 6c 2c 20 74  (void *)pCall, t
5f50: 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 64 65 6c  est_instvfs_xdel
5f60: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
5f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5f80: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
5f90: 5f 63 6f 6e 66 69 67 75 72 65 28 70 2c 20 30 2c  _configure(p, 0,
5fa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
5fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5fc0: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 49 56 5f   }..    case IV_
5fd0: 52 45 50 4f 52 54 3a 0a 20 20 20 20 63 61 73 65  REPORT:.    case
5fe0: 20 49 56 5f 44 45 53 54 52 4f 59 3a 0a 20 20 20   IV_DESTROY:.   
5ff0: 20 63 61 73 65 20 49 56 5f 52 45 53 45 54 3a 20   case IV_RESET: 
6000: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6010: 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 66  vfs *p;.      if
6020: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
6030: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
6040: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
6050: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 22 29 3b 0a   objv, "NAME");.
6060: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
6070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
6080: 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  }.      p = sqli
6090: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c  te3_vfs_find(Tcl
60a0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
60b0: 32 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  2]));.      if( 
60c0: 21 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d  !p || p->xOpen!=
60d0: 69 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  instOpen ){.    
60e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
60f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
6100: 20 73 75 63 68 20 76 66 73 3a 20 22 2c 20 54 63   such vfs: ", Tc
6110: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
6120: 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  [2]), 0);.      
6130: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6140: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  OR;.      }..   
6150: 20 20 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56     if( ((enum IV
6160: 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f  _enum)iSub)==IV_
6170: 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20 20 20  DESTROY ){.     
6180: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76     sqlite3_instv
6190: 66 73 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20  fs_destroy(p);. 
61a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
61b0: 20 28 28 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 29   ((enum IV_enum)
61c0: 69 53 75 62 29 3d 3d 49 56 5f 52 45 53 45 54 20  iSub)==IV_RESET 
61d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
61e0: 65 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74  e3_instvfs_reset
61f0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
6200: 20 20 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56     if( ((enum IV
6210: 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f  _enum)iSub)==IV_
6220: 52 45 50 4f 52 54 20 29 7b 0a 20 20 20 20 20 20  REPORT ){.      
6230: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
6240: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
6250: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
6260: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
6270: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 68  har *zName = (ch
6280: 61 72 20 2a 29 31 3b 0a 20 20 20 20 20 20 20 20  ar *)1;.        
6290: 69 36 34 20 6e 43 6c 69 63 6b 3b 0a 20 20 20 20  i64 nClick;.    
62a0: 20 20 20 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20      int nCall;. 
62b0: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b         for(ii=1;
62c0: 20 7a 4e 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a 20   zName; ii++){. 
62d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
62e0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 70 2c 20  _instvfs_get(p, 
62f0: 69 69 2c 20 26 7a 4e 61 6d 65 2c 20 26 6e 43 6c  ii, &zName, &nCl
6300: 69 63 6b 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20 20  ick, &nCall);.  
6310: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
6320: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
6330: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20   Tcl_Obj *pElem 
6340: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
6350: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
6360: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6370: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54  ment(0, pElem, T
6380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6390: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20  zName, -1));.   
63a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
63b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
63c0: 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f  t(0, pElem, Tcl_
63d0: 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c 29  NewIntObj(nCall)
63e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
63f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6400: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d  Element(0, pElem
6410: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
6420: 4f 62 6a 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20  Obj(nClick));.  
6430: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
6440: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6450: 6e 74 28 30 2c 20 70 52 65 74 2c 20 70 45 6c 65  nt(0, pRet, pEle
6460: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  m);.          }.
6470: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
6480: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
6490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
64a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
64b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
64c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
64d0: 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69  _OK;.}..int Sqli
64e0: 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
64f0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
6500: 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65  terp){.  Tcl_Cre
6510: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
6520: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 69  terp, "sqlite3_i
6530: 6e 73 74 76 66 73 22 2c 20 74 65 73 74 5f 73 71  nstvfs", test_sq
6540: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 2c 20 30  lite3_instvfs, 0
6550: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
6560: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  CL_OK;.}..#endif
6570: 0a                                               .