/ Hex Artifact Content
Login

Artifact 867f1317bd135f942a63eab5a78da40fc70d1493:


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 2a 0a 2a  umentation..**.*
0240: 2a 20 24 49 64 3a 20 74 65 73 74 5f 6f 73 69 6e  * $Id: test_osin
0250: 73 74 2e 63 2c 76 20 31 2e 31 36 20 32 30 30 38  st.c,v 1.16 2008
0260: 2f 30 36 2f 31 32 20 31 32 3a 34 30 3a 31 34 20  /06/12 12:40:14 
0270: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 0a 2f 2a  drh Exp $.*/../*
0280: 0a 2a 2a 20 43 20 69 6e 74 65 72 66 61 63 65 3a  .** C interface:
0290: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  .**.**   sqlite3
02a0: 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65 28  _instvfs_create(
02b0: 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69  ).**   sqlite3_i
02c0: 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79 28 29  nstvfs_destroy()
02d0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  .**   sqlite3_in
02e0: 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28  stvfs_configure(
02f0: 29 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ).**.**   sqlite
0300: 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28  3_instvfs_reset(
0310: 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69  ).**   sqlite3_i
0320: 6e 73 74 76 66 73 5f 67 65 74 28 29 0a 2a 2a 0a  nstvfs_get().**.
0330: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73  **   sqlite3_ins
0340: 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 0a 2a  tvfs_binarylog.*
0350: 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  *   sqlite3_inst
0360: 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 5f 6d 61  vfs_binarylog_ma
0370: 72 6b 65 72 0a 2a 2a 0a 2a 2a 20 54 63 6c 20 69  rker.**.** Tcl i
0380: 6e 74 65 72 66 61 63 65 20 28 6f 6d 69 74 74 65  nterface (omitte
0390: 64 20 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  d if SQLITE_TEST
03a0: 20 69 73 20 6e 6f 74 20 73 65 74 29 3a 0a 2a 2a   is not set):.**
03b0: 20 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69   .**   sqlite3_i
03c0: 6e 73 74 76 66 73 20 63 72 65 61 74 65 20 4e 41  nstvfs create NA
03d0: 4d 45 20 3f 50 41 52 45 4e 54 3f 0a 2a 2a 0a 2a  ME ?PARENT?.**.*
03e0: 2a 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61  *       Create a
03f0: 6e 64 20 72 65 67 69 73 74 65 72 20 6e 65 77 20  nd register new 
0400: 76 66 73 20 63 61 6c 6c 65 64 20 24 4e 41 4d 45  vfs called $NAME
0410: 2c 20 77 68 69 63 68 20 69 73 20 61 20 77 72 61  , which is a wra
0420: 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 20  pper around.**  
0430: 20 20 20 20 20 74 68 65 20 65 78 69 73 74 69 6e       the existin
0440: 67 20 76 66 73 20 24 50 41 52 45 4e 54 2e 20 49  g vfs $PARENT. I
0450: 66 20 74 68 65 20 50 41 52 45 4e 54 20 61 72 67  f the PARENT arg
0460: 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64  ument is omitted
0470: 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  , the.**       n
0480: 65 77 20 76 66 73 20 69 73 20 61 20 77 72 61 70  ew vfs is a wrap
0490: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 63  per around the c
04a0: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 76  urrent default v
04b0: 66 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69  fs..**.**   sqli
04c0: 74 65 33 5f 69 6e 73 74 76 66 73 20 64 65 73 74  te3_instvfs dest
04d0: 72 6f 79 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20  roy NAME.**.**  
04e0: 20 20 20 20 20 44 65 72 65 67 69 73 74 65 72 20       Deregister 
04f0: 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20  and destroy the 
0500: 76 66 73 20 6e 61 6d 65 64 20 24 4e 41 4d 45 2c  vfs named $NAME,
0510: 20 77 68 69 63 68 20 6d 75 73 74 20 68 61 76 65   which must have
0520: 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 20 63   been.**       c
0530: 72 65 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  reated by an ear
0540: 6c 69 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20  lier invocation 
0550: 6f 66 20 5b 73 71 6c 69 74 65 33 5f 69 6e 73 74  of [sqlite3_inst
0560: 76 66 73 20 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a  vfs create]..**.
0570: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73  **   sqlite3_ins
0580: 74 76 66 73 20 63 6f 6e 66 69 67 75 72 65 20 4e  tvfs configure N
0590: 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a  AME SCRIPT.**.**
05a0: 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75 72 65         Configure
05b0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63   the callback sc
05c0: 72 69 70 74 20 66 6f 72 20 74 68 65 20 76 66 73  ript for the vfs
05d0: 20 24 4e 41 4d 45 2c 20 77 68 69 63 68 20 6d 75   $NAME, which mu
05e0: 63 68 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  ch have.**      
05f0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
0600: 20 61 6e 20 65 61 72 6c 69 65 72 20 69 6e 76 6f   an earlier invo
0610: 63 61 74 69 6f 6e 20 6f 66 20 5b 73 71 6c 69 74  cation of [sqlit
0620: 65 33 5f 69 6e 73 74 76 66 73 20 63 72 65 61 74  e3_instvfs creat
0630: 65 5d 2e 0a 2a 2a 20 20 20 20 20 20 20 41 66 74  e]..**       Aft
0640: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 73 63  er a callback sc
0650: 72 69 70 74 20 68 61 73 20 62 65 65 6e 20 63 6f  ript has been co
0660: 6e 66 69 67 75 72 65 64 2c 20 69 74 20 69 73 20  nfigured, it is 
0670: 69 6e 76 6f 6b 65 64 20 65 61 63 68 0a 2a 2a 20  invoked each.** 
0680: 20 20 20 20 20 20 74 69 6d 65 20 61 20 76 66 73        time a vfs
0690: 20 6f 72 20 66 69 6c 65 20 6d 65 74 68 6f 64 20   or file method 
06a0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 53 51 4c  is called by SQL
06b0: 69 74 65 2e 20 42 65 66 6f 72 65 20 69 6e 76 6f  ite. Before invo
06c0: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 74 68  king.**       th
06d0: 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  e callback scrip
06e0: 74 2c 20 66 69 76 65 20 61 72 67 75 6d 65 6e 74  t, five argument
06f0: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
0700: 6f 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o it:.**.**     
0710: 20 20 20 20 2a 20 54 68 65 20 6e 61 6d 65 20 6f      * The name o
0720: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 6d 65  f the invoked me
0730: 74 68 6f 64 20 2d 20 69 2e 65 2e 20 22 78 52 65  thod - i.e. "xRe
0740: 61 64 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ad"..**.**      
0750: 20 20 20 2a 20 54 68 65 20 74 69 6d 65 20 63 6f     * The time co
0760: 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20 6d 65  nsumed by the me
0770: 74 68 6f 64 20 63 61 6c 6c 20 61 73 20 6d 65 61  thod call as mea
0780: 73 75 72 65 64 20 62 79 20 0a 2a 2a 20 20 20 20  sured by .**    
0790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 77         sqlite3Hw
07a0: 74 69 6d 65 28 29 20 28 61 6e 20 69 6e 74 65 67  time() (an integ
07b0: 65 72 20 76 61 6c 75 65 29 0a 2a 2a 0a 2a 2a 20  er value).**.** 
07c0: 20 20 20 20 20 20 20 20 2a 20 41 20 73 74 72 69          * A stri
07d0: 6e 67 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  ng value with a 
07e0: 64 69 66 66 65 72 65 6e 74 20 6d 65 61 6e 69 6e  different meanin
07f0: 67 20 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20  g for different 
0800: 63 61 6c 6c 73 2e 20 0a 2a 2a 20 20 20 20 20 20  calls. .**      
0810: 20 20 20 20 20 46 6f 72 20 66 69 6c 65 20 6d 65       For file me
0820: 74 68 6f 64 73 2c 20 74 68 65 20 6e 61 6d 65 20  thods, the name 
0830: 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
0840: 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20 46  g operated on. F
0850: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0860: 6f 74 68 65 72 20 6d 65 74 68 6f 64 73 20 69 74  other methods it
0870: 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   is the filename
0880: 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 61 6e   argument, if an
0890: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  y..**.**        
08a0: 20 2a 20 41 20 33 32 2d 62 69 74 20 69 6e 74 65   * A 32-bit inte
08b0: 67 65 72 20 76 61 6c 75 65 20 77 69 74 68 20 61  ger value with a
08c0: 20 63 61 6c 6c 2d 73 70 65 63 69 66 69 63 20 6d   call-specific m
08d0: 65 61 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  eaning..**.**   
08e0: 20 20 20 20 20 20 2a 20 41 20 36 34 2d 62 69 74        * A 64-bit
08f0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20   integer value. 
0900: 46 6f 72 20 78 52 65 61 64 28 29 20 61 6e 64 20  For xRead() and 
0910: 78 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 74  xWrite() calls t
0920: 68 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  his.**          
0930: 20 69 73 20 74 68 65 20 66 69 6c 65 20 6f 66 66   is the file off
0940: 73 65 74 20 62 65 69 6e 67 20 77 72 69 74 74 65  set being writte
0950: 6e 20 74 6f 20 6f 72 20 72 65 61 64 20 66 72 6f  n to or read fro
0960: 6d 2e 20 55 6e 75 73 65 64 20 62 79 0a 2a 2a 20  m. Unused by.** 
0970: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 6f 74            all ot
0980: 68 65 72 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  her calls..**.**
0990: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76     sqlite3_instv
09a0: 66 73 20 72 65 73 65 74 20 4e 41 4d 45 0a 2a 2a  fs reset NAME.**
09b0: 0a 2a 2a 20 20 20 20 20 20 20 5a 65 72 6f 20 74  .**       Zero t
09c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 65 76 65 6e  he internal even
09d0: 74 20 63 6f 75 6e 74 65 72 73 20 61 73 73 6f 63  t counters assoc
09e0: 69 61 74 65 64 20 77 69 74 68 20 76 66 73 20 24  iated with vfs $
09f0: 4e 41 4d 45 2c 20 0a 2a 2a 20 20 20 20 20 20 20  NAME, .**       
0a00: 77 68 69 63 68 20 6d 75 73 74 20 68 61 76 65 20  which must have 
0a10: 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
0a20: 61 6e 20 65 61 72 6c 69 65 72 20 69 6e 76 6f 63  an earlier invoc
0a30: 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 20 20 20  ation of .**    
0a40: 20 20 20 5b 73 71 6c 69 74 65 33 5f 69 6e 73 74     [sqlite3_inst
0a50: 76 66 73 20 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a  vfs create]..**.
0a60: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73  **   sqlite3_ins
0a70: 74 76 66 73 20 72 65 70 6f 72 74 20 4e 41 4d 45  tvfs report NAME
0a80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
0a90: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f  urn the values o
0aa0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 65  f the internal e
0ab0: 76 65 6e 74 20 63 6f 75 6e 74 65 72 73 20 61 73  vent counters as
0ac0: 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 20 20 20  sociated .**    
0ad0: 20 20 20 77 69 74 68 20 76 66 73 20 24 4e 41 4d     with vfs $NAM
0ae0: 45 2e 20 54 68 65 20 72 65 70 6f 72 74 20 66 6f  E. The report fo
0af0: 72 6d 61 74 20 69 73 20 61 20 6c 69 73 74 20 77  rmat is a list w
0b00: 69 74 68 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 0a  ith one element.
0b10: 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 65 61 63  **       for eac
0b20: 68 20 6d 65 74 68 6f 64 20 63 61 6c 6c 20 28 78  h method call (x
0b30: 57 72 69 74 65 2c 20 78 52 65 61 64 20 65 74 63  Write, xRead etc
0b40: 2e 29 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74  .). Each element
0b50: 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 69 74 73   is.**       its
0b60: 65 6c 66 20 61 20 6c 69 73 74 20 77 69 74 68 20  elf a list with 
0b70: 74 68 72 65 65 20 65 6c 65 6d 65 6e 74 73 3a 0a  three elements:.
0b80: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20  **.**         * 
0b90: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
0ba0: 6d 65 74 68 6f 64 20 63 61 6c 6c 20 2d 20 69 2e  method call - i.
0bb0: 65 2e 20 22 78 57 72 69 74 65 22 2c 0a 2a 2a 20  e. "xWrite",.** 
0bc0: 20 20 20 20 20 20 20 20 2a 20 54 68 65 20 74 6f          * The to
0bd0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  tal number of ca
0be0: 6c 6c 73 20 74 6f 20 74 68 65 20 6d 65 74 68 6f  lls to the metho
0bf0: 64 20 28 61 6e 20 69 6e 74 65 67 65 72 29 2e 0a  d (an integer)..
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 54 68 65  **         * The
0c10: 20 61 67 67 72 65 67 61 74 65 20 74 69 6d 65 20   aggregate time 
0c20: 63 6f 6e 73 75 6d 65 64 20 62 79 20 61 6c 6c 20  consumed by all 
0c30: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6d 65 74  calls to the met
0c40: 68 6f 64 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  hod as.**       
0c50: 20 20 20 20 6d 65 61 73 75 72 65 64 20 62 79 20      measured by 
0c60: 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20  sqlite3Hwtime() 
0c70: 28 61 6e 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2f  (an integer)..*/
0c80: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0c90: 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  te3.h".#include 
0ca0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0cb0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
0cc0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
0cd0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 73 75  thname length su
0ce0: 70 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 69  pported by the i
0cf0: 6e 73 74 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a  nst backend..*/.
0d00: 23 64 65 66 69 6e 65 20 49 4e 53 54 5f 4d 41 58  #define INST_MAX
0d10: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a  _PATHNAME 512...
0d20: 2f 2a 20 46 69 6c 65 20 6d 65 74 68 6f 64 73 20  /* File methods 
0d30: 2a 2f 0a 2f 2a 20 56 66 73 20 6d 65 74 68 6f 64  */./* Vfs method
0d40: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 53 5f  s */.#define OS_
0d50: 41 43 43 45 53 53 20 20 20 20 20 20 20 20 20 20  ACCESS          
0d60: 20 20 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43    1.#define OS_C
0d70: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
0d80: 20 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 4c   2.#define OS_CL
0d90: 4f 53 45 20 20 20 20 20 20 20 20 20 20 20 20 20  OSE             
0da0: 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 55 52  3.#define OS_CUR
0db0: 52 45 4e 54 54 49 4d 45 20 20 20 20 20 20 20 34  RENTTIME       4
0dc0: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 4c 45  .#define OS_DELE
0dd0: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 35 0a  TE            5.
0de0: 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 56 43 48  #define OS_DEVCH
0df0: 41 52 20 20 20 20 20 20 20 20 20 20 20 36 0a 23  AR           6.#
0e00: 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 43 4f  define OS_FILECO
0e10: 4e 54 52 4f 4c 20 20 20 20 20 20 20 37 0a 23 64  NTROL       7.#d
0e20: 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 53 49 5a  efine OS_FILESIZ
0e30: 45 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65  E          8.#de
0e40: 66 69 6e 65 20 4f 53 5f 46 55 4c 4c 50 41 54 48  fine OS_FULLPATH
0e50: 4e 41 4d 45 20 20 20 20 20 20 39 0a 23 64 65 66  NAME      9.#def
0e60: 69 6e 65 20 4f 53 5f 4c 4f 43 4b 20 20 20 20 20  ine OS_LOCK     
0e70: 20 20 20 20 20 20 20 20 20 31 31 0a 23 64 65 66           11.#def
0e80: 69 6e 65 20 4f 53 5f 4f 50 45 4e 20 20 20 20 20  ine OS_OPEN     
0e90: 20 20 20 20 20 20 20 20 20 31 32 0a 23 64 65 66           12.#def
0ea0: 69 6e 65 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53  ine OS_RANDOMNES
0eb0: 53 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66  S        13.#def
0ec0: 69 6e 65 20 4f 53 5f 52 45 41 44 20 20 20 20 20  ine OS_READ     
0ed0: 20 20 20 20 20 20 20 20 20 31 34 20 0a 23 64 65           14 .#de
0ee0: 66 69 6e 65 20 4f 53 5f 53 45 43 54 4f 52 53 49  fine OS_SECTORSI
0ef0: 5a 45 20 20 20 20 20 20 20 20 31 35 0a 23 64 65  ZE        15.#de
0f00: 66 69 6e 65 20 4f 53 5f 53 4c 45 45 50 20 20 20  fine OS_SLEEP   
0f10: 20 20 20 20 20 20 20 20 20 20 31 36 0a 23 64 65            16.#de
0f20: 66 69 6e 65 20 4f 53 5f 53 59 4e 43 20 20 20 20  fine OS_SYNC    
0f30: 20 20 20 20 20 20 20 20 20 20 31 37 0a 23 64 65            17.#de
0f40: 66 69 6e 65 20 4f 53 5f 54 52 55 4e 43 41 54 45  fine OS_TRUNCATE
0f50: 20 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65            18.#de
0f60: 66 69 6e 65 20 4f 53 5f 55 4e 4c 4f 43 4b 20 20  fine OS_UNLOCK  
0f70: 20 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65            19.#de
0f80: 66 69 6e 65 20 4f 53 5f 57 52 49 54 45 20 20 20  fine OS_WRITE   
0f90: 20 20 20 20 20 20 20 20 20 20 32 30 0a 0a 23 64            20..#d
0fa0: 65 66 69 6e 65 20 4f 53 5f 4e 55 4d 45 56 45 4e  efine OS_NUMEVEN
0fb0: 54 53 20 20 20 20 20 20 20 20 20 32 31 0a 0a 23  TS         21..#
0fc0: 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47  define BINARYLOG
0fd0: 5f 53 54 52 49 4e 47 20 20 20 20 20 33 30 0a 23  _STRING     30.#
0fe0: 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47  define BINARYLOG
0ff0: 5f 4d 41 52 4b 45 52 20 20 20 20 20 33 31 0a 0a  _MARKER     31..
1000: 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f  #define BINARYLO
1010: 47 5f 50 52 45 50 41 52 45 5f 56 32 20 36 34 0a  G_PREPARE_V2 64.
1020: 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f  #define BINARYLO
1030: 47 5f 53 54 45 50 20 20 20 20 20 20 20 36 35 0a  G_STEP       65.
1040: 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f  #define BINARYLO
1050: 47 5f 46 49 4e 41 4c 49 5a 45 20 20 20 36 36 0a  G_FINALIZE   66.
1060: 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 20  .struct InstVfs 
1070: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1080: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  base;.  sqlite3_
1090: 76 66 73 20 2a 70 56 66 73 3b 0a 0a 20 20 76 6f  vfs *pVfs;..  vo
10a0: 69 64 20 2a 70 43 6c 69 65 6e 74 3b 0a 20 20 76  id *pClient;.  v
10b0: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
10c0: 20 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 43   *);.  void (*xC
10d0: 61 6c 6c 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74  all)(void *, int
10e0: 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69  , int, sqlite3_i
10f0: 6e 74 36 34 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  nt64, int, const
1100: 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e   char *, int, in
1110: 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t, sqlite3_int64
1120: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 65 72  );..  /* Counter
1130: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
1140: 6e 74 36 34 20 61 54 69 6d 65 5b 4f 53 5f 4e 55  nt64 aTime[OS_NU
1150: 4d 45 56 45 4e 54 53 5d 3b 0a 20 20 69 6e 74 20  MEVENTS];.  int 
1160: 61 43 6f 75 6e 74 5b 4f 53 5f 4e 55 4d 45 56 45  aCount[OS_NUMEVE
1170: 4e 54 53 5d 3b 0a 0a 20 20 69 6e 74 20 69 4e 65  NTS];..  int iNe
1180: 78 74 46 69 6c 65 49 64 3b 0a 7d 3b 0a 74 79 70  xtFileId;.};.typ
1190: 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 73 74  edef struct Inst
11a0: 56 66 73 20 49 6e 73 74 56 66 73 3b 0a 0a 23 64  Vfs InstVfs;..#d
11b0: 65 66 69 6e 65 20 52 45 41 4c 56 46 53 28 70 29  efine REALVFS(p)
11c0: 20 28 28 28 49 6e 73 74 56 66 73 20 2a 29 28 70   (((InstVfs *)(p
11d0: 29 29 2d 3e 70 56 66 73 29 0a 0a 74 79 70 65 64  ))->pVfs)..typed
11e0: 65 66 20 73 74 72 75 63 74 20 69 6e 73 74 5f 66  ef struct inst_f
11f0: 69 6c 65 20 69 6e 73 74 5f 66 69 6c 65 3b 0a 73  ile inst_file;.s
1200: 74 72 75 63 74 20 69 6e 73 74 5f 66 69 6c 65 20  truct inst_file 
1210: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
1220: 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33   base;.  sqlite3
1230: 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 0a 20 20  _file *pReal;.  
1240: 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56 66  InstVfs *pInstVf
1250: 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
1260: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 46  *zName;.  int iF
1270: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 20 20 20  ileId;          
1280: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 69 64 20       /* File id 
1290: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
12a0: 66 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  flags;.};../*.**
12b0: 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 61 74   Method declarat
12c0: 69 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f 66 69  ions for inst_fi
12d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12e0: 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 6c 69  t instClose(sqli
12f0: 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
1300: 69 63 20 69 6e 74 20 69 6e 73 74 52 65 61 64 28  ic int instRead(
1310: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76  sqlite3_file*, v
1320: 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20  oid*, int iAmt, 
1330: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
1340: 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
1350: 20 69 6e 73 74 57 72 69 74 65 28 73 71 6c 69 74   instWrite(sqlit
1360: 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20 76  e3_file*,const v
1370: 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20 73  oid*,int iAmt, s
1380: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
1390: 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  st);.static int 
13a0: 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73 71 6c  instTruncate(sql
13b0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69  ite3_file*, sqli
13c0: 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b  te3_int64 size);
13d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
13e0: 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
13f0: 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a  e*, int flags);.
1400: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 46  static int instF
1410: 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1420: 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  file*, sqlite3_i
1430: 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a 73 74  nt64 *pSize);.st
1440: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4c 6f 63  atic int instLoc
1450: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
1460: 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
1470: 74 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73 71 6c  t instUnlock(sql
1480: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1490: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  ;.static int ins
14a0: 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  tCheckReservedLo
14b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
14c0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 3b  , int *pResOut);
14d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
14e0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
14f0: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 6f  te3_file*, int o
1500: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b 0a  p, void *pArg);.
1510: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 53  static int instS
1520: 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1530: 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1540: 20 69 6e 74 20 69 6e 73 74 44 65 76 69 63 65 43   int instDeviceC
1550: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1560: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 0a  qlite3_file*);..
1570: 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63  /*.** Method dec
1580: 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e  larations for in
1590: 73 74 5f 76 66 73 2e 0a 2a 2f 0a 73 74 61 74 69  st_vfs..*/.stati
15a0: 63 20 69 6e 74 20 69 6e 73 74 4f 70 65 6e 28 73  c int instOpen(s
15b0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e  qlite3_vfs*, con
15c0: 73 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74  st char *, sqlit
15d0: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20  e3_file*, int , 
15e0: 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  int *);.static i
15f0: 6e 74 20 69 6e 73 74 44 65 6c 65 74 65 28 73 71  nt instDelete(sq
1600: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
1610: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1620: 6e 74 20 73 79 6e 63 44 69 72 29 3b 0a 73 74 61  nt syncDir);.sta
1630: 74 69 63 20 69 6e 74 20 69 6e 73 74 41 63 63 65  tic int instAcce
1640: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
1650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1660: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  me, int flags, i
1670: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
1680: 74 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61  t instFullPathna
1690: 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  me(sqlite3_vfs*,
16a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
16b0: 6d 65 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a  me, int, char *z
16c0: 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  Out);.static voi
16d0: 64 20 2a 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71  d *instDlOpen(sq
16e0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
16f0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1700: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
1710: 69 6e 73 74 44 6c 45 72 72 6f 72 28 73 71 6c 69  instDlError(sqli
1720: 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42  te3_vfs*, int nB
1730: 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d  yte, char *zErrM
1740: 73 67 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  sg);.static void
1750: 20 2a 69 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69   *instDlSym(sqli
1760: 74 65 33 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20  te3_vfs*,void*, 
1770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
1780: 62 6f 6c 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  bol);.static voi
1790: 64 20 69 6e 73 74 44 6c 43 6c 6f 73 65 28 73 71  d instDlClose(sq
17a0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f 69 64  lite3_vfs*, void
17b0: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  *);.static int i
17c0: 6e 73 74 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nstRandomness(sq
17d0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
17e0: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75  nByte, char *zOu
17f0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  t);.static int i
1800: 6e 73 74 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nstSleep(sqlite3
1810: 5f 76 66 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f  _vfs*, int micro
1820: 73 65 63 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63  seconds);.static
1830: 20 69 6e 74 20 69 6e 73 74 43 75 72 72 65 6e 74   int instCurrent
1840: 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
1850: 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74  *, double*);..st
1860: 61 74 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79  atic void binary
1870: 6c 6f 67 5f 62 6c 6f 62 28 73 71 6c 69 74 65 33  log_blob(sqlite3
1880: 5f 76 66 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68  _vfs *, const ch
1890: 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b  ar *, int, int);
18a0: 20 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65   ..static sqlite
18b0: 33 5f 76 66 73 20 69 6e 73 74 5f 76 66 73 20 3d  3_vfs inst_vfs =
18c0: 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20   {.  1,         
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e0: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 69  iVersion */.  si
18f0: 7a 65 6f 66 28 69 6e 73 74 5f 66 69 6c 65 29 2c  zeof(inst_file),
1900: 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c        /* szOsFil
1910: 65 20 2a 2f 0a 20 20 49 4e 53 54 5f 4d 41 58 5f  e */.  INST_MAX_
1920: 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 2f  PATHNAME,      /
1930: 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
1940: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
1960: 78 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  xt */.  0,      
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c  /* zName */.  0,
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
19b0: 61 20 2a 2f 0a 20 20 69 6e 73 74 4f 70 65 6e 2c  a */.  instOpen,
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d0: 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 69 6e 73  * xOpen */.  ins
19e0: 74 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  tDelete,        
19f0: 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
1a00: 2a 2f 0a 20 20 69 6e 73 74 41 63 63 65 73 73 2c  */.  instAccess,
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a20: 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 73  xAccess */.  ins
1a30: 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  tFullPathname,  
1a40: 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
1a50: 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 73 74 44  hname */.  instD
1a60: 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
1a70: 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
1a80: 0a 20 20 69 6e 73 74 44 6c 45 72 72 6f 72 2c 20  .  instDlError, 
1a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1aa0: 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 73 74  lError */.  inst
1ab0: 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
1ac0: 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
1ad0: 0a 20 20 69 6e 73 74 44 6c 43 6c 6f 73 65 2c 20  .  instDlClose, 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1af0: 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 73 74  lClose */.  inst
1b00: 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
1b10: 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
1b20: 73 73 20 2a 2f 0a 20 20 69 6e 73 74 53 6c 65 65  ss */.  instSlee
1b30: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1b40: 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 69  /* xSleep */.  i
1b50: 6e 73 74 43 75 72 72 65 6e 74 54 69 6d 65 20 20  nstCurrentTime  
1b60: 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
1b70: 6e 74 54 69 6d 65 20 2a 2f 0a 7d 3b 0a 0a 73 74  ntTime */.};..st
1b80: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f  atic sqlite3_io_
1b90: 6d 65 74 68 6f 64 73 20 69 6e 73 74 5f 69 6f 5f  methods inst_io_
1ba0: 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 31 2c  methods = {.  1,
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1bd0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 73  Version */.  ins
1be0: 74 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  tClose,         
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c00: 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 73 74  xClose */.  inst
1c10: 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c30: 52 65 61 64 20 2a 2f 0a 20 20 69 6e 73 74 57 72  Read */.  instWr
1c40: 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
1c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
1c60: 69 74 65 20 2a 2f 0a 20 20 69 6e 73 74 54 72 75  ite */.  instTru
1c70: 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
1c90: 6e 63 61 74 65 20 2a 2f 0a 20 20 69 6e 73 74 53  ncate */.  instS
1ca0: 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1cc0: 79 6e 63 20 2a 2f 0a 20 20 69 6e 73 74 46 69 6c  ync */.  instFil
1cd0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1cf0: 65 53 69 7a 65 20 2a 2f 0a 20 20 69 6e 73 74 4c  eSize */.  instL
1d00: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1d20: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 73 74 55 6e 6c  ock */.  instUnl
1d30: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1d50: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 73 74 43 68 65  ock */.  instChe
1d60: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
1d80: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1d90: 2f 0a 20 20 69 6e 73 74 46 69 6c 65 43 6f 6e 74  /.  instFileCont
1da0: 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
1db0: 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1dc0: 72 6f 6c 20 2a 2f 0a 20 20 69 6e 73 74 53 65 63  rol */.  instSec
1dd0: 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
1de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1df0: 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 69 6e 73  torSize */.  ins
1e00: 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
1e10: 69 73 74 69 63 73 20 20 20 20 20 20 20 2f 2a 20  istics       /* 
1e20: 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1e30: 69 73 74 69 63 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  istics */.};../*
1e40: 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f   .** hwtime.h co
1e50: 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73  ntains inline as
1e60: 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72  sembler code for
1e70: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a   implementing .*
1e80: 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e  * high-performan
1e90: 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e  ce timing routin
1ea0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
1eb0: 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 64 65 66  "hwtime.h"..#def
1ec0: 69 6e 65 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 65  ine OS_TIME_IO(e
1ed0: 45 76 65 6e 74 2c 20 41 2c 20 42 2c 20 43 61 6c  Event, A, B, Cal
1ee0: 6c 29 20 7b 20 20 20 20 20 5c 0a 20 20 69 6e 73  l) {     \.  ins
1ef0: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 69 6e 73  t_file *p = (ins
1f00: 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 20  t_file *)pFile; 
1f10: 20 20 20 20 20 20 20 20 5c 0a 20 20 49 6e 73 74          \.  Inst
1f20: 56 66 73 20 2a 70 49 6e 73 74 56 66 73 20 3d 20  Vfs *pInstVfs = 
1f30: 70 2d 3e 70 49 6e 73 74 56 66 73 3b 20 20 20 20  p->pInstVfs;    
1f40: 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 72         \.  int r
1f50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 20 20 5c 0a 20 20 73 71 6c 69 74 65        \.  sqlite
1f80: 5f 75 69 6e 74 36 34 20 74 20 3d 20 73 71 6c 69  _uint64 t = sqli
1f90: 74 65 33 48 77 74 69 6d 65 28 29 3b 20 20 20 20  te3Hwtime();    
1fa0: 20 20 20 20 20 5c 0a 20 20 72 63 20 3d 20 43 61       \.  rc = Ca
1fb0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 5c 0a 20 20 74 20 3d 20 73 71 6c 69      \.  t = sqli
1fe0: 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20 74 3b  te3Hwtime() - t;
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d     \.  pInstVfs-
2010: 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 5d 20 2b  >aTime[eEvent] +
2020: 3d 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  = t;            
2030: 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e    \.  pInstVfs->
2040: 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b  aCount[eEvent] +
2050: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2060: 20 5c 0a 20 20 69 66 28 20 70 49 6e 73 74 56 66   \.  if( pInstVf
2070: 73 2d 3e 78 43 61 6c 6c 20 29 7b 20 20 20 20 20  s->xCall ){     
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 5c 0a 20 20 20 20 70 49 6e 73 74 56 66 73 2d 3e  \.    pInstVfs->
20a0: 78 43 61 6c 6c 28 20 20 20 20 20 20 20 20 20 20  xCall(          
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20c0: 0a 20 20 20 20 20 20 70 49 6e 73 74 56 66 73 2d  .      pInstVfs-
20d0: 3e 70 43 6c 69 65 6e 74 2c 65 45 76 65 6e 74 2c  >pClient,eEvent,
20e0: 70 2d 3e 69 46 69 6c 65 49 64 2c 74 2c 72 63 2c  p->iFileId,t,rc,
20f0: 70 2d 3e 7a 4e 61 6d 65 2c 70 2d 3e 66 6c 61 67  p->zName,p->flag
2100: 73 2c 41 2c 42 20 20 5c 0a 20 20 20 20 29 3b 20  s,A,B  \.    ); 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20        \.  }     
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
2170: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65      \.}..#define
21a0: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 65 45 76   OS_TIME_VFS(eEv
21b0: 65 6e 74 2c 20 5a 2c 20 66 6c 61 67 73 2c 20 41  ent, Z, flags, A
21c0: 2c 20 42 2c 20 43 61 6c 6c 29 20 7b 20 20 20 20  , B, Call) {    
21d0: 20 20 5c 0a 20 20 49 6e 73 74 56 66 73 20 2a 70    \.  InstVfs *p
21e0: 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73 74 56  InstVfs = (InstV
21f0: 66 73 20 2a 29 70 56 66 73 3b 20 20 20 5c 0a 20  fs *)pVfs;   \. 
2200: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 20 20 20 20 20 5c 0a 20 20 73 71 6c 69          \.  sqli
2230: 74 65 5f 75 69 6e 74 36 34 20 74 20 3d 20 73 71  te_uint64 t = sq
2240: 6c 69 74 65 33 48 77 74 69 6d 65 28 29 3b 20 20  lite3Hwtime();  
2250: 20 20 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c     \.  rc = Call
2260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2280: 20 20 74 20 3d 20 73 71 6c 69 74 65 33 48 77 74    t = sqlite3Hwt
2290: 69 6d 65 28 29 20 2d 20 74 3b 20 20 20 20 20 20  ime() - t;      
22a0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 70 49 6e           \.  pIn
22b0: 73 74 56 66 73 2d 3e 61 54 69 6d 65 5b 65 45 76  stVfs->aTime[eEv
22c0: 65 6e 74 5d 20 2b 3d 20 74 3b 20 20 20 20 20 20  ent] += t;      
22d0: 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 73      \.  pInstVfs
22e0: 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d  ->aCount[eEvent]
22f0: 20 2b 3d 20 31 3b 20 20 20 20 20 20 20 20 20 5c   += 1;         \
2300: 0a 20 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d  .  if( pInstVfs-
2310: 3e 78 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20  >xCall ){       
2320: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2330: 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 28  pInstVfs->xCall(
2340: 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65 6e  pInstVfs->pClien
2350: 74 2c 65 45 76 65 6e 74 2c 30 2c 20 74 2c 20 72  t,eEvent,0, t, r
2360: 63 2c 20 5a 2c 20 66 6c 61 67 73 2c 20 41 2c 20  c, Z, flags, A, 
2370: 42 29 3b 20 5c 0a 20 20 7d 20 20 20 20 20 20 20  B); \.  }       
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f            \.}../
23d0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e  *.** Close an in
23e0: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  st-file..*/.stat
23f0: 69 63 20 69 6e 74 20 69 6e 73 74 43 6c 6f 73 65  ic int instClose
2400: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2410: 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45  File){.  OS_TIME
2420: 5f 49 4f 28 4f 53 5f 43 4c 4f 53 45 2c 20 30 2c  _IO(OS_CLOSE, 0,
2430: 20 30 2c 20 0a 20 20 20 20 28 70 2d 3e 70 52 65   0, .    (p->pRe
2440: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 3f 20 70  al->pMethods ? p
2450: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
2460: 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65  s->xClose(p->pRe
2470: 61 6c 29 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  al) : SQLITE_OK)
2480: 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  );.}../*.** R
2490: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
24a0: 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73   inst-file..*/.s
24b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65  tatic int instRe
24c0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
24d0: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
24e0: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
24f0: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
2500: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
2510: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2520: 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Vfs = (sqlite3_v
2530: 66 73 20 2a 29 28 28 28 69 6e 73 74 5f 66 69 6c  fs *)(((inst_fil
2540: 65 20 2a 29 70 46 69 6c 65 29 2d 3e 70 49 6e 73  e *)pFile)->pIns
2550: 74 56 66 73 29 3b 0a 20 20 4f 53 5f 54 49 4d 45  tVfs);.  OS_TIME
2560: 5f 49 4f 28 4f 53 5f 52 45 41 44 2c 20 69 41 6d  _IO(OS_READ, iAm
2570: 74 2c 20 28 62 69 6e 61 72 79 6c 6f 67 5f 62 6c  t, (binarylog_bl
2580: 6f 62 28 70 56 66 73 2c 20 7a 42 75 66 2c 20 69  ob(pVfs, zBuf, i
2590: 41 6d 74 2c 20 31 29 2c 20 69 4f 66 73 74 29 2c  Amt, 1), iOfst),
25a0: 20 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 6c   .      p->pReal
25b0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61  ->pMethods->xRea
25c0: 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66  d(p->pReal, zBuf
25d0: 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 0a 20  , iAmt, iOfst). 
25e0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   );.}../*.** Wri
25f0: 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e  te data to an in
2600: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  st-file..*/.stat
2610: 69 63 20 69 6e 74 20 69 6e 73 74 57 72 69 74 65  ic int instWrite
2620: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
2630: 20 2a 70 46 69 6c 65 2c 0a 20 20 63 6f 6e 73 74   *pFile,.  const
2640: 20 76 6f 69 64 20 2a 7a 2c 0a 20 20 69 6e 74 20   void *z,.  int 
2650: 69 41 6d 74 2c 0a 20 20 73 71 6c 69 74 65 5f 69  iAmt,.  sqlite_i
2660: 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20  nt64 iOfst.){.  
2670: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2680: 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 66 73  s = (sqlite3_vfs
2690: 20 2a 29 28 28 28 69 6e 73 74 5f 66 69 6c 65 20   *)(((inst_file 
26a0: 2a 29 70 46 69 6c 65 29 2d 3e 70 49 6e 73 74 56  *)pFile)->pInstV
26b0: 66 73 29 3b 0a 20 20 62 69 6e 61 72 79 6c 6f 67  fs);.  binarylog
26c0: 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 2c 20 69  _blob(pVfs, z, i
26d0: 41 6d 74 2c 20 31 29 3b 0a 20 20 4f 53 5f 54 49  Amt, 1);.  OS_TI
26e0: 4d 45 5f 49 4f 28 4f 53 5f 57 52 49 54 45 2c 20  ME_IO(OS_WRITE, 
26f0: 69 41 6d 74 2c 20 69 4f 66 73 74 2c 20 0a 20 20  iAmt, iOfst, .  
2700: 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d      p->pReal->pM
2710: 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
2720: 2d 3e 70 52 65 61 6c 2c 20 7a 2c 20 69 41 6d 74  ->pReal, z, iAmt
2730: 2c 20 69 4f 66 73 74 29 0a 20 20 29 3b 0a 7d 0a  , iOfst).  );.}.
2740: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
2750: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f  an inst-file..*/
2760: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
2770: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
2780: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
2790: 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29  lite_int64 size)
27a0: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
27b0: 53 5f 54 52 55 4e 43 41 54 45 2c 20 30 2c 20 28  S_TRUNCATE, 0, (
27c0: 69 6e 74 29 73 69 7a 65 2c 20 0a 20 20 20 20 70  int)size, .    p
27d0: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
27e0: 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d 3e  s->xTruncate(p->
27f0: 70 52 65 61 6c 2c 20 73 69 7a 65 29 0a 20 20 29  pReal, size).  )
2800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2810: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f  an inst-file..*/
2820: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
2830: 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
2840: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c  e *pFile, int fl
2850: 61 67 73 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f  ags){.  OS_TIME_
2860: 49 4f 28 4f 53 5f 53 59 4e 43 2c 20 66 6c 61 67  IO(OS_SYNC, flag
2870: 73 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e  s, 0, p->pReal->
2880: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
2890: 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29  p->pReal, flags)
28a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
28b0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  rn the current f
28c0: 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 69  ile-size of an i
28d0: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
28e0: 74 69 63 20 69 6e 74 20 69 6e 73 74 46 69 6c 65  tic int instFile
28f0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
2900: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
2910: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
2920: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f    OS_TIME_IO(OS_
2930: 46 49 4c 45 53 49 5a 45 2c 20 28 69 6e 74 29 28  FILESIZE, (int)(
2940: 2a 70 53 69 7a 65 29 2c 20 30 2c 20 0a 20 20 20  *pSize), 0, .   
2950: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2960: 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70  ods->xFileSize(p
2970: 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 0a  ->pReal, pSize).
2980: 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f    );.}../*.** Lo
2990: 63 6b 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e  ck an inst-file.
29a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
29b0: 6e 73 74 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nstLock(sqlite3_
29c0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
29d0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 4f 53 5f 54 49   eLock){.  OS_TI
29e0: 4d 45 5f 49 4f 28 4f 53 5f 4c 4f 43 4b 2c 20 65  ME_IO(OS_LOCK, e
29f0: 4c 6f 63 6b 2c 20 30 2c 20 70 2d 3e 70 52 65 61  Lock, 0, p->pRea
2a00: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f  l->pMethods->xLo
2a10: 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f  ck(p->pReal, eLo
2a20: 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ck));.}../*.** U
2a30: 6e 6c 6f 63 6b 20 61 6e 20 69 6e 73 74 2d 66 69  nlock an inst-fi
2a40: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2a50: 74 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73 71 6c  t instUnlock(sql
2a60: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2a70: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
2a80: 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 55 4e  OS_TIME_IO(OS_UN
2a90: 4c 4f 43 4b 2c 20 65 4c 6f 63 6b 2c 20 30 2c 20  LOCK, eLock, 0, 
2aa0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2ab0: 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70  ds->xUnlock(p->p
2ac0: 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a 7d  Real, eLock));.}
2ad0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
2ae0: 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61   another file-ha
2af0: 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53  ndle holds a RES
2b00: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e  ERVED lock on an
2b10: 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73   inst-file..*/.s
2b20: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 43 68  tatic int instCh
2b30: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2b40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2b50: 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  ile, int *pResOu
2b60: 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f  t){.  OS_TIME_IO
2b70: 28 4f 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45  (OS_CHECKRESERVE
2b80: 44 4c 4f 43 4b 2c 20 30 2c 20 30 2c 20 0a 20 20  DLOCK, 0, 0, .  
2b90: 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d      p->pReal->pM
2ba0: 65 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65  ethods->xCheckRe
2bb0: 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52  servedLock(p->pR
2bc0: 65 61 6c 2c 20 70 52 65 73 4f 75 74 29 0a 20 20  eal, pResOut).  
2bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  );.}../*.** File
2be0: 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
2bf0: 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
2c00: 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 69 6e 73  ations on an ins
2c10: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2c20: 63 20 69 6e 74 20 69 6e 73 74 46 69 6c 65 43 6f  c int instFileCo
2c30: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
2c40: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f  le *pFile, int o
2c50: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
2c60: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f    OS_TIME_IO(OS_
2c70: 46 49 4c 45 43 4f 4e 54 52 4f 4c 2c 20 30 2c 20  FILECONTROL, 0, 
2c80: 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  0, p->pReal->pMe
2c90: 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e 74  thods->xFileCont
2ca0: 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70  rol(p->pReal, op
2cb0: 2c 20 70 41 72 67 29 29 3b 0a 7d 0a 0a 2f 2a 0a  , pArg));.}../*.
2cc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
2cd0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74  ctor-size in byt
2ce0: 65 73 20 66 6f 72 20 61 6e 20 69 6e 73 74 2d 66  es for an inst-f
2cf0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2d00: 6e 74 20 69 6e 73 74 53 65 63 74 6f 72 53 69 7a  nt instSectorSiz
2d10: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
2d20: 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d  pFile){.  OS_TIM
2d30: 45 5f 49 4f 28 4f 53 5f 53 45 43 54 4f 52 53 49  E_IO(OS_SECTORSI
2d40: 5a 45 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 52 65  ZE, 0, 0, p->pRe
2d50: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
2d60: 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70 52 65  ectorSize(p->pRe
2d70: 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  al));.}../*.** R
2d80: 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
2d90: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
2da0: 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64 20  flags supported 
2db0: 62 79 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e  by an inst-file.
2dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2dd0: 6e 73 74 44 65 76 69 63 65 43 68 61 72 61 63 74  nstDeviceCharact
2de0: 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
2df0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
2e00: 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 44   OS_TIME_IO(OS_D
2e10: 45 56 43 48 41 52 2c 20 30 2c 20 30 2c 20 70 2d  EVCHAR, 0, 0, p-
2e20: 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
2e30: 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61 63 74  ->xDeviceCharact
2e40: 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65 61  eristics(p->pRea
2e50: 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  l));.}../*.** Op
2e60: 65 6e 20 61 6e 20 69 6e 73 74 20 66 69 6c 65 20  en an inst file 
2e70: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
2e80: 63 20 69 6e 74 20 69 6e 73 74 4f 70 65 6e 28 0a  c int instOpen(.
2e90: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2ea0: 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Vfs,.  const cha
2eb0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69  r *zName,.  sqli
2ec0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2ed0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20  .  int flags,.  
2ee0: 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29  int *pOutFlags.)
2ef0: 7b 0a 20 20 69 6e 73 74 5f 66 69 6c 65 20 2a 70  {.  inst_file *p
2f00: 20 3d 20 28 69 6e 73 74 5f 66 69 6c 65 20 2a 29   = (inst_file *)
2f10: 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65 2d 3e  pFile;.  pFile->
2f20: 70 4d 65 74 68 6f 64 73 20 3d 20 26 69 6e 73 74  pMethods = &inst
2f30: 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 70  _io_methods;.  p
2f40: 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74  ->pReal = (sqlit
2f50: 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b  e3_file *)&p[1];
2f60: 0a 20 20 70 2d 3e 70 49 6e 73 74 56 66 73 20 3d  .  p->pInstVfs =
2f70: 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73   (InstVfs *)pVfs
2f80: 3b 0a 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  ;.  p->zName = z
2f90: 4e 61 6d 65 3b 0a 20 20 70 2d 3e 66 6c 61 67 73  Name;.  p->flags
2fa0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70 2d 3e 69   = flags;.  p->i
2fb0: 46 69 6c 65 49 64 20 3d 20 2b 2b 70 2d 3e 70 49  FileId = ++p->pI
2fc0: 6e 73 74 56 66 73 2d 3e 69 4e 65 78 74 46 69 6c  nstVfs->iNextFil
2fd0: 65 49 64 3b 0a 0a 20 20 62 69 6e 61 72 79 6c 6f  eId;..  binarylo
2fe0: 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 4e 61  g_blob(pVfs, zNa
2ff0: 6d 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 4f 53  me, -1, 0);.  OS
3000: 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f 4f 50 45  _TIME_VFS(OS_OPE
3010: 4e 2c 20 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  N, zName, flags,
3020: 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 30 2c 0a   p->iFileId, 0,.
3030: 20 20 20 20 52 45 41 4c 56 46 53 28 70 56 66 73      REALVFS(pVfs
3040: 29 2d 3e 78 4f 70 65 6e 28 52 45 41 4c 56 46 53  )->xOpen(REALVFS
3050: 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c 20 70  (pVfs), zName, p
3060: 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20  ->pReal, flags, 
3070: 70 4f 75 74 46 6c 61 67 73 29 0a 20 20 29 3b 0a  pOutFlags).  );.
3080: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
3090: 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64  the file located
30a0: 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
30b0: 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
30c0: 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 65  nt is true,.** e
30d0: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 2d 73  nsure the file-s
30e0: 79 73 74 65 6d 20 6d 6f 64 69 66 69 63 61 74 69  ystem modificati
30f0: 6f 6e 73 20 61 72 65 20 73 79 6e 63 65 64 20 74  ons are synced t
3100: 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 0a 2a 2a  o disk before.**
3110: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
3120: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65  tatic int instDe
3130: 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
3140: 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
3150: 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64  ar *zPath, int d
3160: 69 72 53 79 6e 63 29 7b 0a 20 20 62 69 6e 61 72  irSync){.  binar
3170: 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20  ylog_blob(pVfs, 
3180: 7a 50 61 74 68 2c 20 2d 31 2c 20 30 29 3b 0a 20  zPath, -1, 0);. 
3190: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f   OS_TIME_VFS(OS_
31a0: 44 45 4c 45 54 45 2c 20 7a 50 61 74 68 2c 20 30  DELETE, zPath, 0
31b0: 2c 20 64 69 72 53 79 6e 63 2c 20 30 2c 0a 20 20  , dirSync, 0,.  
31c0: 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d    REALVFS(pVfs)-
31d0: 3e 78 44 65 6c 65 74 65 28 52 45 41 4c 56 46 53  >xDelete(REALVFS
31e0: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 64  (pVfs), zPath, d
31f0: 69 72 53 79 6e 63 29 20 0a 20 20 29 3b 0a 7d 0a  irSync) .  );.}.
3200: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
3210: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
3220: 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
3230: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
3240: 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
3250: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
3260: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3270: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3280: 6e 73 74 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nstAccess(.  sql
3290: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
32a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
32b0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61  Path, .  int fla
32c0: 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73  gs, .  int *pRes
32d0: 4f 75 74 0a 29 7b 0a 20 20 62 69 6e 61 72 79 6c  Out.){.  binaryl
32e0: 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 50  og_blob(pVfs, zP
32f0: 61 74 68 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 4f  ath, -1, 0);.  O
3300: 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f 41 43  S_TIME_VFS(OS_AC
3310: 43 45 53 53 2c 20 7a 50 61 74 68 2c 20 30 2c 20  CESS, zPath, 0, 
3320: 66 6c 61 67 73 2c 20 2a 70 52 65 73 4f 75 74 2c  flags, *pResOut,
3330: 20 0a 20 20 20 20 52 45 41 4c 56 46 53 28 70 56   .    REALVFS(pV
3340: 66 73 29 2d 3e 78 41 63 63 65 73 73 28 52 45 41  fs)->xAccess(REA
3350: 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74  LVFS(pVfs), zPat
3360: 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  h, flags, pResOu
3370: 74 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t) .  );.}../*.*
3380: 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65  * Populate buffe
3390: 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20  r zOut with the 
33a0: 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70  full canonical p
33b0: 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  athname correspo
33c0: 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  nding.** to the 
33d0: 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74  pathname in zPat
33e0: 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61  h. zOut is guara
33f0: 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
3400: 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66  o a buffer.** of
3410: 20 61 74 20 6c 65 61 73 74 20 28 49 4e 53 54 5f   at least (INST_
3420: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20  MAX_PATHNAME+1) 
3430: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
3440: 20 69 6e 74 20 69 6e 73 74 46 75 6c 6c 50 61 74   int instFullPat
3450: 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
3460: 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63  _vfs *pVfs, .  c
3470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
3480: 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a  , .  int nOut, .
3490: 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a    char *zOut.){.
34a0: 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f    OS_TIME_VFS( O
34b0: 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 2c 20  S_FULLPATHNAME, 
34c0: 7a 50 61 74 68 2c 20 30 2c 20 30 2c 20 30 2c 0a  zPath, 0, 0, 0,.
34d0: 20 20 20 20 52 45 41 4c 56 46 53 28 70 56 66 73      REALVFS(pVfs
34e0: 29 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  )->xFullPathname
34f0: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
3500: 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75  zPath, nOut, zOu
3510: 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t);.  );.}../*.*
3520: 2a 20 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d  * Open the dynam
3530: 69 63 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74  ic library locat
3540: 65 64 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20  ed at zPath and 
3550: 72 65 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e  return a handle.
3560: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3570: 2a 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69  *instDlOpen(sqli
3580: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
3590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
35a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c  ){.  return REAL
35b0: 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70  VFS(pVfs)->xDlOp
35c0: 65 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29  en(REALVFS(pVfs)
35d0: 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  , zPath);.}../*.
35e0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
35f0: 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28  buffer zErrMsg (
3600: 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73  size nByte bytes
3610: 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72  ) with a human r
3620: 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38  eadable.** utf-8
3630: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
3640: 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ng the most rece
3650: 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  nt error encount
3660: 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20  ered associated 
3670: 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63  .** with dynamic
3680: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73   libraries..*/.s
3690: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 44  tatic void instD
36a0: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
36b0: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
36c0: 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d  yte, char *zErrM
36d0: 73 67 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70  sg){.  REALVFS(p
36e0: 56 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 52  Vfs)->xDlError(R
36f0: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42  EALVFS(pVfs), nB
3700: 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d  yte, zErrMsg);.}
3710: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3720: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3730: 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69  symbol zSymbol i
3740: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
3750: 62 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a  brary pHandle..*
3760: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69  /.static void *i
3770: 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nstDlSym(sqlite3
3780: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
3790: 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
37a0: 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b   char *zSymbol){
37b0: 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46  .  return REALVF
37c0: 53 28 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28  S(pVfs)->xDlSym(
37d0: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70  REALVFS(pVfs), p
37e0: 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
37f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
3800: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
3810: 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e  rary handle pHan
3820: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
3830: 6f 69 64 20 69 6e 73 74 44 6c 43 6c 6f 73 65 28  oid instDlClose(
3840: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3850: 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
3860: 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56 66  ){.  REALVFS(pVf
3870: 73 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 52 45 41  s)->xDlClose(REA
3880: 4c 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e  LVFS(pVfs), pHan
3890: 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  dle);.}../*.** P
38a0: 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66  opulate the buff
38b0: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
38c0: 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42   zBufOut with nB
38d0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a  yte bytes of .**
38e0: 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f   random data..*/
38f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
3900: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
3910: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
3920: 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a  t nByte, char *z
3930: 42 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49  BufOut){.  OS_TI
3940: 4d 45 5f 56 46 53 28 20 4f 53 5f 52 41 4e 44 4f  ME_VFS( OS_RANDO
3950: 4d 4e 45 53 53 2c 20 30 2c 20 30 2c 20 6e 42 79  MNESS, 0, 0, nBy
3960: 74 65 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c 56  te, 0,.    REALV
3970: 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f  FS(pVfs)->xRando
3980: 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70 56  mness(REALVFS(pV
3990: 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66  fs), nByte, zBuf
39a0: 4f 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  Out);.  );.}../*
39b0: 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d  .** Sleep for nM
39c0: 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64  icro microsecond
39d0: 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  s. Return the nu
39e0: 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
39f0: 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c  onds .** actuall
3a00: 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  y slept..*/.stat
3a10: 69 63 20 69 6e 74 20 69 6e 73 74 53 6c 65 65 70  ic int instSleep
3a20: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
3a30: 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b  fs, int nMicro){
3a40: 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20  .  OS_TIME_VFS( 
3a50: 4f 53 5f 53 4c 45 45 50 2c 20 30 2c 20 30 2c 20  OS_SLEEP, 0, 0, 
3a60: 6e 4d 69 63 72 6f 2c 20 30 2c 20 0a 20 20 20 20  nMicro, 0, .    
3a70: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78  REALVFS(pVfs)->x
3a80: 53 6c 65 65 70 28 52 45 41 4c 56 46 53 28 70 56  Sleep(REALVFS(pV
3a90: 66 73 29 2c 20 6e 4d 69 63 72 6f 29 20 0a 20 20  fs), nMicro) .  
3aa0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
3ab0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
3ac0: 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ime as a Julian 
3ad0: 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70  Day number in *p
3ae0: 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74  TimeOut..*/.stat
3af0: 69 63 20 69 6e 74 20 69 6e 73 74 43 75 72 72 65  ic int instCurre
3b00: 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
3b10: 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
3b20: 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 4f   *pTimeOut){.  O
3b30: 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 43  S_TIME_VFS( OS_C
3b40: 55 52 52 45 4e 54 54 49 4d 45 2c 20 30 2c 20 30  URRENTTIME, 0, 0
3b50: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c  , 0, 0,.    REAL
3b60: 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72  VFS(pVfs)->xCurr
3b70: 65 6e 74 54 69 6d 65 28 52 45 41 4c 56 46 53 28  entTime(REALVFS(
3b80: 70 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29  pVfs), pTimeOut)
3b90: 20 0a 20 20 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65   .  );.}..sqlite
3ba0: 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 5f 69  3_vfs *sqlite3_i
3bb0: 6e 73 74 76 66 73 5f 63 72 65 61 74 65 28 63 6f  nstvfs_create(co
3bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
3bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
3be0: 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79  rent){.  int nBy
3bf0: 74 65 3b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70  te;.  InstVfs *p
3c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
3c10: 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 70 50 61  *pParent;..  pPa
3c20: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  rent = sqlite3_v
3c30: 66 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 29  fs_find(zParent)
3c40: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 65 6e 74  ;.  if( !pParent
3c50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3c60: 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d  ;.  }..  nByte =
3c70: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
3c80: 20 31 20 2b 20 73 69 7a 65 6f 66 28 49 6e 73 74   1 + sizeof(Inst
3c90: 56 66 73 29 3b 0a 20 20 70 20 3d 20 28 49 6e 73  Vfs);.  p = (Ins
3ca0: 74 56 66 73 20 2a 29 73 71 6c 69 74 65 33 5f 6d  tVfs *)sqlite3_m
3cb0: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
3cc0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
3cd0: 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72  r *zCopy = (char
3ce0: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65   *)&p[1];.    me
3cf0: 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65  mset(p, 0, nByte
3d00: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  );.    memcpy(p,
3d10: 20 26 69 6e 73 74 5f 76 66 73 2c 20 73 69 7a 65   &inst_vfs, size
3d20: 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
3d30: 3b 0a 20 20 20 20 70 2d 3e 70 56 66 73 20 3d 20  ;.    p->pVfs = 
3d40: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 6d 65 6d  pParent;.    mem
3d50: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65  cpy(zCopy, zName
3d60: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
3d70: 3b 0a 20 20 20 20 70 2d 3e 62 61 73 65 2e 7a 4e  ;.    p->base.zN
3d80: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
3d90: 72 20 2a 29 7a 43 6f 70 79 3b 0a 20 20 20 20 70  r *)zCopy;.    p
3da0: 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20  ->base.szOsFile 
3db0: 2b 3d 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73  += pParent->szOs
3dc0: 46 69 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  File;.    sqlite
3dd0: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 28  3_vfs_register((
3de0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 2c  sqlite3_vfs *)p,
3df0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
3e00: 72 6e 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rn (sqlite3_vfs 
3e10: 2a 29 70 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  *)p;.}..void sql
3e20: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e  ite3_instvfs_con
3e30: 66 69 67 75 72 65 28 0a 20 20 73 71 6c 69 74 65  figure(.  sqlite
3e40: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 76  3_vfs *pVfs,.  v
3e50: 6f 69 64 20 28 2a 78 43 61 6c 6c 29 28 0a 20 20  oid (*xCall)(.  
3e60: 20 20 20 20 76 6f 69 64 2a 2c 20 0a 20 20 20 20      void*, .    
3e70: 20 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20    int,          
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2a 20 46 69 6c 65 20 69 64 20 2a 2f 0a 20   /* File id */. 
3ea0: 20 20 20 20 20 69 6e 74 2c 20 20 20 20 20 20 20       int,       
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 2f 2a 20 45 76 65 6e 74 20 63 6f 64      /* Event cod
3ed0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
3ee0: 65 33 5f 69 6e 74 36 34 2c 20 0a 20 20 20 20 20  e3_int64, .     
3ef0: 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20   int,           
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3f20: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
3f30: 61 72 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20  ar*,            
3f40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
3f50: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ame */.      int
3f60: 2c 20 0a 20 20 20 20 20 20 69 6e 74 2c 20 0a 20  , .      int, . 
3f70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
3f80: 36 34 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a  64.  ),.  void *
3f90: 70 43 6c 69 65 6e 74 2c 0a 20 20 76 6f 69 64 20  pClient,.  void 
3fa0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 20 2a 29 0a  (*xDel)(void *).
3fb0: 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20  ){.  InstVfs *p 
3fc0: 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66  = (InstVfs *)pVf
3fd0: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  s;.  assert( pVf
3fe0: 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70  s->xOpen==instOp
3ff0: 65 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 78  en );.  if( p->x
4000: 44 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 78 44  Del ){.    p->xD
4010: 65 6c 28 70 2d 3e 70 43 6c 69 65 6e 74 29 3b 0a  el(p->pClient);.
4020: 20 20 7d 0a 20 20 70 2d 3e 78 43 61 6c 6c 20 3d    }.  p->xCall =
4030: 20 78 43 61 6c 6c 3b 0a 20 20 70 2d 3e 78 44 65   xCall;.  p->xDe
4040: 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 2d 3e 70  l = xDel;.  p->p
4050: 43 6c 69 65 6e 74 20 3d 20 70 43 6c 69 65 6e 74  Client = pClient
4060: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
4070: 33 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f  3_instvfs_destro
4080: 79 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  y(sqlite3_vfs *p
4090: 56 66 73 29 7b 0a 20 20 69 66 28 20 70 56 66 73  Vfs){.  if( pVfs
40a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
40b0: 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70  vfs_unregister(p
40c0: 56 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Vfs);.    sqlite
40d0: 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67  3_instvfs_config
40e0: 75 72 65 28 70 56 66 73 2c 20 30 2c 20 30 2c 20  ure(pVfs, 0, 0, 
40f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
4100: 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a  free(pVfs);.  }.
4110: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  }..void sqlite3_
4120: 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28 73 71  instvfs_reset(sq
4130: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29  lite3_vfs *pVfs)
4140: 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20 3d  {.  InstVfs *p =
4150: 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73   (InstVfs *)pVfs
4160: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
4170: 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65  ->xOpen==instOpe
4180: 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2d  n );.  memset(p-
4190: 3e 61 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f  >aTime, 0, sizeo
41a0: 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  f(sqlite3_int64)
41b0: 2a 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b 0a  *OS_NUMEVENTS);.
41c0: 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 43 6f 75    memset(p->aCou
41d0: 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  nt, 0, sizeof(in
41e0: 74 29 2a 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29  t)*OS_NUMEVENTS)
41f0: 3b 0a 7d 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20  ;.}..const char 
4200: 2a 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73  *sqlite3_instvfs
4210: 5f 6e 61 6d 65 28 69 6e 74 20 65 45 76 65 6e 74  _name(int eEvent
4220: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
4230: 2a 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  *zEvent = 0;..  
4240: 73 77 69 74 63 68 28 20 65 45 76 65 6e 74 20 29  switch( eEvent )
4250: 7b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43 4c  {.    case OS_CL
4260: 4f 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  OSE:            
4270: 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 6c 6f 73   zEvent = "xClos
4280: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  e"; break;.    c
4290: 61 73 65 20 4f 53 5f 52 45 41 44 3a 20 20 20 20  ase OS_READ:    
42a0: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74            zEvent
42b0: 20 3d 20 22 78 52 65 61 64 22 3b 20 62 72 65 61   = "xRead"; brea
42c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 57  k;.    case OS_W
42d0: 52 49 54 45 3a 20 20 20 20 20 20 20 20 20 20 20  RITE:           
42e0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 57 72 69    zEvent = "xWri
42f0: 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  te"; break;.    
4300: 63 61 73 65 20 4f 53 5f 54 52 55 4e 43 41 54 45  case OS_TRUNCATE
4310: 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e  :          zEven
4320: 74 20 3d 20 22 78 54 72 75 6e 63 61 74 65 22 3b  t = "xTruncate";
4330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4340: 20 4f 53 5f 53 59 4e 43 3a 20 20 20 20 20 20 20   OS_SYNC:       
4350: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
4360: 22 78 53 79 6e 63 22 3b 20 62 72 65 61 6b 3b 0a  "xSync"; break;.
4370: 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45      case OS_FILE
4380: 53 49 5a 45 3a 20 20 20 20 20 20 20 20 20 20 7a  SIZE:          z
4390: 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 73 69  Event = "xFilesi
43a0: 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ze"; break;.    
43b0: 63 61 73 65 20 4f 53 5f 4c 4f 43 4b 3a 20 20 20  case OS_LOCK:   
43c0: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
43d0: 74 20 3d 20 22 78 4c 6f 63 6b 22 3b 20 62 72 65  t = "xLock"; bre
43e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
43f0: 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  UNLOCK:         
4400: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 55 6e     zEvent = "xUn
4410: 6c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  lock"; break;.  
4420: 20 20 63 61 73 65 20 4f 53 5f 43 48 45 43 4b 52    case OS_CHECKR
4430: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 20 7a 45 76  ESERVEDLOCK: zEv
4440: 65 6e 74 20 3d 20 22 78 43 68 65 63 6b 52 65 73  ent = "xCheckRes
4450: 65 72 76 65 64 4c 6f 63 6b 22 3b 20 62 72 65 61  ervedLock"; brea
4460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46  k;.    case OS_F
4470: 49 4c 45 43 4f 4e 54 52 4f 4c 3a 20 20 20 20 20  ILECONTROL:     
4480: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c    zEvent = "xFil
4490: 65 43 6f 6e 74 72 6f 6c 22 3b 20 62 72 65 61 6b  eControl"; break
44a0: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 45  ;.    case OS_SE
44b0: 43 54 4f 52 53 49 5a 45 3a 20 20 20 20 20 20 20  CTORSIZE:       
44c0: 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 65 63 74   zEvent = "xSect
44d0: 6f 72 53 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a  orSize"; break;.
44e0: 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45 56 43      case OS_DEVC
44f0: 48 41 52 3a 20 20 20 20 20 20 20 20 20 20 20 7a  HAR:           z
4500: 45 76 65 6e 74 20 3d 20 22 78 44 65 76 69 63 65  Event = "xDevice
4510: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 22  Characteristics"
4520: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4530: 65 20 4f 53 5f 4f 50 45 4e 3a 20 20 20 20 20 20  e OS_OPEN:      
4540: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
4550: 20 22 78 4f 70 65 6e 22 3b 20 62 72 65 61 6b 3b   "xOpen"; break;
4560: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45 4c  .    case OS_DEL
4570: 45 54 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ETE:            
4580: 7a 45 76 65 6e 74 20 3d 20 22 78 44 65 6c 65 74  zEvent = "xDelet
4590: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  e"; break;.    c
45a0: 61 73 65 20 4f 53 5f 41 43 43 45 53 53 3a 20 20  ase OS_ACCESS:  
45b0: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74            zEvent
45c0: 20 3d 20 22 78 41 63 63 65 73 73 22 3b 20 62 72   = "xAccess"; br
45d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
45e0: 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 3a 20 20  _FULLPATHNAME:  
45f0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 46      zEvent = "xF
4600: 75 6c 6c 50 61 74 68 6e 61 6d 65 22 3b 20 62 72  ullPathname"; br
4610: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
4620: 5f 52 41 4e 44 4f 4d 4e 45 53 53 3a 20 20 20 20  _RANDOMNESS:    
4630: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 52      zEvent = "xR
4640: 61 6e 64 6f 6d 6e 65 73 73 22 3b 20 62 72 65 61  andomness"; brea
4650: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53  k;.    case OS_S
4660: 4c 45 45 50 3a 20 20 20 20 20 20 20 20 20 20 20  LEEP:           
4670: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 6c 65    zEvent = "xSle
4680: 65 70 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ep"; break;.    
4690: 63 61 73 65 20 4f 53 5f 43 55 52 52 45 4e 54 54  case OS_CURRENTT
46a0: 49 4d 45 3a 20 20 20 20 20 20 20 7a 45 76 65 6e  IME:       zEven
46b0: 74 20 3d 20 22 78 43 75 72 72 65 6e 74 54 69 6d  t = "xCurrentTim
46c0: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  e"; break;.  }..
46d0: 20 20 72 65 74 75 72 6e 20 7a 45 76 65 6e 74 3b    return zEvent;
46e0: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
46f0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 0a 20 20  _instvfs_get(.  
4700: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
4710: 73 2c 20 0a 20 20 69 6e 74 20 65 45 76 65 6e 74  s, .  int eEvent
4720: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
4730: 2a 2a 70 7a 45 76 65 6e 74 2c 20 0a 20 20 73 71  **pzEvent, .  sq
4740: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 43  lite3_int64 *pnC
4750: 6c 69 63 6b 2c 20 0a 20 20 69 6e 74 20 2a 70 6e  lick, .  int *pn
4760: 43 61 6c 6c 0a 29 7b 0a 20 20 49 6e 73 74 56 66  Call.){.  InstVf
4770: 73 20 2a 70 20 3d 20 28 49 6e 73 74 56 66 73 20  s *p = (InstVfs 
4780: 2a 29 70 56 66 73 3b 0a 20 20 61 73 73 65 72 74  *)pVfs;.  assert
4790: 28 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69  ( pVfs->xOpen==i
47a0: 6e 73 74 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28  nstOpen );.  if(
47b0: 20 65 45 76 65 6e 74 3c 31 20 7c 7c 20 65 45 76   eEvent<1 || eEv
47c0: 65 6e 74 3e 3d 4f 53 5f 4e 55 4d 45 56 45 4e 54  ent>=OS_NUMEVENT
47d0: 53 20 29 7b 0a 20 20 20 20 2a 70 7a 45 76 65 6e  S ){.    *pzEven
47e0: 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6c  t = 0;.    *pnCl
47f0: 69 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  ick = 0;.    *pn
4800: 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  Call = 0;.    re
4810: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a  turn;.  }..  *pz
4820: 45 76 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  Event = sqlite3_
4830: 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65 45 76  instvfs_name(eEv
4840: 65 6e 74 29 3b 0a 20 20 2a 70 6e 43 6c 69 63 6b  ent);.  *pnClick
4850: 20 3d 20 70 2d 3e 61 54 69 6d 65 5b 65 45 76 65   = p->aTime[eEve
4860: 6e 74 5d 3b 0a 20 20 2a 70 6e 43 61 6c 6c 20 3d  nt];.  *pnCall =
4870: 20 70 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65 6e   p->aCount[eEven
4880: 74 5d 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42  t];.}..#define B
4890: 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53  INARYLOG_BUFFERS
48a0: 49 5a 45 20 38 31 39 32 0a 0a 73 74 72 75 63 74  IZE 8192..struct
48b0: 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f   InstVfsBinaryLo
48c0: 67 20 7b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a  g {.  int nBuf;.
48d0: 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20    char *zBuf;.  
48e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
48f0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6c 6f 67  ffset;.  int log
4900: 5f 64 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33  _data;.  sqlite3
4910: 5f 66 69 6c 65 20 2a 70 4f 75 74 3b 0a 20 20 63  _file *pOut;.  c
4920: 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20  har *zOut;      
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 6e 61 6d   /* Log file nam
4950: 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  e */.};.typedef 
4960: 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 42 69  struct InstVfsBi
4970: 6e 61 72 79 4c 6f 67 20 49 6e 73 74 56 66 73 42  naryLog InstVfsB
4980: 69 6e 61 72 79 4c 6f 67 3b 0a 0a 73 74 61 74 69  inaryLog;..stati
4990: 63 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73  c void put32bits
49a0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
49b0: 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  p, unsigned int 
49c0: 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e 3e  v){.  p[0] = v>>
49d0: 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e 3e  24;.  p[1] = v>>
49e0: 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e 3e  16;.  p[2] = v>>
49f0: 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a 7d  8;.  p[3] = v;.}
4a00: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 69  ..static void bi
4a10: 6e 61 72 79 6c 6f 67 5f 66 6c 75 73 68 28 49 6e  narylog_flush(In
4a20: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a  stVfsBinaryLog *
4a30: 70 4c 6f 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  pLog){.  sqlite3
4a40: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 70  _file *pFile = p
4a50: 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 0a 23 69 66 64  Log->pOut;..#ifd
4a60: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4a70: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
4a80: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
4a90: 64 69 6e 67 3b 0a 20 20 65 78 74 65 72 6e 20 69  ding;.  extern i
4aa0: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
4ab0: 72 6f 72 5f 70 65 72 73 69 73 74 3b 0a 20 20 65  ror_persist;.  e
4ac0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
4ad0: 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69  3_diskfull_pendi
4ae0: 6e 67 3b 0a 0a 20 20 69 6e 74 20 70 65 6e 64 69  ng;..  int pendi
4af0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ng = sqlite3_io_
4b00: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
4b10: 20 69 6e 74 20 70 65 72 73 69 73 74 20 3d 20 73   int persist = s
4b20: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
4b30: 70 65 72 73 69 73 74 3b 0a 20 20 69 6e 74 20 64  persist;.  int d
4b40: 69 73 6b 66 75 6c 6c 20 3d 20 73 71 6c 69 74 65  iskfull = sqlite
4b50: 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69  3_diskfull_pendi
4b60: 6e 67 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 69  ng;..  sqlite3_i
4b70: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
4b80: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
4b90: 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20  o_error_persist 
4ba0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64  = 0;.  sqlite3_d
4bb0: 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 20  iskfull_pending 
4bc0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 70  = 0;.#endif..  p
4bd0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  File->pMethods->
4be0: 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20 70 4c  xWrite(pFile, pL
4bf0: 6f 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 2d 3e  og->zBuf, pLog->
4c00: 6e 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f 66 66  nBuf, pLog->iOff
4c10: 73 65 74 29 3b 0a 20 20 70 4c 6f 67 2d 3e 69 4f  set);.  pLog->iO
4c20: 66 66 73 65 74 20 2b 3d 20 70 4c 6f 67 2d 3e 6e  ffset += pLog->n
4c30: 42 75 66 3b 0a 20 20 70 4c 6f 67 2d 3e 6e 42 75  Buf;.  pLog->nBu
4c40: 66 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  f = 0;..#ifdef S
4c50: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
4c60: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
4c70: 6e 64 69 6e 67 20 3d 20 70 65 6e 64 69 6e 67 3b  nding = pending;
4c80: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
4c90: 72 6f 72 5f 70 65 72 73 69 73 74 20 3d 20 70 65  ror_persist = pe
4ca0: 72 73 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  rsist;.  sqlite3
4cb0: 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e  _diskfull_pendin
4cc0: 67 20 3d 20 64 69 73 6b 66 75 6c 6c 3b 0a 23 65  g = diskfull;.#e
4cd0: 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ndif.}..static v
4ce0: 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f 78 63  oid binarylog_xc
4cf0: 61 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  all(.  void *p,.
4d00: 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 0a 20 20    int eEvent,.  
4d10: 69 6e 74 20 69 46 69 6c 65 49 64 2c 0a 20 20 73  int iFileId,.  s
4d20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 43 6c  qlite3_int64 nCl
4d30: 69 63 6b 2c 0a 20 20 69 6e 74 20 72 65 74 75 72  ick,.  int retur
4d40: 6e 5f 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  n_code,.  const 
4d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
4d60: 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20  nt flags,.  int 
4d70: 6e 42 79 74 65 2c 0a 20 20 73 71 6c 69 74 65 33  nByte,.  sqlite3
4d80: 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 0a 29  _int64 iOffset.)
4d90: 7b 0a 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72  {.  InstVfsBinar
4da0: 79 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e  yLog *pLog = (In
4db0: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a  stVfsBinaryLog *
4dc0: 29 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  )p;.  unsigned c
4dd0: 68 61 72 20 2a 7a 52 65 63 3b 0a 20 20 69 66 28  har *zRec;.  if(
4de0: 20 28 32 38 2b 70 4c 6f 67 2d 3e 6e 42 75 66 29   (28+pLog->nBuf)
4df0: 3e 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45  >BINARYLOG_BUFFE
4e00: 52 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 69 6e  RSIZE ){.    bin
4e10: 61 72 79 6c 6f 67 5f 66 6c 75 73 68 28 70 4c 6f  arylog_flush(pLo
4e20: 67 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 63 20 3d  g);.  }.  zRec =
4e30: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4e40: 2a 29 26 70 4c 6f 67 2d 3e 7a 42 75 66 5b 70 4c  *)&pLog->zBuf[pL
4e50: 6f 67 2d 3e 6e 42 75 66 5d 3b 0a 20 20 70 75 74  og->nBuf];.  put
4e60: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 30 5d 2c  32bits(&zRec[0],
4e70: 20 65 45 76 65 6e 74 29 3b 0a 20 20 70 75 74 33   eEvent);.  put3
4e80: 32 62 69 74 73 28 26 7a 52 65 63 5b 34 5d 2c 20  2bits(&zRec[4], 
4e90: 28 69 6e 74 29 69 46 69 6c 65 49 64 29 3b 0a 20  (int)iFileId);. 
4ea0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63   put32bits(&zRec
4eb0: 5b 38 5d 2c 20 28 69 6e 74 29 6e 43 6c 69 63 6b  [8], (int)nClick
4ec0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
4ed0: 7a 52 65 63 5b 31 32 5d 2c 20 72 65 74 75 72 6e  zRec[12], return
4ee0: 5f 63 6f 64 65 29 3b 0a 20 20 70 75 74 33 32 62  _code);.  put32b
4ef0: 69 74 73 28 26 7a 52 65 63 5b 31 36 5d 2c 20 66  its(&zRec[16], f
4f00: 6c 61 67 73 29 3b 0a 20 20 70 75 74 33 32 62 69  lags);.  put32bi
4f10: 74 73 28 26 7a 52 65 63 5b 32 30 5d 2c 20 6e 42  ts(&zRec[20], nB
4f20: 79 74 65 29 3b 0a 20 20 70 75 74 33 32 62 69 74  yte);.  put32bit
4f30: 73 28 26 7a 52 65 63 5b 32 34 5d 2c 20 28 69 6e  s(&zRec[24], (in
4f40: 74 29 69 4f 66 66 73 65 74 29 3b 0a 20 20 70 4c  t)iOffset);.  pL
4f50: 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 32 38 3b 0a  og->nBuf += 28;.
4f60: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  }..static void b
4f70: 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28 76 6f  inarylog_xdel(vo
4f80: 69 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 43 6c 6f  id *p){.  /* Clo
4f90: 73 65 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  se the log file 
4fa0: 61 6e 64 20 66 72 65 65 20 74 68 65 20 6d 65 6d  and free the mem
4fb0: 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ory allocated fo
4fc0: 72 20 74 68 65 20 0a 20 20 2a 2a 20 49 6e 73 74  r the .  ** Inst
4fd0: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 73 74 72  VfsBinaryLog str
4fe0: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 49  ucture..  */.  I
4ff0: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
5000: 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74 56 66 73  *pLog = (InstVfs
5010: 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70 3b 0a 20  BinaryLog *)p;. 
5020: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
5030: 46 69 6c 65 20 3d 20 70 4c 6f 67 2d 3e 70 4f 75  File = pLog->pOu
5040: 74 3b 0a 20 20 69 66 28 20 70 4c 6f 67 2d 3e 6e  t;.  if( pLog->n
5050: 42 75 66 20 29 7b 0a 20 20 20 20 62 69 6e 61 72  Buf ){.    binar
5060: 79 6c 6f 67 5f 66 6c 75 73 68 28 70 4c 6f 67 29  ylog_flush(pLog)
5070: 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70  ;.  }.  pFile->p
5080: 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28  Methods->xClose(
5090: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
50a0: 33 5f 66 72 65 65 28 70 4c 6f 67 2d 3e 70 4f 75  3_free(pLog->pOu
50b0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
50c0: 65 65 28 70 4c 6f 67 2d 3e 7a 42 75 66 29 3b 0a  ee(pLog->zBuf);.
50d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
50e0: 4c 6f 67 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Log);.}..static 
50f0: 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f 62  void binarylog_b
5100: 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  lob(.  sqlite3_v
5110: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
5120: 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 2c 0a 20  t char *zBlob,. 
5130: 20 69 6e 74 20 6e 42 6c 6f 62 2c 0a 20 20 69 6e   int nBlob,.  in
5140: 74 20 69 73 42 69 6e 61 72 79 0a 29 7b 0a 20 20  t isBinary.){.  
5150: 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67  InstVfsBinaryLog
5160: 20 2a 70 4c 6f 67 3b 0a 20 20 49 6e 73 74 56 66   *pLog;.  InstVf
5170: 73 20 2a 70 49 6e 73 74 56 66 73 20 3d 20 28 49  s *pInstVfs = (I
5180: 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 0a  nstVfs *)pVfs;..
5190: 20 20 69 66 28 20 70 56 66 73 2d 3e 78 4f 70 65    if( pVfs->xOpe
51a0: 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 7c 7c 20 70  n!=instOpen || p
51b0: 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 21 3d  InstVfs->xCall!=
51c0: 62 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 20  binarylog_xcall 
51d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
51e0: 20 7d 0a 20 20 70 4c 6f 67 20 3d 20 28 49 6e 73   }.  pLog = (Ins
51f0: 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29  tVfsBinaryLog *)
5200: 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65 6e  pInstVfs->pClien
5210: 74 3b 0a 20 20 69 66 28 20 21 69 73 42 69 6e 61  t;.  if( !isBina
5220: 72 79 20 7c 7c 20 70 4c 6f 67 2d 3e 6c 6f 67 5f  ry || pLog->log_
5230: 64 61 74 61 20 29 7b 0a 20 20 20 20 75 6e 73 69  data ){.    unsi
5240: 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 63 3b  gned char *zRec;
5250: 0a 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b  .    int nWrite;
5260: 0a 0a 20 20 20 20 69 66 28 20 6e 42 6c 6f 62 3c  ..    if( nBlob<
5270: 30 20 29 7b 0a 20 20 20 20 20 20 6e 42 6c 6f 62  0 ){.      nBlob
5280: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 6c 6f 62 29   = strlen(zBlob)
5290: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 57 72 69  ;.    }.    nWri
52a0: 74 65 20 3d 20 6e 42 6c 6f 62 20 2b 20 32 38 3b  te = nBlob + 28;
52b0: 0a 20 20 0a 20 20 20 20 69 66 28 20 28 6e 57 72  .  .    if( (nWr
52c0: 69 74 65 2b 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e  ite+pLog->nBuf)>
52d0: 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52  BINARYLOG_BUFFER
52e0: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 62 69  SIZE ){.      bi
52f0: 6e 61 72 79 6c 6f 67 5f 66 6c 75 73 68 28 70 4c  narylog_flush(pL
5300: 6f 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  og);.    }.  .  
5310: 20 20 7a 52 65 63 20 3d 20 28 75 6e 73 69 67 6e    zRec = (unsign
5320: 65 64 20 63 68 61 72 20 2a 29 26 70 4c 6f 67 2d  ed char *)&pLog-
5330: 3e 7a 42 75 66 5b 70 4c 6f 67 2d 3e 6e 42 75 66  >zBuf[pLog->nBuf
5340: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 52  ];.    memset(zR
5350: 65 63 2c 20 30 2c 20 6e 57 72 69 74 65 29 3b 0a  ec, 0, nWrite);.
5360: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
5370: 52 65 63 5b 30 5d 2c 20 42 49 4e 41 52 59 4c 4f  Rec[0], BINARYLO
5380: 47 5f 53 54 52 49 4e 47 29 3b 0a 20 20 20 20 70  G_STRING);.    p
5390: 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 34  ut32bits(&zRec[4
53a0: 5d 2c 20 28 69 6e 74 29 6e 42 6c 6f 62 29 3b 0a  ], (int)nBlob);.
53b0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
53c0: 52 65 63 5b 38 5d 2c 20 28 69 6e 74 29 69 73 42  Rec[8], (int)isB
53d0: 69 6e 61 72 79 29 3b 0a 20 20 20 20 6d 65 6d 63  inary);.    memc
53e0: 70 79 28 26 7a 52 65 63 5b 32 38 5d 2c 20 7a 42  py(&zRec[28], zB
53f0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
5400: 20 70 4c 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 6e   pLog->nBuf += n
5410: 57 72 69 74 65 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  Write;.  }.}..vo
5420: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76  id sqlite3_instv
5430: 66 73 5f 62 69 6e 61 72 79 6c 6f 67 5f 63 61 6c  fs_binarylog_cal
5440: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
5450: 20 2a 70 56 66 73 2c 0a 20 20 69 6e 74 20 65 45   *pVfs,.  int eE
5460: 76 65 6e 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f  vent,.  sqlite3_
5470: 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20  int64 nClick,.  
5480: 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c  int return_code,
5490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
54a0: 53 74 72 69 6e 67 0a 29 7b 0a 20 20 49 6e 73 74  String.){.  Inst
54b0: 56 66 73 20 2a 70 49 6e 73 74 56 66 73 20 3d 20  Vfs *pInstVfs = 
54c0: 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b  (InstVfs *)pVfs;
54d0: 0a 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79  .  InstVfsBinary
54e0: 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e 73  Log *pLog = (Ins
54f0: 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29  tVfsBinaryLog *)
5500: 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65 6e  pInstVfs->pClien
5510: 74 3b 0a 0a 20 20 69 66 28 20 7a 53 74 72 69 6e  t;..  if( zStrin
5520: 67 20 29 7b 0a 20 20 20 20 62 69 6e 61 72 79 6c  g ){.    binaryl
5530: 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 53  og_blob(pVfs, zS
5540: 74 72 69 6e 67 2c 20 2d 31 2c 20 30 29 3b 0a 20  tring, -1, 0);. 
5550: 20 7d 0a 20 20 62 69 6e 61 72 79 6c 6f 67 5f 78   }.  binarylog_x
5560: 63 61 6c 6c 28 70 4c 6f 67 2c 20 65 45 76 65 6e  call(pLog, eEven
5570: 74 2c 20 30 2c 20 6e 43 6c 69 63 6b 2c 20 72 65  t, 0, nClick, re
5580: 74 75 72 6e 5f 63 6f 64 65 2c 20 30 2c 20 30 2c  turn_code, 0, 0,
5590: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 76 6f 69 64 20   0, 0);.}..void 
55a0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
55b0: 62 69 6e 61 72 79 6c 6f 67 5f 6d 61 72 6b 65 72  binarylog_marker
55c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
55d0: 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
55e0: 68 61 72 20 2a 7a 4d 61 72 6b 65 72 0a 29 7b 0a  har *zMarker.){.
55f0: 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74    InstVfs *pInst
5600: 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a  Vfs = (InstVfs *
5610: 29 70 56 66 73 3b 0a 20 20 49 6e 73 74 56 66 73  )pVfs;.  InstVfs
5620: 42 69 6e 61 72 79 4c 6f 67 20 2a 70 4c 6f 67 20  BinaryLog *pLog 
5630: 3d 20 28 49 6e 73 74 56 66 73 42 69 6e 61 72 79  = (InstVfsBinary
5640: 4c 6f 67 20 2a 29 70 49 6e 73 74 56 66 73 2d 3e  Log *)pInstVfs->
5650: 70 43 6c 69 65 6e 74 3b 0a 20 20 62 69 6e 61 72  pClient;.  binar
5660: 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20  ylog_blob(pVfs, 
5670: 7a 4d 61 72 6b 65 72 2c 20 2d 31 2c 20 30 29 3b  zMarker, -1, 0);
5680: 0a 20 20 62 69 6e 61 72 79 6c 6f 67 5f 78 63 61  .  binarylog_xca
5690: 6c 6c 28 70 4c 6f 67 2c 20 42 49 4e 41 52 59 4c  ll(pLog, BINARYL
56a0: 4f 47 5f 4d 41 52 4b 45 52 2c 20 30 2c 20 30 2c  OG_MARKER, 0, 0,
56b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   0, 0, 0, 0, 0);
56c0: 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 76 66 73 20  .}..sqlite3_vfs 
56d0: 2a 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73  *sqlite3_instvfs
56e0: 5f 62 69 6e 61 72 79 6c 6f 67 28 0a 20 20 63 6f  _binarylog(.  co
56f0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 0a  nst char *zVfs,.
5700: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
5710: 61 72 65 6e 74 56 66 73 2c 20 0a 20 20 63 6f 6e  arentVfs, .  con
5720: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67 2c 0a 20  st char *zLog,. 
5730: 20 69 6e 74 20 6c 6f 67 5f 64 61 74 61 0a 29 7b   int log_data.){
5740: 0a 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79  .  InstVfsBinary
5750: 4c 6f 67 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  Log *p;.  sqlite
5760: 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 73  3_vfs *pVfs;.  s
5770: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61 72  qlite3_vfs *pPar
5780: 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ent;.  int nByte
5790: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
57a0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 50 61 72   int rc;..  pPar
57b0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ent = sqlite3_vf
57c0: 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 56 66  s_find(zParentVf
57d0: 73 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 65  s);.  if( !pPare
57e0: 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
57f0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65   0;.  }..  nByte
5800: 20 3d 20 73 69 7a 65 6f 66 28 49 6e 73 74 56 66   = sizeof(InstVf
5810: 73 42 69 6e 61 72 79 4c 6f 67 29 20 2b 20 70 50  sBinaryLog) + pP
5820: 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61 6d  arent->mxPathnam
5830: 65 2b 31 3b 0a 20 20 70 20 3d 20 28 49 6e 73 74  e+1;.  p = (Inst
5840: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29 73  VfsBinaryLog *)s
5850: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
5860: 79 74 65 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  yte);.  memset(p
5870: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  , 0, nByte);.  p
5880: 2d 3e 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33  ->zBuf = sqlite3
5890: 5f 6d 61 6c 6c 6f 63 28 42 49 4e 41 52 59 4c 4f  _malloc(BINARYLO
58a0: 47 5f 42 55 46 46 45 52 53 49 5a 45 29 3b 0a 20  G_BUFFERSIZE);. 
58b0: 20 70 2d 3e 7a 4f 75 74 20 3d 20 28 63 68 61 72   p->zOut = (char
58c0: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70   *)&p[1];.  p->p
58d0: 4f 75 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  Out = (sqlite3_f
58e0: 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ile *)sqlite3_ma
58f0: 6c 6c 6f 63 28 70 50 61 72 65 6e 74 2d 3e 73 7a  lloc(pParent->sz
5900: 4f 73 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 6c 6f  OsFile);.  p->lo
5910: 67 5f 64 61 74 61 20 3d 20 6c 6f 67 5f 64 61 74  g_data = log_dat
5920: 61 3b 0a 20 20 70 50 61 72 65 6e 74 2d 3e 78 46  a;.  pParent->xF
5930: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 50 61 72  ullPathname(pPar
5940: 65 6e 74 2c 20 7a 4c 6f 67 2c 20 70 50 61 72 65  ent, zLog, pPare
5950: 6e 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  nt->mxPathname, 
5960: 70 2d 3e 7a 4f 75 74 29 3b 0a 20 20 66 6c 61 67  p->zOut);.  flag
5970: 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
5980: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
5990: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
59a0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
59b0: 4a 4f 55 52 4e 41 4c 3b 0a 20 20 70 50 61 72 65  JOURNAL;.  pPare
59c0: 6e 74 2d 3e 78 44 65 6c 65 74 65 28 70 50 61 72  nt->xDelete(pPar
59d0: 65 6e 74 2c 20 70 2d 3e 7a 4f 75 74 2c 20 30 29  ent, p->zOut, 0)
59e0: 3b 0a 20 20 72 63 20 3d 20 70 50 61 72 65 6e 74  ;.  rc = pParent
59f0: 2d 3e 78 4f 70 65 6e 28 70 50 61 72 65 6e 74 2c  ->xOpen(pParent,
5a00: 20 70 2d 3e 7a 4f 75 74 2c 20 70 2d 3e 70 4f 75   p->zOut, p->pOu
5a10: 74 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67 73  t, flags, &flags
5a20: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
5a30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
5a40: 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2c 20 22 73  mcpy(p->zBuf, "s
5a50: 71 6c 69 74 65 5f 6f 73 74 72 61 63 65 31 2e 2e  qlite_ostrace1..
5a60: 2e 2e 2e 22 2c 20 32 30 29 3b 0a 20 20 20 20 70  ...", 20);.    p
5a70: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
5a80: 20 20 20 70 2d 3e 6e 42 75 66 20 3d 20 32 30 3b     p->nBuf = 20;
5a90: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
5aa0: 0a 20 20 20 20 62 69 6e 61 72 79 6c 6f 67 5f 78  .    binarylog_x
5ab0: 64 65 6c 28 70 29 3b 0a 20 20 20 20 72 65 74 75  del(p);.    retu
5ac0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 56 66  rn 0;.  }..  pVf
5ad0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  s = sqlite3_inst
5ae0: 76 66 73 5f 63 72 65 61 74 65 28 7a 56 66 73 2c  vfs_create(zVfs,
5af0: 20 7a 50 61 72 65 6e 74 56 66 73 29 3b 0a 20 20   zParentVfs);.  
5b00: 69 66 28 20 70 56 66 73 20 29 7b 0a 20 20 20 20  if( pVfs ){.    
5b10: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
5b20: 63 6f 6e 66 69 67 75 72 65 28 70 56 66 73 2c 20  configure(pVfs, 
5b30: 62 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 2c  binarylog_xcall,
5b40: 20 70 2c 20 62 69 6e 61 72 79 6c 6f 67 5f 78 64   p, binarylog_xd
5b50: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  el);.  }..  retu
5b60: 72 6e 20 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 2a 2a  rn pVfs;.}../***
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bb0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
5bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72  ***.** Tcl inter
5c10: 66 61 63 65 20 73 74 61 72 74 73 20 68 65 72 65  face starts here
5c20: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
5c30: 54 45 53 54 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  TEST..#include <
5c40: 74 63 6c 2e 68 3e 0a 0a 73 74 72 75 63 74 20 49  tcl.h>..struct I
5c50: 6e 73 74 56 66 73 43 61 6c 6c 20 7b 0a 20 20 54  nstVfsCall {.  T
5c60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5c70: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  p;.  Tcl_Obj *pS
5c80: 63 72 69 70 74 3b 0a 7d 3b 0a 74 79 70 65 64 65  cript;.};.typede
5c90: 66 20 73 74 72 75 63 74 20 49 6e 73 74 56 66 73  f struct InstVfs
5ca0: 43 61 6c 6c 20 49 6e 73 74 56 66 73 43 61 6c 6c  Call InstVfsCall
5cb0: 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  ;..static void t
5cc0: 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 63 61 6c  est_instvfs_xcal
5cd0: 6c 28 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  l(.  void *p,.  
5ce0: 69 6e 74 20 65 45 76 65 6e 74 2c 0a 20 20 69 6e  int eEvent,.  in
5cf0: 74 20 69 46 69 6c 65 49 64 2c 0a 20 20 73 71 6c  t iFileId,.  sql
5d00: 69 74 65 33 5f 69 6e 74 36 34 20 6e 43 6c 69 63  ite3_int64 nClic
5d10: 6b 2c 0a 20 20 69 6e 74 20 72 65 74 75 72 6e 5f  k,.  int return_
5d20: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
5d30: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
5d40: 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 6e 42   flags,.  int nB
5d50: 79 74 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  yte,.  sqlite3_i
5d60: 6e 74 36 34 20 69 4f 66 66 73 65 74 0a 29 7b 0a  nt64 iOffset.){.
5d70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 49 6e 73 74    int rc;.  Inst
5d80: 56 66 73 43 61 6c 6c 20 2a 70 43 61 6c 6c 20 3d  VfsCall *pCall =
5d90: 20 28 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 29   (InstVfsCall *)
5da0: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  p;.  Tcl_Obj *pO
5db0: 62 6a 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  bj = Tcl_Duplica
5dc0: 74 65 4f 62 6a 28 20 70 43 61 6c 6c 2d 3e 70 53  teObj( pCall->pS
5dd0: 63 72 69 70 74 29 3b 0a 20 20 63 6f 6e 73 74 20  cript);.  const 
5de0: 63 68 61 72 20 2a 7a 45 76 65 6e 74 20 3d 20 73  char *zEvent = s
5df0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 6e  qlite3_instvfs_n
5e00: 61 6d 65 28 65 45 76 65 6e 74 29 3b 0a 0a 20 20  ame(eEvent);..  
5e10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5e20: 28 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pObj);.  Tcl_Li
5e30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5e40: 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f  nt(0, pObj, Tcl_
5e50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 76  NewStringObj(zEv
5e60: 65 6e 74 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ent, -1));.  Tcl
5e70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5e80: 65 6d 65 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54  ement(0, pObj, T
5e90: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
5ea0: 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20 54 63 6c  (nClick));.  Tcl
5eb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5ec0: 65 6d 65 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54  ement(0, pObj, T
5ed0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5ee0: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54  zName, -1));.  T
5ef0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5f00: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4f 62 6a 2c  Element(0, pObj,
5f10: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
5f20: 42 79 74 65 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  Byte));.  Tcl_Li
5f30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5f40: 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f  nt(0, pObj, Tcl_
5f50: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4f  NewWideIntObj(iO
5f60: 66 66 73 65 74 29 29 3b 0a 0a 20 20 72 63 20 3d  ffset));..  rc =
5f70: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5f80: 43 61 6c 6c 2d 3e 69 6e 74 65 72 70 2c 20 70 4f  Call->interp, pO
5f90: 62 6a 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  bj, TCL_EVAL_GLO
5fa0: 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52  BAL|TCL_EVAL_DIR
5fb0: 45 43 54 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ECT);.  if( rc )
5fc0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
5fd0: 6f 75 6e 64 45 72 72 6f 72 28 70 43 61 6c 6c 2d  oundError(pCall-
5fe0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20  >interp);.  }.  
5ff0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6000: 28 70 4f 62 6a 29 3b 0a 7d 0a 0a 73 74 61 74 69  (pObj);.}..stati
6010: 63 20 76 6f 69 64 20 74 65 73 74 5f 69 6e 73 74  c void test_inst
6020: 76 66 73 5f 78 64 65 6c 28 76 6f 69 64 20 2a 70  vfs_xdel(void *p
6030: 29 7b 0a 20 20 49 6e 73 74 56 66 73 43 61 6c 6c  ){.  InstVfsCall
6040: 20 2a 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56   *pCall = (InstV
6050: 66 73 43 61 6c 6c 20 2a 29 70 3b 0a 20 20 54 63  fsCall *)p;.  Tc
6060: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6070: 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Call->pScript);.
6080: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6090: 43 61 6c 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Call);.}..static
60a0: 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
60b0: 33 5f 69 6e 73 74 76 66 73 28 0a 20 20 76 6f 69  3_instvfs(.  voi
60c0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
60d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
60e0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
60f0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
6100: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
6110: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6120: 20 2a 49 56 5f 73 74 72 73 5b 5d 20 3d 20 0a 20   *IV_strs[] = . 
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
6140: 22 63 72 65 61 74 65 22 2c 20 20 22 64 65 73 74  "create",  "dest
6150: 72 6f 79 22 2c 20 20 22 72 65 73 65 74 22 2c 20  roy",  "reset", 
6160: 20 22 72 65 70 6f 72 74 22 2c 20 22 63 6f 6e 66   "report", "conf
6170: 69 67 75 72 65 22 2c 20 22 62 69 6e 61 72 79 6c  igure", "binaryl
6180: 6f 67 22 2c 20 22 6d 61 72 6b 65 72 22 2c 20 30  og", "marker", 0
6190: 20 7d 3b 0a 20 20 65 6e 75 6d 20 49 56 5f 65 6e   };.  enum IV_en
61a0: 75 6d 20 7b 20 49 56 5f 43 52 45 41 54 45 2c 20  um { IV_CREATE, 
61b0: 49 56 5f 44 45 53 54 52 4f 59 2c 20 49 56 5f 52  IV_DESTROY, IV_R
61c0: 45 53 45 54 2c 20 49 56 5f 52 45 50 4f 52 54 2c  ESET, IV_REPORT,
61d0: 20 49 56 5f 43 4f 4e 46 49 47 55 52 45 2c 20 49   IV_CONFIGURE, I
61e0: 56 5f 42 49 4e 41 52 59 4c 4f 47 2c 20 49 56 5f  V_BINARYLOG, IV_
61f0: 4d 41 52 4b 45 52 20 7d 3b 0a 20 20 69 6e 74 20  MARKER };.  int 
6200: 69 53 75 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  iSub;..  if( obj
6210: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
6220: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6230: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
6240: 42 2d 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  B-COMMAND ...");
6250: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
6260: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
6270: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
6280: 49 56 5f 73 74 72 73 2c 20 22 73 75 62 2d 63 6f  IV_strs, "sub-co
6290: 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69 53 75 62  mmand", 0, &iSub
62a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
62b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
62c0: 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
62d0: 49 56 5f 65 6e 75 6d 29 69 53 75 62 20 29 7b 0a  IV_enum)iSub ){.
62e0: 20 20 20 20 63 61 73 65 20 49 56 5f 43 52 45 41      case IV_CREA
62f0: 54 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  TE: {.      char
6300: 20 2a 7a 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20   *zParent = 0;. 
6310: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
6320: 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
6330: 73 44 65 66 61 75 6c 74 20 3d 20 30 3b 0a 20 20  sDefault = 0;.  
6340: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 26      if( objc>2 &
6350: 26 20 30 3d 3d 73 74 72 63 6d 70 28 22 2d 64 65  & 0==strcmp("-de
6360: 66 61 75 6c 74 22 2c 20 54 63 6c 5f 47 65 74 53  fault", Tcl_GetS
6370: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
6380: 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 65 66  ){.        isDef
6390: 61 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  ault = 1;.      
63a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 6a  }.      if( (obj
63b0: 63 2d 69 73 44 65 66 61 75 6c 74 29 21 3d 34 20  c-isDefault)!=4 
63c0: 26 26 20 28 6f 62 6a 63 2d 69 73 44 65 66 61 75  && (objc-isDefau
63d0: 6c 74 29 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  lt)!=3 ){.      
63e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
63f0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6400: 6a 76 2c 20 22 3f 2d 64 65 66 61 75 6c 74 3f 20  jv, "?-default? 
6410: 4e 41 4d 45 20 3f 50 41 52 45 4e 54 2d 56 46 53  NAME ?PARENT-VFS
6420: 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ?");.        ret
6430: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6450: 20 6f 62 6a 63 3d 3d 28 34 2b 69 73 44 65 66 61   objc==(4+isDefa
6460: 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
6470: 7a 50 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65  zParent = Tcl_Ge
6480: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 2b 69  tString(objv[3+i
6490: 73 44 65 66 61 75 6c 74 5d 29 3b 0a 20 20 20 20  sDefault]);.    
64a0: 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71    }.      p = sq
64b0: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 72  lite3_instvfs_cr
64c0: 65 61 74 65 28 54 63 6c 5f 47 65 74 53 74 72 69  eate(Tcl_GetStri
64d0: 6e 67 28 6f 62 6a 76 5b 32 2b 69 73 44 65 66 61  ng(objv[2+isDefa
64e0: 75 6c 74 5d 29 2c 20 7a 50 61 72 65 6e 74 29 3b  ult]), zParent);
64f0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 20 29 7b  .      if( !p ){
6500: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
6510: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6520: 2c 20 22 65 72 72 6f 72 20 63 72 65 61 74 69 6e  , "error creatin
6530: 67 20 76 66 73 20 22 2c 20 30 29 3b 0a 20 20 20  g vfs ", 0);.   
6540: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6550: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
6560: 20 20 20 20 20 69 66 28 20 69 73 44 65 66 61 75       if( isDefau
6570: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  lt ){.        sq
6580: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
6590: 65 72 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  er(p, 1);.      
65a0: 7d 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  }.      Tcl_SetO
65b0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
65c0: 20 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20   objv[2]);.     
65d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65e0: 20 20 63 61 73 65 20 49 56 5f 42 49 4e 41 52 59    case IV_BINARY
65f0: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  LOG: {.      cha
6600: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
6610: 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 67 20 3d      char *zLog =
6620: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   0;.      char *
6630: 7a 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  zParent = 0;.   
6640: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
6650: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  p;.      int isD
6660: 65 66 61 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  efault = 0;.    
6670: 20 20 69 6e 74 20 69 73 4c 6f 67 64 61 74 61 20    int isLogdata 
6680: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  = 0;.      int a
6690: 72 67 62 61 73 65 20 3d 20 32 3b 0a 0a 20 20 20  rgbase = 2;..   
66a0: 20 20 20 66 6f 72 28 61 72 67 62 61 73 65 3d 32     for(argbase=2
66b0: 3b 20 61 72 67 62 61 73 65 3c 28 6f 62 6a 63 2d  ; argbase<(objc-
66c0: 32 29 3b 20 61 72 67 62 61 73 65 2b 2b 29 7b 0a  2); argbase++){.
66d0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
66e0: 74 72 63 6d 70 28 22 2d 64 65 66 61 75 6c 74 22  trcmp("-default"
66f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
6700: 6f 62 6a 76 5b 61 72 67 62 61 73 65 5d 29 29 20  objv[argbase])) 
6710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 44  ){.          isD
6720: 65 66 61 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20  efault = 1;.    
6730: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c      }.        el
6740: 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
6750: 28 22 2d 70 61 72 65 6e 74 22 2c 20 54 63 6c 5f  ("-parent", Tcl_
6760: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61  GetString(objv[a
6770: 72 67 62 61 73 65 5d 29 29 20 29 7b 0a 20 20 20  rgbase])) ){.   
6780: 20 20 20 20 20 20 20 61 72 67 62 61 73 65 2b 2b         argbase++
6790: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61 72  ;.          zPar
67a0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ent = Tcl_GetStr
67b0: 69 6e 67 28 6f 62 6a 76 5b 61 72 67 62 61 73 65  ing(objv[argbase
67c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
67d0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 30        else if( 0
67e0: 3d 3d 73 74 72 63 6d 70 28 22 2d 6c 6f 67 64 61  ==strcmp("-logda
67f0: 74 61 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ta", Tcl_GetStri
6800: 6e 67 28 6f 62 6a 76 5b 61 72 67 62 61 73 65 5d  ng(objv[argbase]
6810: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
6820: 69 73 4c 6f 67 64 61 74 61 20 3d 20 31 3b 0a 20  isLogdata = 1;. 
6830: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6840: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6860: 0a 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 6a  ..      if( (obj
6870: 63 2d 61 72 67 62 61 73 65 29 21 3d 32 20 29 7b  c-argbase)!=2 ){
6880: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
6890: 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20 20 20 20  ngNumArgs(.     
68a0: 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 32         interp, 2
68b0: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61 75  , objv, "?-defau
68c0: 6c 74 3f 20 3f 2d 70 61 72 65 6e 74 20 56 46 53  lt? ?-parent VFS
68d0: 3f 20 3f 2d 6c 6f 67 64 61 74 61 3f 20 4e 41 4d  ? ?-logdata? NAM
68e0: 45 20 4c 4f 47 46 49 4c 45 22 0a 20 20 20 20 20  E LOGFILE".     
68f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65     );.        re
6900: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e        }.      zN
6920: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
6930: 69 6e 67 28 6f 62 6a 76 5b 61 72 67 62 61 73 65  ing(objv[argbase
6940: 5d 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 20 3d  ]);.      zLog =
6950: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
6960: 62 6a 76 5b 61 72 67 62 61 73 65 2b 31 5d 29 3b  bjv[argbase+1]);
6970: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
6980: 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 72  e3_instvfs_binar
6990: 79 6c 6f 67 28 7a 4e 61 6d 65 2c 20 7a 50 61 72  ylog(zName, zPar
69a0: 65 6e 74 2c 20 7a 4c 6f 67 2c 20 69 73 4c 6f 67  ent, zLog, isLog
69b0: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  data);.      if(
69c0: 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20 54   !p ){.        T
69d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
69e0: 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 20 63  interp, "error c
69f0: 72 65 61 74 69 6e 67 20 76 66 73 20 22 2c 20 30  reating vfs ", 0
6a00: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
6a10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6a20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
6a30: 73 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  sDefault ){.    
6a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
6a50: 72 65 67 69 73 74 65 72 28 70 2c 20 31 29 3b 0a  register(p, 1);.
6a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
6a70: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6a80: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 29 3b  nterp, objv[2]);
6a90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6aa0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 49 56    }..    case IV
6ab0: 5f 4d 41 52 4b 45 52 3a 20 7b 0a 20 20 20 20 20  _MARKER: {.     
6ac0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b   sqlite3_vfs *p;
6ad0: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
6ae0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =4 ){.        Tc
6af0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6b00: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6b10: 22 56 46 53 20 4d 41 52 4b 45 52 22 29 3b 0a 20  "VFS MARKER");. 
6b20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6b30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
6b40: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
6b50: 65 33 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c 5f  e3_vfs_find(Tcl_
6b60: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
6b70: 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ]));.      if( !
6b80: 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d 69  p || p->xOpen!=i
6b90: 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nstOpen ){.     
6ba0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6bb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
6bc0: 73 75 63 68 20 76 66 73 3a 20 22 2c 20 54 63 6c  such vfs: ", Tcl
6bd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
6be0: 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  2]), 0);.       
6bf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6c00: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
6c10: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
6c20: 5f 62 69 6e 61 72 79 6c 6f 67 5f 6d 61 72 6b 65  _binarylog_marke
6c30: 72 28 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  r(p, Tcl_GetStri
6c40: 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 20 20  ng(objv[3]));.  
6c50: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
6c60: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
6c70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6c80: 0a 20 20 20 20 63 61 73 65 20 49 56 5f 43 4f 4e  .    case IV_CON
6c90: 46 49 47 55 52 45 3a 20 7b 0a 20 20 20 20 20 20  FIGURE: {.      
6ca0: 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 70 43 61  InstVfsCall *pCa
6cb0: 6c 6c 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ll;..      sqlit
6cc0: 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20  e3_vfs *p;.     
6cd0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
6ce0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
6cf0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6d00: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
6d10: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
6d20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6d30: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
6d40: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 66    p = sqlite3_vf
6d50: 73 5f 66 69 6e 64 28 54 63 6c 5f 47 65 74 53 74  s_find(Tcl_GetSt
6d60: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
6d70: 20 20 20 20 20 20 69 66 28 20 21 70 20 7c 7c 20        if( !p || 
6d80: 70 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73 74 4f 70  p->xOpen!=instOp
6d90: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  en ){.        Tc
6da0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6db0: 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
6dc0: 76 66 73 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53  vfs: ", Tcl_GetS
6dd0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
6de0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
6df0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6e00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6e10: 20 73 74 72 6c 65 6e 28 54 63 6c 5f 47 65 74 53   strlen(Tcl_GetS
6e20: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 20  tring(objv[3])) 
6e30: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 61 6c 6c  ){.        pCall
6e40: 20 3d 20 28 49 6e 73 74 56 66 73 43 61 6c 6c 20   = (InstVfsCall 
6e50: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6e60: 28 73 69 7a 65 6f 66 28 49 6e 73 74 56 66 73 43  (sizeof(InstVfsC
6e70: 61 6c 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  all));.        p
6e80: 43 61 6c 6c 2d 3e 69 6e 74 65 72 70 20 3d 20 69  Call->interp = i
6e90: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 70  nterp;.        p
6ea0: 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 20 3d 20  Call->pScript = 
6eb0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
6ec0: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20  (objv[3]);.     
6ed0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
6ee0: 75 6e 74 28 70 43 61 6c 6c 2d 3e 70 53 63 72 69  unt(pCall->pScri
6ef0: 70 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pt);.        sql
6f00: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e  ite3_instvfs_con
6f10: 66 69 67 75 72 65 28 70 2c 20 0a 20 20 20 20 20  figure(p, .     
6f20: 20 20 20 20 20 20 20 74 65 73 74 5f 69 6e 73 74         test_inst
6f30: 76 66 73 5f 78 63 61 6c 6c 2c 20 28 76 6f 69 64  vfs_xcall, (void
6f40: 20 2a 29 70 43 61 6c 6c 2c 20 74 65 73 74 5f 69   *)pCall, test_i
6f50: 6e 73 74 76 66 73 5f 78 64 65 6c 0a 20 20 20 20  nstvfs_xdel.    
6f60: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
6f70: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6f80: 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66  te3_instvfs_conf
6f90: 69 67 75 72 65 28 70 2c 20 30 2c 20 30 2c 20 30  igure(p, 0, 0, 0
6fa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
6fc0: 20 20 20 63 61 73 65 20 49 56 5f 52 45 50 4f 52     case IV_REPOR
6fd0: 54 3a 0a 20 20 20 20 63 61 73 65 20 49 56 5f 44  T:.    case IV_D
6fe0: 45 53 54 52 4f 59 3a 0a 20 20 20 20 63 61 73 65  ESTROY:.    case
6ff0: 20 49 56 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20   IV_RESET: {.   
7000: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
7010: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  p;.      if( obj
7020: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
7030: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7040: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
7050: 2c 20 22 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20  , "NAME");.     
7060: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7070: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
7080: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 76     p = sqlite3_v
7090: 66 73 5f 66 69 6e 64 28 54 63 6c 5f 47 65 74 53  fs_find(Tcl_GetS
70a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b  tring(objv[2]));
70b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 20 7c 7c  .      if( !p ||
70c0: 20 70 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73 74 4f   p->xOpen!=instO
70d0: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 54  pen ){.        T
70e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
70f0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68  interp, "no such
7100: 20 76 66 73 3a 20 22 2c 20 54 63 6c 5f 47 65 74   vfs: ", Tcl_Get
7110: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
7120: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
7130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7140: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
7150: 28 20 28 28 65 6e 75 6d 20 49 56 5f 65 6e 75 6d  ( ((enum IV_enum
7160: 29 69 53 75 62 29 3d 3d 49 56 5f 44 45 53 54 52  )iSub)==IV_DESTR
7170: 4f 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OY ){.        sq
7180: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 64 65  lite3_instvfs_de
7190: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
71a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 28 65 6e  }.      if( ((en
71b0: 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75 62 29  um IV_enum)iSub)
71c0: 3d 3d 49 56 5f 52 45 53 45 54 20 29 7b 0a 20 20  ==IV_RESET ){.  
71d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
71e0: 73 74 76 66 73 5f 72 65 73 65 74 28 70 29 3b 0a  stvfs_reset(p);.
71f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7200: 28 20 28 28 65 6e 75 6d 20 49 56 5f 65 6e 75 6d  ( ((enum IV_enum
7210: 29 69 53 75 62 29 3d 3d 49 56 5f 52 45 50 4f 52  )iSub)==IV_REPOR
7220: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
7230: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 54 63 6c   ii;.        Tcl
7240: 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
7250: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 0a 20 20 20 20  _NewObj();..    
7260: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7270: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
7280: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
7290: 65 33 5f 69 6e 74 36 34 20 6e 43 6c 69 63 6b 3b  e3_int64 nClick;
72a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 61  .        int nCa
72b0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ll;.        for(
72c0: 69 69 3d 31 3b 20 7a 4e 61 6d 65 3b 20 69 69 2b  ii=1; zName; ii+
72d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
72e0: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 67 65  lite3_instvfs_ge
72f0: 74 28 70 2c 20 69 69 2c 20 26 7a 4e 61 6d 65 2c  t(p, ii, &zName,
7300: 20 26 6e 43 6c 69 63 6b 2c 20 26 6e 43 61 6c 6c   &nClick, &nCall
7310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7320: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
7330: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
7340: 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  Elem = Tcl_NewOb
7350: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  j();.           
7360: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7370: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c  ndElement(0, pEl
7380: 65 6d 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  em, Tcl_NewStrin
7390: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
73a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  ;.            Tc
73b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
73c0: 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c  lement(0, pElem,
73d0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
73e0: 43 61 6c 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  Call));.        
73f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7400: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
7410: 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77 57 69  pElem, Tcl_NewWi
7420: 64 65 49 6e 74 4f 62 6a 28 6e 43 6c 69 63 6b 29  deIntObj(nClick)
7430: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
7440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7450: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
7460: 20 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20   pElem);.       
7470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
7480: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
7490: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
74a0: 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a   pRet);.      }.
74b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
74c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
74d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  n TCL_OK;.}..int
74e0: 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
74f0: 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
7500: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
7510: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
7520: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
7530: 74 65 33 5f 69 6e 73 74 76 66 73 22 2c 20 74 65  te3_instvfs", te
7540: 73 74 5f 73 71 6c 69 74 65 33 5f 69 6e 73 74 76  st_sqlite3_instv
7550: 66 73 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  fs, 0, 0);.  ret
7560: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
7570: 65 6e 64 69 66 0a                                endif.