/ Hex Artifact Content
Login

Artifact f84ac00d61145af1be287754c153d04048b67888:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 70 72 69 6c  /*.** 2008 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
0180: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0190: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
01a0: 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 69 74 65  ion of an SQLite
01b0: 20 76 66 73 20 77 72 61 70 70 65 72 20 74 68 61   vfs wrapper tha
01c0: 74 0a 2a 2a 20 61 64 64 73 20 69 6e 73 74 72 75  t.** adds instru
01d0: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 61 6c 6c  mentation to all
01e0: 20 76 66 73 20 61 6e 64 20 66 69 6c 65 20 6d 65   vfs and file me
01f0: 74 68 6f 64 73 2e 20 43 20 61 6e 64 20 54 63 6c  thods. C and Tcl
0200: 20 69 6e 74 65 72 66 61 63 65 73 0a 2a 2a 20 61   interfaces.** a
0210: 72 65 20 70 72 6f 76 69 64 65 64 20 74 6f 20 63  re provided to c
0220: 6f 6e 74 72 6f 6c 20 74 68 65 20 69 6e 73 74 72  ontrol the instr
0230: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a  umentation..*/..
0240: 2f 2a 0a 2a 2a 20 43 20 69 6e 74 65 72 66 61 63  /*.** C interfac
0250: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  e:.**.**   sqlit
0260: 65 33 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74  e3_instvfs_creat
0270: 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  e().**   sqlite3
0280: 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79  _instvfs_destroy
0290: 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  ().**   sqlite3_
02a0: 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72  instvfs_configur
02b0: 65 28 29 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69  e().**.**   sqli
02c0: 74 65 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65  te3_instvfs_rese
02d0: 74 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  t().**   sqlite3
02e0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 29 0a 2a  _instvfs_get().*
02f0: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69  *.**   sqlite3_i
0300: 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67  nstvfs_binarylog
0310: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  .**   sqlite3_in
0320: 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 5f  stvfs_binarylog_
0330: 6d 61 72 6b 65 72 0a 2a 2a 0a 2a 2a 20 54 63 6c  marker.**.** Tcl
0340: 20 69 6e 74 65 72 66 61 63 65 20 28 6f 6d 69 74   interface (omit
0350: 74 65 64 20 69 66 20 53 51 4c 49 54 45 5f 54 45  ted if SQLITE_TE
0360: 53 54 20 69 73 20 6e 6f 74 20 73 65 74 29 3a 0a  ST is not set):.
0370: 2a 2a 20 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  ** .**   sqlite3
0380: 5f 69 6e 73 74 76 66 73 20 63 72 65 61 74 65 20  _instvfs create 
0390: 4e 41 4d 45 20 3f 50 41 52 45 4e 54 3f 0a 2a 2a  NAME ?PARENT?.**
03a0: 0a 2a 2a 20 20 20 20 20 20 20 43 72 65 61 74 65  .**       Create
03b0: 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 6e 65   and register ne
03c0: 77 20 76 66 73 20 63 61 6c 6c 65 64 20 24 4e 41  w vfs called $NA
03d0: 4d 45 2c 20 77 68 69 63 68 20 69 73 20 61 20 77  ME, which is a w
03e0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a  rapper around.**
03f0: 20 20 20 20 20 20 20 74 68 65 20 65 78 69 73 74         the exist
0400: 69 6e 67 20 76 66 73 20 24 50 41 52 45 4e 54 2e  ing vfs $PARENT.
0410: 20 49 66 20 74 68 65 20 50 41 52 45 4e 54 20 61   If the PARENT a
0420: 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74  rgument is omitt
0430: 65 64 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ed, the.**      
0440: 20 6e 65 77 20 76 66 73 20 69 73 20 61 20 77 72   new vfs is a wr
0450: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
0460: 20 63 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74   current default
0470: 20 76 66 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71   vfs..**.**   sq
0480: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 64 65  lite3_instvfs de
0490: 73 74 72 6f 79 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  stroy NAME.**.**
04a0: 20 20 20 20 20 20 20 44 65 72 65 67 69 73 74 65         Deregiste
04b0: 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68  r and destroy th
04c0: 65 20 76 66 73 20 6e 61 6d 65 64 20 24 4e 41 4d  e vfs named $NAM
04d0: 45 2c 20 77 68 69 63 68 20 6d 75 73 74 20 68 61  E, which must ha
04e0: 76 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20  ve been.**      
04f0: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 65   created by an e
0500: 61 72 6c 69 65 72 20 69 6e 76 6f 63 61 74 69 6f  arlier invocatio
0510: 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f 69 6e  n of [sqlite3_in
0520: 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e 0a 2a  stvfs create]..*
0530: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69  *.**   sqlite3_i
0540: 6e 73 74 76 66 73 20 63 6f 6e 66 69 67 75 72 65  nstvfs configure
0550: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a   NAME SCRIPT.**.
0560: 2a 2a 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75  **       Configu
0570: 72 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  re the callback 
0580: 73 63 72 69 70 74 20 66 6f 72 20 74 68 65 20 76  script for the v
0590: 66 73 20 24 4e 41 4d 45 2c 20 77 68 69 63 68 20  fs $NAME, which 
05a0: 6d 75 63 68 20 68 61 76 65 0a 2a 2a 20 20 20 20  much have.**    
05b0: 20 20 20 62 65 65 6e 20 63 72 65 61 74 65 64 20     been created 
05c0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 69 6e  by an earlier in
05d0: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 5b 73 71 6c  vocation of [sql
05e0: 69 74 65 33 5f 69 6e 73 74 76 66 73 20 63 72 65  ite3_instvfs cre
05f0: 61 74 65 5d 2e 0a 2a 2a 20 20 20 20 20 20 20 41  ate]..**       A
0600: 66 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  fter a callback 
0610: 73 63 72 69 70 74 20 68 61 73 20 62 65 65 6e 20  script has been 
0620: 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 74 20 69  configured, it i
0630: 73 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 0a 2a  s invoked each.*
0640: 2a 20 20 20 20 20 20 20 74 69 6d 65 20 61 20 76  *       time a v
0650: 66 73 20 6f 72 20 66 69 6c 65 20 6d 65 74 68 6f  fs or file metho
0660: 64 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 53  d is called by S
0670: 51 4c 69 74 65 2e 20 42 65 66 6f 72 65 20 69 6e  QLite. Before in
0680: 76 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  voking.**       
0690: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
06a0: 69 70 74 2c 20 66 69 76 65 20 61 72 67 75 6d 65  ipt, five argume
06b0: 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64  nts are appended
06c0: 20 74 6f 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   to it:.**.**   
06d0: 20 20 20 20 20 20 2a 20 54 68 65 20 6e 61 6d 65        * The name
06e0: 20 6f 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   of the invoked 
06f0: 6d 65 74 68 6f 64 20 2d 20 69 2e 65 2e 20 22 78  method - i.e. "x
0700: 52 65 61 64 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  Read"..**.**    
0710: 20 20 20 20 20 2a 20 54 68 65 20 74 69 6d 65 20       * The time 
0720: 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20  consumed by the 
0730: 6d 65 74 68 6f 64 20 63 61 6c 6c 20 61 73 20 6d  method call as m
0740: 65 61 73 75 72 65 64 20 62 79 20 68 77 74 69 6d  easured by hwtim
0750: 65 28 29 20 28 61 6e 0a 2a 2a 20 20 20 20 20 20  e() (an.**      
0760: 20 20 20 20 20 69 6e 74 65 67 65 72 20 76 61 6c       integer val
0770: 75 65 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ue).**.**       
0780: 20 20 2a 20 41 20 73 74 72 69 6e 67 20 76 61 6c    * A string val
0790: 75 65 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ue with a differ
07a0: 65 6e 74 20 6d 65 61 6e 69 6e 67 20 66 6f 72 20  ent meaning for 
07b0: 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 73 2e  different calls.
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46   .**           F
07d0: 6f 72 20 66 69 6c 65 20 6d 65 74 68 6f 64 73 2c  or file methods,
07e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
07f0: 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 72   file being oper
0800: 61 74 65 64 20 6f 6e 2e 20 46 6f 72 0a 2a 2a 20  ated on. For.** 
0810: 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
0820: 6d 65 74 68 6f 64 73 20 69 74 20 69 73 20 74 68  methods it is th
0830: 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  e filename argum
0840: 65 6e 74 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ent, if any..**.
0850: 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20 33  **         * A 3
0860: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  2-bit integer va
0870: 6c 75 65 20 77 69 74 68 20 61 20 63 61 6c 6c 2d  lue with a call-
0880: 73 70 65 63 69 66 69 63 20 6d 65 61 6e 69 6e 67  specific meaning
0890: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
08a0: 2a 20 41 20 36 34 2d 62 69 74 20 69 6e 74 65 67  * A 64-bit integ
08b0: 65 72 20 76 61 6c 75 65 2e 20 46 6f 72 20 78 52  er value. For xR
08c0: 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65  ead() and xWrite
08d0: 28 29 20 63 61 6c 6c 73 20 74 68 69 73 0a 2a 2a  () calls this.**
08e0: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 74 68             is th
08f0: 65 20 66 69 6c 65 20 6f 66 66 73 65 74 20 62 65  e file offset be
0900: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 6f  ing written to o
0910: 72 20 72 65 61 64 20 66 72 6f 6d 2e 20 55 6e 75  r read from. Unu
0920: 73 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  sed by.**       
0930: 20 20 20 20 61 6c 6c 20 6f 74 68 65 72 20 63 61      all other ca
0940: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c  lls..**.**   sql
0950: 69 74 65 33 5f 69 6e 73 74 76 66 73 20 72 65 73  ite3_instvfs res
0960: 65 74 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20  et NAME.**.**   
0970: 20 20 20 20 5a 65 72 6f 20 74 68 65 20 69 6e 74      Zero the int
0980: 65 72 6e 61 6c 20 65 76 65 6e 74 20 63 6f 75 6e  ernal event coun
0990: 74 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  ters associated 
09a0: 77 69 74 68 20 76 66 73 20 24 4e 41 4d 45 2c 20  with vfs $NAME, 
09b0: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 63 68 20  .**       which 
09c0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 63  must have been c
09d0: 72 65 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  reated by an ear
09e0: 6c 69 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20  lier invocation 
09f0: 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 5b 73 71  of .**       [sq
0a00: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 63 72  lite3_instvfs cr
0a10: 65 61 74 65 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 73  eate]..**.**   s
0a20: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 72  qlite3_instvfs r
0a30: 65 70 6f 72 74 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  eport NAME.**.**
0a40: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68         Return th
0a50: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  e values of the 
0a60: 69 6e 74 65 72 6e 61 6c 20 65 76 65 6e 74 20 63  internal event c
0a70: 6f 75 6e 74 65 72 73 20 61 73 73 6f 63 69 61 74  ounters associat
0a80: 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  ed .**       wit
0a90: 68 20 76 66 73 20 24 4e 41 4d 45 2e 20 54 68 65  h vfs $NAME. The
0aa0: 20 72 65 70 6f 72 74 20 66 6f 72 6d 61 74 20 69   report format i
0ab0: 73 20 61 20 6c 69 73 74 20 77 69 74 68 20 6f 6e  s a list with on
0ac0: 65 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  e element.**    
0ad0: 20 20 20 66 6f 72 20 65 61 63 68 20 6d 65 74 68     for each meth
0ae0: 6f 64 20 63 61 6c 6c 20 28 78 57 72 69 74 65 2c  od call (xWrite,
0af0: 20 78 52 65 61 64 20 65 74 63 2e 29 2e 20 45 61   xRead etc.). Ea
0b00: 63 68 20 65 6c 65 6d 65 6e 74 20 69 73 0a 2a 2a  ch element is.**
0b10: 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 61 20         itself a 
0b20: 6c 69 73 74 20 77 69 74 68 20 74 68 72 65 65 20  list with three 
0b30: 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  elements:.**.** 
0b40: 20 20 20 20 20 20 20 20 2a 20 54 68 65 20 6e 61          * The na
0b50: 6d 65 20 6f 66 20 74 68 65 20 6d 65 74 68 6f 64  me of the method
0b60: 20 63 61 6c 6c 20 2d 20 69 2e 65 2e 20 22 78 57   call - i.e. "xW
0b70: 72 69 74 65 22 2c 0a 2a 2a 20 20 20 20 20 20 20  rite",.**       
0b80: 20 20 2a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75    * The total nu
0b90: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
0ba0: 20 74 68 65 20 6d 65 74 68 6f 64 20 28 61 6e 20   the method (an 
0bb0: 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 20 20 20  integer)..**    
0bc0: 20 20 20 20 20 2a 20 54 68 65 20 61 67 67 72 65       * The aggre
0bd0: 67 61 74 65 20 74 69 6d 65 20 63 6f 6e 73 75 6d  gate time consum
0be0: 65 64 20 62 79 20 61 6c 6c 20 63 61 6c 6c 73 20  ed by all calls 
0bf0: 74 6f 20 74 68 65 20 6d 65 74 68 6f 64 20 61 73  to the method as
0c00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6d 65  .**           me
0c10: 61 73 75 72 65 64 20 62 79 20 68 77 74 69 6d 65  asured by hwtime
0c20: 28 29 20 28 61 6e 20 69 6e 74 65 67 65 72 29 2e  () (an integer).
0c30: 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73  .*/..#include "s
0c40: 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75  qlite3.h".#inclu
0c50: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0c60: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0c70: 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  >../*.** Maximum
0c80: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0c90: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68   supported by th
0ca0: 65 20 69 6e 73 74 20 62 61 63 6b 65 6e 64 2e 0a  e inst backend..
0cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 53 54 5f  */.#define INST_
0cc0: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
0cd0: 0a 0a 0a 2f 2a 20 46 69 6c 65 20 6d 65 74 68 6f  .../* File metho
0ce0: 64 73 20 2a 2f 0a 2f 2a 20 56 66 73 20 6d 65 74  ds */./* Vfs met
0cf0: 68 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hods */.#define 
0d00: 4f 53 5f 41 43 43 45 53 53 20 20 20 20 20 20 20  OS_ACCESS       
0d10: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4f       1.#define O
0d20: 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  S_CHECKRESERVEDL
0d30: 4f 43 4b 20 32 0a 23 64 65 66 69 6e 65 20 4f 53  OCK 2.#define OS
0d40: 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 20 20 20  _CLOSE          
0d50: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f     3.#define OS_
0d60: 43 55 52 52 45 4e 54 54 49 4d 45 20 20 20 20 20  CURRENTTIME     
0d70: 20 20 34 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44    4.#define OS_D
0d80: 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20  ELETE           
0d90: 20 35 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44 45   5.#define OS_DE
0da0: 56 43 48 41 52 20 20 20 20 20 20 20 20 20 20 20  VCHAR           
0db0: 36 0a 23 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c  6.#define OS_FIL
0dc0: 45 43 4f 4e 54 52 4f 4c 20 20 20 20 20 20 20 37  ECONTROL       7
0dd0: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45  .#define OS_FILE
0de0: 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 38 0a  SIZE          8.
0df0: 23 64 65 66 69 6e 65 20 4f 53 5f 46 55 4c 4c 50  #define OS_FULLP
0e00: 41 54 48 4e 41 4d 45 20 20 20 20 20 20 39 0a 23  ATHNAME      9.#
0e10: 64 65 66 69 6e 65 20 4f 53 5f 47 45 54 54 45 4d  define OS_GETTEM
0e20: 50 4e 41 4d 45 20 20 20 20 20 20 20 31 30 0a 23  PNAME       10.#
0e30: 64 65 66 69 6e 65 20 4f 53 5f 4c 4f 43 4b 20 20  define OS_LOCK  
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a 23              11.#
0e50: 64 65 66 69 6e 65 20 4f 53 5f 4f 50 45 4e 20 20  define OS_OPEN  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 31 32 0a 23              12.#
0e70: 64 65 66 69 6e 65 20 4f 53 5f 52 41 4e 44 4f 4d  define OS_RANDOM
0e80: 4e 45 53 53 20 20 20 20 20 20 20 20 31 33 0a 23  NESS        13.#
0e90: 64 65 66 69 6e 65 20 4f 53 5f 52 45 41 44 20 20  define OS_READ  
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 31 34 20 0a              14 .
0eb0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 45 43 54 4f  #define OS_SECTO
0ec0: 52 53 49 5a 45 20 20 20 20 20 20 20 20 31 35 0a  RSIZE        15.
0ed0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 4c 45 45 50  #define OS_SLEEP
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36 0a               16.
0ef0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 59 4e 43 20  #define OS_SYNC 
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 37 0a               17.
0f10: 23 64 65 66 69 6e 65 20 4f 53 5f 54 52 55 4e 43  #define OS_TRUNC
0f20: 41 54 45 20 20 20 20 20 20 20 20 20 20 31 38 0a  ATE          18.
0f30: 23 64 65 66 69 6e 65 20 4f 53 5f 55 4e 4c 4f 43  #define OS_UNLOC
0f40: 4b 20 20 20 20 20 20 20 20 20 20 20 20 31 39 0a  K            19.
0f50: 23 64 65 66 69 6e 65 20 4f 53 5f 57 52 49 54 45  #define OS_WRITE
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 0a               20.
0f70: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 4e 55 4d 45  .#define OS_NUME
0f80: 56 45 4e 54 53 20 20 20 20 20 20 20 20 20 32 31  VENTS         21
0f90: 0a 0a 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59  ..#define BINARY
0fa0: 4c 4f 47 5f 53 54 52 49 4e 47 20 20 20 20 20 33  LOG_STRING     3
0fb0: 30 0a 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59  0.#define BINARY
0fc0: 4c 4f 47 5f 4d 41 52 4b 45 52 20 20 20 20 20 33  LOG_MARKER     3
0fd0: 31 0a 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66  1..struct InstVf
0fe0: 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s {.  sqlite3_vf
0ff0: 73 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  s base;.  sqlite
1000: 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 0a 20 20  3_vfs *pVfs;..  
1010: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 3b 0a 20  void *pClient;. 
1020: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
1030: 69 64 20 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a  id *);.  void (*
1040: 78 43 61 6c 6c 29 28 76 6f 69 64 20 2a 2c 20 69  xCall)(void *, i
1050: 6e 74 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33  nt, int, sqlite3
1060: 5f 69 6e 74 36 34 2c 20 69 6e 74 2c 20 63 6f 6e  _int64, int, con
1070: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  st char *, int, 
1080: 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  int, sqlite3_int
1090: 36 34 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  64);..  /* Count
10a0: 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ers */.  sqlite3
10b0: 5f 69 6e 74 36 34 20 61 54 69 6d 65 5b 4f 53 5f  _int64 aTime[OS_
10c0: 4e 55 4d 45 56 45 4e 54 53 5d 3b 0a 20 20 69 6e  NUMEVENTS];.  in
10d0: 74 20 61 43 6f 75 6e 74 5b 4f 53 5f 4e 55 4d 45  t aCount[OS_NUME
10e0: 56 45 4e 54 53 5d 3b 0a 0a 20 20 69 6e 74 20 69  VENTS];..  int i
10f0: 4e 65 78 74 46 69 6c 65 49 64 3b 0a 7d 3b 0a 74  NextFileId;.};.t
1100: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e  ypedef struct In
1110: 73 74 56 66 73 20 49 6e 73 74 56 66 73 3b 0a 0a  stVfs InstVfs;..
1120: 23 64 65 66 69 6e 65 20 52 45 41 4c 56 46 53 28  #define REALVFS(
1130: 70 29 20 28 28 28 49 6e 73 74 56 66 73 20 2a 29  p) (((InstVfs *)
1140: 28 70 29 29 2d 3e 70 56 66 73 29 0a 0a 74 79 70  (p))->pVfs)..typ
1150: 65 64 65 66 20 73 74 72 75 63 74 20 69 6e 73 74  edef struct inst
1160: 5f 66 69 6c 65 20 69 6e 73 74 5f 66 69 6c 65 3b  _file inst_file;
1170: 0a 73 74 72 75 63 74 20 69 6e 73 74 5f 66 69 6c  .struct inst_fil
1180: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e {.  sqlite3_fi
1190: 6c 65 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  le base;.  sqlit
11a0: 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 0a  e3_file *pReal;.
11b0: 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74    InstVfs *pInst
11c0: 56 66 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Vfs;.  const cha
11d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  r *zName;.  int 
11e0: 69 46 69 6c 65 49 64 3b 20 20 20 20 20 20 20 20  iFileId;        
11f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 69         /* File i
1200: 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  d number */.  in
1210: 74 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a  t flags;.};../*.
1220: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72  ** Method declar
1230: 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f  ations for inst_
1240: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1250: 69 6e 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71  int instClose(sq
1260: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
1270: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65 61  atic int instRea
1280: 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  d(sqlite3_file*,
1290: 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74   void*, int iAmt
12a0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
12b0: 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69  iOfst);.static i
12c0: 6e 74 20 69 6e 73 74 57 72 69 74 65 28 73 71 6c  nt instWrite(sql
12d0: 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74  ite3_file*,const
12e0: 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c   void*,int iAmt,
12f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1300: 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  Ofst);.static in
1310: 74 20 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73  t instTruncate(s
1320: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71  qlite3_file*, sq
1330: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65  lite3_int64 size
1340: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  );.static int in
1350: 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  stSync(sqlite3_f
1360: 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29  ile*, int flags)
1370: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  ;.static int ins
1380: 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  tFileSize(sqlite
1390: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  3_file*, sqlite3
13a0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a  _int64 *pSize);.
13b0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4c  static int instL
13c0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13d0: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
13e0: 69 6e 74 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73  int instUnlock(s
13f0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1400: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  t);.static int i
1410: 6e 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64  nstCheckReserved
1420: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1430: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
1440: 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  instFileControl(
1450: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
1460: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1470: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  g);.static int i
1480: 6e 73 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nstSectorSize(sq
1490: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
14a0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 76  atic int instDev
14b0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
14c0: 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  cs(sqlite3_file*
14d0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64  );../*.** Method
14e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   declarations fo
14f0: 72 20 69 6e 73 74 5f 76 66 73 2e 0a 2a 2f 0a 73  r inst_vfs..*/.s
1500: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4f 70  tatic int instOp
1510: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
1520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73   const char *, s
1530: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1540: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  t , int *);.stat
1550: 69 63 20 69 6e 74 20 69 6e 73 74 44 65 6c 65 74  ic int instDelet
1560: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
1570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1580: 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b  e, int syncDir);
1590: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
15a0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76  Access(sqlite3_v
15b0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
15c0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
15d0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  s);.static int i
15e0: 6e 73 74 47 65 74 54 65 6d 70 4e 61 6d 65 28 73  nstGetTempName(s
15f0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74  qlite3_vfs*, int
1600: 20 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a 4f 75   nOut, char *zOu
1610: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  t);.static int i
1620: 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nstFullPathname(
1630: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
1640: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1650: 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75 74   int, char *zOut
1660: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
1670: 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74  instDlOpen(sqlit
1680: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63  e3_vfs*, const c
1690: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 3b  har *zFilename);
16a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
16b0: 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  tDlError(sqlite3
16c0: 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65  _vfs*, int nByte
16d0: 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29  , char *zErrMsg)
16e0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69  ;.static void *i
16f0: 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nstDlSym(sqlite3
1700: 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e  _vfs*,void*, con
1710: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
1720: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  );.static void i
1730: 6e 73 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nstDlClose(sqlit
1740: 65 33 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b  e3_vfs*, void*);
1750: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
1760: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
1770: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79  e3_vfs*, int nBy
1780: 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b  te, char *zOut);
1790: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
17a0: 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
17b0: 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  s*, int microsec
17c0: 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  onds);.static in
17d0: 74 20 69 6e 73 74 43 75 72 72 65 6e 74 54 69 6d  t instCurrentTim
17e0: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
17f0: 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74 69  double*);..stati
1800: 63 20 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67  c void binarylog
1810: 5f 62 6c 6f 62 28 73 71 6c 69 74 65 33 5f 76 66  _blob(sqlite3_vf
1820: 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  s *, const char 
1830: 2a 2c 20 69 6e 74 29 3b 20 0a 0a 73 74 61 74 69  *, int); ..stati
1840: 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6e  c sqlite3_vfs in
1850: 73 74 5f 76 66 73 20 3d 20 7b 0a 20 20 31 2c 20  st_vfs = {.  1, 
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1880: 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 69 6e 73   */.  sizeof(ins
1890: 74 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 2f 2a  t_file),      /*
18a0: 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 49   szOsFile */.  I
18b0: 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45  NST_MAX_PATHNAME
18c0: 2c 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68  ,      /* mxPath
18d0: 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  name */.  0,    
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
1900: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1910: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
1920: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1940: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 69   pAppData */.  i
1950: 6e 73 74 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nstOpen,        
1960: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
1970: 2a 2f 0a 20 20 69 6e 73 74 44 65 6c 65 74 65 2c  */.  instDelete,
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1990: 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 73  xDelete */.  ins
19a0: 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  tAccess,        
19b0: 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
19c0: 2a 2f 0a 20 20 69 6e 73 74 47 65 74 54 65 6d 70  */.  instGetTemp
19d0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
19e0: 78 47 65 74 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a  xGetTempName */.
19f0: 20 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61    instFullPathna
1a00: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75  me,       /* xFu
1a10: 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
1a20: 69 6e 73 74 44 6c 4f 70 65 6e 2c 20 20 20 20 20  instDlOpen,     
1a30: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
1a40: 65 6e 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 45 72  en */.  instDlEr
1a50: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
1a60: 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
1a70: 20 69 6e 73 74 44 6c 53 79 6d 2c 20 20 20 20 20   instDlSym,     
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
1a90: 79 6d 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 43 6c  ym */.  instDlCl
1aa0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1ab0: 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
1ac0: 20 69 6e 73 74 52 61 6e 64 6f 6d 6e 65 73 73 2c   instRandomness,
1ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
1ae0: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 73  domness */.  ins
1af0: 74 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  tSleep,         
1b00: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
1b10: 2f 0a 20 20 69 6e 73 74 43 75 72 72 65 6e 74 54  /.  instCurrentT
1b20: 69 6d 65 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ime         /* x
1b30: 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d  CurrentTime */.}
1b40: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
1b50: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 69 6e 73  3_io_methods ins
1b60: 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b  t_io_methods = {
1b70: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
1ba0: 20 20 69 6e 73 74 43 6c 6f 73 65 2c 20 20 20 20    instClose,    
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
1bd0: 20 69 6e 73 74 52 65 61 64 2c 20 20 20 20 20 20   instRead,      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 69   /* xRead */.  i
1c00: 6e 73 74 57 72 69 74 65 2c 20 20 20 20 20 20 20  nstWrite,       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 69 6e  * xWrite */.  in
1c30: 73 74 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  stTruncate,     
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c50: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
1c60: 69 6e 73 74 53 79 6e 63 2c 20 20 20 20 20 20 20  instSync,       
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 69 6e  /* xSync */.  in
1c90: 73 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  stFileSize,     
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
1cc0: 69 6e 73 74 4c 6f 63 6b 2c 20 20 20 20 20 20 20  instLock,       
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  /* xLock */.  in
1cf0: 73 74 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  stUnlock,       
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d10: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   xUnlock */.  in
1d20: 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  stCheckReservedL
1d30: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ock,          /*
1d40: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1d50: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 73 74 46 69 6c  ock */.  instFil
1d60: 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1d80: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 69 6e  eControl */.  in
1d90: 73 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  stSectorSize,   
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
1dc0: 20 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72    instDeviceChar
1dd0: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20  acteristics     
1de0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
1df0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 7d  acteristics */.}
1e00: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
1e10: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 6f  lowing routine o
1e20: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 6e  nly works on pen
1e30: 74 69 75 6d 2d 63 6c 61 73 73 20 70 72 6f 63 65  tium-class proce
1e40: 73 73 6f 72 73 2e 0a 2a 2a 20 49 74 20 75 73 65  ssors..** It use
1e50: 73 20 74 68 65 20 52 44 54 53 43 20 6f 70 63 6f  s the RDTSC opco
1e60: 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63  de to read the c
1e70: 79 63 6c 65 20 63 6f 75 6e 74 20 76 61 6c 75 65  ycle count value
1e80: 20 6f 75 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70   out of the.** p
1e90: 72 6f 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74  rocessor and ret
1ea0: 75 72 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e  urns that value.
1eb0: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1ec0: 65 64 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0a  ed for high-res.
1ed0: 2a 2a 20 70 72 6f 66 69 6c 69 6e 67 2e 0a 2a 2f  ** profiling..*/
1ee0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 33 38  .#if defined(i38
1ef0: 36 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  6) || defined(__
1f00: 69 33 38 36 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  i386__) || defin
1f10: 65 64 28 5f 4d 5f 49 58 38 36 29 0a 5f 5f 69 6e  ed(_M_IX86).__in
1f20: 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e 65 64 20  line__ unsigned 
1f30: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 6f 73  long long int os
1f40: 69 6e 73 74 5f 68 77 74 69 6d 65 28 76 6f 69 64  inst_hwtime(void
1f50: 29 7b 0a 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ){.   unsigned i
1f60: 6e 74 20 6c 6f 2c 20 68 69 3b 0a 20 20 20 2f 2a  nt lo, hi;.   /*
1f70: 20 57 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 22   We cannot use "
1f80: 3d 41 22 2c 20 73 69 6e 63 65 20 74 68 69 73 20  =A", since this 
1f90: 77 6f 75 6c 64 20 75 73 65 20 25 72 61 78 20 6f  would use %rax o
1fa0: 6e 20 78 38 36 5f 36 34 20 2a 2f 0a 20 20 20 5f  n x86_64 */.   _
1fb0: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c  _asm__ __volatil
1fc0: 65 5f 5f 20 28 22 72 64 74 73 63 22 20 3a 20 22  e__ ("rdtsc" : "
1fd0: 3d 61 22 20 28 6c 6f 29 2c 20 22 3d 64 22 20 28  =a" (lo), "=d" (
1fe0: 68 69 29 29 3b 0a 20 20 20 72 65 74 75 72 6e 20  hi));.   return 
1ff0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2000: 6f 6e 67 20 69 6e 74 29 68 69 20 3c 3c 20 33 32  ong int)hi << 32
2010: 20 7c 20 6c 6f 3b 0a 7d 0a 23 65 6c 73 65 0a 20   | lo;.}.#else. 
2020: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
2030: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 6f   long long int o
2040: 73 69 6e 73 74 5f 68 77 74 69 6d 65 28 76 6f 69  sinst_hwtime(voi
2050: 64 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a  d){ return 0; }.
2060: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2070: 4f 53 5f 54 49 4d 45 5f 49 4f 28 65 45 76 65 6e  OS_TIME_IO(eEven
2080: 74 2c 20 41 2c 20 42 2c 20 43 61 6c 6c 29 20 7b  t, A, B, Call) {
2090: 20 20 20 20 20 5c 0a 20 20 69 6e 73 74 5f 66 69       \.  inst_fi
20a0: 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f 66 69  le *p = (inst_fi
20b0: 6c 65 20 2a 29 70 46 69 6c 65 3b 20 20 20 20 20  le *)pFile;     
20c0: 20 20 20 20 5c 0a 20 20 49 6e 73 74 56 66 73 20      \.  InstVfs 
20d0: 2a 70 49 6e 73 74 56 66 73 20 3d 20 70 2d 3e 70  *pInstVfs = p->p
20e0: 49 6e 73 74 56 66 73 3b 20 20 20 20 20 20 20 20  InstVfs;        
20f0: 20 20 20 5c 0a 20 20 69 6e 74 20 72 63 3b 20 20     \.  int rc;  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 5c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e    \.  sqlite3_in
2130: 74 36 34 20 74 20 3d 20 6f 73 69 6e 73 74 5f 68  t64 t = osinst_h
2140: 77 74 69 6d 65 28 29 3b 20 20 20 20 20 20 20 20  wtime();        
2150: 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20   \.  rc = Call; 
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 5c 0a 20 20 74 20 3d 20 6f 73 69 6e 73 74 5f 68  \.  t = osinst_h
2190: 77 74 69 6d 65 28 29 20 2d 20 74 3b 20 20 20 20  wtime() - t;    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21b0: 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 54 69  .  pInstVfs->aTi
21c0: 6d 65 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 74 3b  me[eEvent] += t;
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21e0: 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43 6f 75    pInstVfs->aCou
21f0: 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 31 3b  nt[eEvent] += 1;
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2210: 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d 3e 78   if( pInstVfs->x
2220: 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20 20 20  Call ){         
2230: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2240: 20 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c    pInstVfs->xCal
2250: 6c 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l(              
2260: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2270: 20 20 20 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c     pInstVfs->pCl
2280: 69 65 6e 74 2c 65 45 76 65 6e 74 2c 70 2d 3e 69  ient,eEvent,p->i
2290: 46 69 6c 65 49 64 2c 74 2c 72 63 2c 70 2d 3e 7a  FileId,t,rc,p->z
22a0: 4e 61 6d 65 2c 70 2d 3e 66 6c 61 67 73 2c 41 2c  Name,p->flags,A,
22b0: 42 20 20 5c 0a 20 20 20 20 29 3b 20 20 20 20 20  B  \.    );     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20    \.  }         
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 5c 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   \.  return rc; 
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4f 53 5f  \.}..#define OS_
2350: 54 49 4d 45 5f 56 46 53 28 65 45 76 65 6e 74 2c  TIME_VFS(eEvent,
2360: 20 5a 2c 20 66 6c 61 67 73 2c 20 41 2c 20 42 2c   Z, flags, A, B,
2370: 20 43 61 6c 6c 29 20 7b 20 20 20 20 20 20 5c 0a   Call) {      \.
2380: 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74    InstVfs *pInst
2390: 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a  Vfs = (InstVfs *
23a0: 29 70 56 66 73 3b 20 20 20 5c 0a 20 20 69 6e 74  )pVfs;   \.  int
23b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 5c 0a 20 20 73 71 6c 69 74 65 33 5f      \.  sqlite3_
23e0: 69 6e 74 36 34 20 74 20 3d 20 6f 73 69 6e 73 74  int64 t = osinst
23f0: 5f 68 77 74 69 6d 65 28 29 3b 20 20 20 20 20 5c  _hwtime();     \
2400: 0a 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20 20 20  .  rc = Call;   
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 20            \.  t 
2430: 3d 20 6f 73 69 6e 73 74 5f 68 77 74 69 6d 65 28  = osinst_hwtime(
2440: 29 20 2d 20 74 3b 20 20 20 20 20 20 20 20 20 20  ) - t;          
2450: 20 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66       \.  pInstVf
2460: 73 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 5d  s->aTime[eEvent]
2470: 20 2b 3d 20 74 3b 20 20 20 20 20 20 20 20 20 20   += t;          
2480: 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43  \.  pInstVfs->aC
2490: 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20  ount[eEvent] += 
24a0: 31 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69  1;         \.  i
24b0: 66 28 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 61  f( pInstVfs->xCa
24c0: 6c 6c 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ll ){           
24d0: 20 20 20 20 20 20 5c 0a 20 20 20 20 70 49 6e 73        \.    pIns
24e0: 74 56 66 73 2d 3e 78 43 61 6c 6c 28 70 49 6e 73  tVfs->xCall(pIns
24f0: 74 56 66 73 2d 3e 70 43 6c 69 65 6e 74 2c 65 45  tVfs->pClient,eE
2500: 76 65 6e 74 2c 30 2c 20 74 2c 20 72 63 2c 20 5a  vent,0, t, rc, Z
2510: 2c 20 66 6c 61 67 73 2c 20 41 2c 20 42 29 3b 20  , flags, A, B); 
2520: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
2550: 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
2580: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 73 74 2d 66   Close an inst-f
2590: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
25a0: 6e 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 6c  nt instClose(sql
25b0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
25c0: 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28  ){.  OS_TIME_IO(
25d0: 4f 53 5f 43 4c 4f 53 45 2c 20 30 2c 20 30 2c 20  OS_CLOSE, 0, 0, 
25e0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
25f0: 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52  ds->xClose(p->pR
2600: 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eal));.}../*.** 
2610: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
2620: 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a  n inst-file..*/.
2630: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52  static int instR
2640: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
2650: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76  ile *pFile, .  v
2660: 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e  oid *zBuf, .  in
2670: 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74  t iAmt, .  sqlit
2680: 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b  e_int64 iOfst.){
2690: 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53  .  OS_TIME_IO(OS
26a0: 5f 52 45 41 44 2c 20 69 41 6d 74 2c 20 69 4f 66  _READ, iAmt, iOf
26b0: 73 74 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  st, p->pReal->pM
26c0: 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d  ethods->xRead(p-
26d0: 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41  >pReal, zBuf, iA
26e0: 6d 74 2c 20 69 4f 66 73 74 29 29 3b 0a 7d 0a 0a  mt, iOfst));.}..
26f0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
2700: 20 74 6f 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65   to an inst-file
2710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2720: 69 6e 73 74 57 72 69 74 65 28 0a 20 20 73 71 6c  instWrite(.  sql
2730: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2740: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
2750: 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20  z,.  int iAmt,. 
2760: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f   sqlite_int64 iO
2770: 66 73 74 0a 29 7b 0a 20 20 4f 53 5f 54 49 4d 45  fst.){.  OS_TIME
2780: 5f 49 4f 28 4f 53 5f 57 52 49 54 45 2c 20 69 41  _IO(OS_WRITE, iA
2790: 6d 74 2c 20 69 4f 66 73 74 2c 20 70 2d 3e 70 52  mt, iOfst, p->pR
27a0: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
27b0: 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20  Write(p->pReal, 
27c0: 7a 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 29  z, iAmt, iOfst))
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
27e0: 61 74 65 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65  ate an inst-file
27f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2800: 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73 71 6c  instTruncate(sql
2810: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2820: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  , sqlite_int64 s
2830: 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f  ize){.  OS_TIME_
2840: 49 4f 28 4f 53 5f 54 52 55 4e 43 41 54 45 2c 20  IO(OS_TRUNCATE, 
2850: 30 2c 20 28 69 6e 74 29 73 69 7a 65 2c 20 0a 20  0, (int)size, . 
2860: 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65     p->pReal->pMe
2870: 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63 61 74 65  thods->xTruncate
2880: 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29  (p->pReal, size)
2890: 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  .  );.}../*.** S
28a0: 79 6e 63 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65  ync an inst-file
28b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28c0: 69 6e 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33  instSync(sqlite3
28d0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
28e0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 4f 53 5f 54  t flags){.  OS_T
28f0: 49 4d 45 5f 49 4f 28 4f 53 5f 53 59 4e 43 2c 20  IME_IO(OS_SYNC, 
2900: 66 6c 61 67 73 2c 20 30 2c 20 70 2d 3e 70 52 65  flags, 0, p->pRe
2910: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
2920: 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66 6c  ync(p->pReal, fl
2930: 61 67 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ags));.}../*.** 
2940: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
2950: 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20  nt file-size of 
2960: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f  an inst-file..*/
2970: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
2980: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
2990: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
29a0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a  lite_int64 *pSiz
29b0: 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f  e){.  OS_TIME_IO
29c0: 28 4f 53 5f 46 49 4c 45 53 49 5a 45 2c 20 28 69  (OS_FILESIZE, (i
29d0: 6e 74 29 28 2a 70 53 69 7a 65 29 2c 20 30 2c 20  nt)(*pSize), 0, 
29e0: 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  .    p->pReal->p
29f0: 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69  Methods->xFileSi
2a00: 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69  ze(p->pReal, pSi
2a10: 7a 65 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ze).  );.}../*.*
2a20: 2a 20 4c 6f 63 6b 20 61 6e 20 69 6e 73 74 2d 66  * Lock an inst-f
2a30: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2a40: 6e 74 20 69 6e 73 74 4c 6f 63 6b 28 73 71 6c 69  nt instLock(sqli
2a50: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2a60: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 4f   int eLock){.  O
2a70: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 4c 4f 43  S_TIME_IO(OS_LOC
2a80: 4b 2c 20 65 4c 6f 63 6b 2c 20 30 2c 20 70 2d 3e  K, eLock, 0, p->
2a90: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
2aa0: 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  >xLock(p->pReal,
2ab0: 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a   eLock));.}../*.
2ac0: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 69 6e 73  ** Unlock an ins
2ad0: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2ae0: 63 20 69 6e 74 20 69 6e 73 74 55 6e 6c 6f 63 6b  c int instUnlock
2af0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2b00: 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  File, int eLock)
2b10: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
2b20: 53 5f 55 4e 4c 4f 43 4b 2c 20 65 4c 6f 63 6b 2c  S_UNLOCK, eLock,
2b30: 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d   0, p->pReal->pM
2b40: 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28  ethods->xUnlock(
2b50: 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
2b60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
2b70: 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
2b80: 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
2b90: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2ba0: 6e 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a  n an inst-file..
2bb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
2bc0: 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  stCheckReservedL
2bd0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2be0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54   *pFile){.  OS_T
2bf0: 49 4d 45 5f 49 4f 28 4f 53 5f 43 48 45 43 4b 52  IME_IO(OS_CHECKR
2c00: 45 53 45 52 56 45 44 4c 4f 43 4b 2c 20 30 2c 20  ESERVEDLOCK, 0, 
2c10: 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  0, p->pReal->pMe
2c20: 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73  thods->xCheckRes
2c30: 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65  ervedLock(p->pRe
2c40: 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  al));.}../*.** F
2c50: 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile control meth
2c60: 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f  od. For custom o
2c70: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20  perations on an 
2c80: 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  inst-file..*/.st
2c90: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 46 69 6c  atic int instFil
2ca0: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
2cb0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
2cc0: 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
2cd0: 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28  ){.  OS_TIME_IO(
2ce0: 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f 4c 2c 20  OS_FILECONTROL, 
2cf0: 30 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e  0, 0, p->pReal->
2d00: 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43  pMethods->xFileC
2d10: 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
2d20: 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 7d 0a 0a   op, pArg));.}..
2d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2d40: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
2d50: 62 79 74 65 73 20 66 6f 72 20 61 6e 20 69 6e 73  bytes for an ins
2d60: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2d70: 63 20 69 6e 74 20 69 6e 73 74 53 65 63 74 6f 72  c int instSector
2d80: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
2d90: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f  e *pFile){.  OS_
2da0: 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 45 43 54 4f  TIME_IO(OS_SECTO
2db0: 52 53 49 5a 45 2c 20 30 2c 20 30 2c 20 70 2d 3e  RSIZE, 0, 0, p->
2dc0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
2dd0: 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  >xSectorSize(p->
2de0: 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pReal));.}../*.*
2df0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
2e00: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
2e10: 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
2e20: 65 64 20 62 79 20 61 6e 20 69 6e 73 74 2d 66 69  ed by an inst-fi
2e30: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2e40: 74 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72  t instDeviceChar
2e50: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
2e60: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
2e70: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
2e80: 53 5f 44 45 56 43 48 41 52 2c 20 30 2c 20 30 2c  S_DEVCHAR, 0, 0,
2e90: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2ea0: 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72  ods->xDeviceChar
2eb0: 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70  acteristics(p->p
2ec0: 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Real));.}../*.**
2ed0: 20 4f 70 65 6e 20 61 6e 20 69 6e 73 74 20 66 69   Open an inst fi
2ee0: 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
2ef0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4f 70 65  atic int instOpe
2f00: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2f10: 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20   *pVfs,.  const 
2f20: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73  char *zName,.  s
2f30: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2f40: 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  le,.  int flags,
2f50: 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
2f60: 73 0a 29 7b 0a 20 20 69 6e 73 74 5f 66 69 6c 65  s.){.  inst_file
2f70: 20 2a 70 20 3d 20 28 69 6e 73 74 5f 66 69 6c 65   *p = (inst_file
2f80: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c   *)pFile;.  pFil
2f90: 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 69  e->pMethods = &i
2fa0: 6e 73 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a  nst_io_methods;.
2fb0: 20 20 70 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71    p->pReal = (sq
2fc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b  lite3_file *)&p[
2fd0: 31 5d 3b 0a 20 20 70 2d 3e 70 49 6e 73 74 56 66  1];.  p->pInstVf
2fe0: 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70  s = (InstVfs *)p
2ff0: 56 66 73 3b 0a 20 20 70 2d 3e 7a 4e 61 6d 65 20  Vfs;.  p->zName 
3000: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 2d 3e 66 6c  = zName;.  p->fl
3010: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
3020: 2d 3e 69 46 69 6c 65 49 64 20 3d 20 2b 2b 70 2d  ->iFileId = ++p-
3030: 3e 70 49 6e 73 74 56 66 73 2d 3e 69 4e 65 78 74  >pInstVfs->iNext
3040: 46 69 6c 65 49 64 3b 0a 0a 20 20 62 69 6e 61 72  FileId;..  binar
3050: 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20  ylog_blob(pVfs, 
3060: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 4f 53  zName, -1);.  OS
3070: 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f 4f 50 45  _TIME_VFS(OS_OPE
3080: 4e 2c 20 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  N, zName, flags,
3090: 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 30 2c 0a   p->iFileId, 0,.
30a0: 20 20 20 20 52 45 41 4c 56 46 53 28 70 56 66 73      REALVFS(pVfs
30b0: 29 2d 3e 78 4f 70 65 6e 28 52 45 41 4c 56 46 53  )->xOpen(REALVFS
30c0: 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c 20 70  (pVfs), zName, p
30d0: 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20  ->pReal, flags, 
30e0: 70 4f 75 74 46 6c 61 67 73 29 0a 20 20 29 3b 0a  pOutFlags).  );.
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
3100: 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64  the file located
3110: 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
3120: 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
3130: 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 65  nt is true,.** e
3140: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 2d 73  nsure the file-s
3150: 79 73 74 65 6d 20 6d 6f 64 69 66 69 63 61 74 69  ystem modificati
3160: 6f 6e 73 20 61 72 65 20 73 79 6e 63 65 64 20 74  ons are synced t
3170: 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 0a 2a 2a  o disk before.**
3180: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
3190: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65  tatic int instDe
31a0: 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
31b0: 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
31c0: 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64  ar *zPath, int d
31d0: 69 72 53 79 6e 63 29 7b 0a 20 20 62 69 6e 61 72  irSync){.  binar
31e0: 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20  ylog_blob(pVfs, 
31f0: 7a 50 61 74 68 2c 20 2d 31 29 3b 0a 20 20 4f 53  zPath, -1);.  OS
3200: 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f 44 45 4c  _TIME_VFS(OS_DEL
3210: 45 54 45 2c 20 7a 50 61 74 68 2c 20 30 2c 20 64  ETE, zPath, 0, d
3220: 69 72 53 79 6e 63 2c 20 30 2c 0a 20 20 20 20 52  irSync, 0,.    R
3230: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44  EALVFS(pVfs)->xD
3240: 65 6c 65 74 65 28 52 45 41 4c 56 46 53 28 70 56  elete(REALVFS(pV
3250: 66 73 29 2c 20 7a 50 61 74 68 2c 20 64 69 72 53  fs), zPath, dirS
3260: 79 6e 63 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  ync) .  );.}../*
3270: 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63  .** Test for acc
3280: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ess permissions.
3290: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
32a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 65  the requested pe
32b0: 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  rmission.** is a
32c0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c  vailable, or fal
32d0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
32e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
32f0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76  Access(sqlite3_v
3300: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
3310: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
3320: 20 66 6c 61 67 73 29 7b 0a 20 20 62 69 6e 61 72   flags){.  binar
3330: 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20  ylog_blob(pVfs, 
3340: 7a 50 61 74 68 2c 20 2d 31 29 3b 0a 20 20 4f 53  zPath, -1);.  OS
3350: 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f 41 43 43  _TIME_VFS(OS_ACC
3360: 45 53 53 2c 20 7a 50 61 74 68 2c 20 30 2c 20 66  ESS, zPath, 0, f
3370: 6c 61 67 73 2c 20 30 2c 20 0a 20 20 20 20 52 45  lags, 0, .    RE
3380: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 41 63  ALVFS(pVfs)->xAc
3390: 63 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66  cess(REALVFS(pVf
33a0: 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73  s), zPath, flags
33b0: 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ) .  );.}../*.**
33c0: 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72   Populate buffer
33d0: 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 61 20   zBufOut with a 
33e0: 70 61 74 68 6e 61 6d 65 20 73 75 69 74 61 62 6c  pathname suitabl
33f0: 65 20 66 6f 72 20 75 73 65 20 61 73 20 61 20 0a  e for use as a .
3400: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
3410: 65 2e 20 7a 42 75 66 4f 75 74 20 69 73 20 67 75  e. zBufOut is gu
3420: 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e  aranteed to poin
3430: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
3440: 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 28 49   .** at least (I
3450: 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45  NST_MAX_PATHNAME
3460: 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  +1) bytes..*/.st
3470: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 47 65 74  atic int instGet
3480: 54 65 6d 70 4e 61 6d 65 28 73 71 6c 69 74 65 33  TempName(sqlite3
3490: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
34a0: 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a 42 75 66  nOut, char *zBuf
34b0: 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f  Out){.  OS_TIME_
34c0: 56 46 53 28 20 4f 53 5f 47 45 54 54 45 4d 50 4e  VFS( OS_GETTEMPN
34d0: 41 4d 45 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  AME, 0, 0, 0, 0,
34e0: 0a 20 20 20 20 52 45 41 4c 56 46 53 28 70 56 66  .    REALVFS(pVf
34f0: 73 29 2d 3e 78 47 65 74 54 65 6d 70 6e 61 6d 65  s)->xGetTempname
3500: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
3510: 6e 4f 75 74 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nOut, zBufOut);.
3520: 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f    );.}../*.** Po
3530: 70 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f  pulate buffer zO
3540: 75 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c  ut with the full
3550: 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e   canonical pathn
3560: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
3570: 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68  g.** to the path
3580: 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a  name in zPath. z
3590: 4f 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  Out is guarantee
35a0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
35b0: 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20  buffer.** of at 
35c0: 6c 65 61 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f  least (INST_MAX_
35d0: 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65  PATHNAME+1) byte
35e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
35f0: 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d   instFullPathnam
3600: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
3610: 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
3620: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
3630: 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68   int nOut, .  ch
3640: 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 4f 53  ar *zOut.){.  OS
3650: 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 46 55  _TIME_VFS( OS_FU
3660: 4c 4c 50 41 54 48 4e 41 4d 45 2c 20 7a 50 61 74  LLPATHNAME, zPat
3670: 68 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  h, 0, 0, 0,.    
3680: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78  REALVFS(pVfs)->x
3690: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 52 45 41  FullPathname(REA
36a0: 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74  LVFS(pVfs), zPat
36b0: 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a  h, nOut, zOut);.
36c0: 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70    );.}../*.** Op
36d0: 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  en the dynamic l
36e0: 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61  ibrary located a
36f0: 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75  t zPath and retu
3700: 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  rn a handle..*/.
3710: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 6e 73  static void *ins
3720: 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  tDlOpen(sqlite3_
3730: 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
3740: 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20   char *zPath){. 
3750: 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53 28   return REALVFS(
3760: 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28 52  pVfs)->xDlOpen(R
3770: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50  EALVFS(pVfs), zP
3780: 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ath);.}../*.** P
3790: 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66  opulate the buff
37a0: 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65  er zErrMsg (size
37b0: 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69   nByte bytes) wi
37c0: 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61  th a human reada
37d0: 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72  ble.** utf-8 str
37e0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
37f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
3800: 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
3810: 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
3820: 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62  with dynamic lib
3830: 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  raries..*/.stati
3840: 63 20 76 6f 69 64 20 69 6e 73 74 44 6c 45 72 72  c void instDlErr
3850: 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
3860: 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c  pVfs, int nByte,
3870: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b   char *zErrMsg){
3880: 0a 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29  .  REALVFS(pVfs)
3890: 2d 3e 78 44 6c 45 72 72 6f 72 28 52 45 41 4c 56  ->xDlError(REALV
38a0: 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65 2c  FS(pVfs), nByte,
38b0: 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a   zErrMsg);.}../*
38c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
38d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62  nter to the symb
38e0: 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68  ol zSymbol in th
38f0: 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
3900: 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  y pHandle..*/.st
3910: 61 74 69 63 20 76 6f 69 64 20 2a 69 6e 73 74 44  atic void *instD
3920: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
3930: 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
3940: 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  andle, const cha
3950: 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72  r *zSymbol){.  r
3960: 65 74 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56  eturn REALVFS(pV
3970: 66 73 29 2d 3e 78 44 6c 53 79 6d 28 52 45 41 4c  fs)->xDlSym(REAL
3980: 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e 64  VFS(pVfs), pHand
3990: 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a  le, zSymbol);.}.
39a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
39b0: 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
39c0: 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e   handle pHandle.
39d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
39e0: 69 6e 73 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69  instDlClose(sqli
39f0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
3a00: 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
3a10: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e   REALVFS(pVfs)->
3a20: 78 44 6c 43 6c 6f 73 65 28 52 45 41 4c 56 46 53  xDlClose(REALVFS
3a30: 28 70 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 29  (pVfs), pHandle)
3a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
3a50: 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70  ate the buffer p
3a60: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75  ointed to by zBu
3a70: 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20  fOut with nByte 
3a80: 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e  bytes of .** ran
3a90: 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  dom data..*/.sta
3aa0: 74 69 63 20 69 6e 74 20 69 6e 73 74 52 61 6e 64  tic int instRand
3ab0: 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
3ac0: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
3ad0: 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  yte, char *zBufO
3ae0: 75 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56  ut){.  OS_TIME_V
3af0: 46 53 28 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53  FS( OS_RANDOMNES
3b00: 53 2c 20 30 2c 20 30 2c 20 6e 42 79 74 65 2c 20  S, 0, 0, nByte, 
3b10: 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 53 28 70  0,.    REALVFS(p
3b20: 56 66 73 29 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73  Vfs)->xRandomnes
3b30: 73 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  s(REALVFS(pVfs),
3b40: 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75 74 29   nByte, zBufOut)
3b50: 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  );.}../*.** 
3b60: 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f  Sleep for nMicro
3b70: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52   microseconds. R
3b80: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3b90: 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
3ba0: 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c   .** actually sl
3bb0: 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
3bc0: 6e 74 20 69 6e 73 74 53 6c 65 65 70 28 73 71 6c  nt instSleep(sql
3bd0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
3be0: 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 4f  int nMicro){.  O
3bf0: 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 53  S_TIME_VFS( OS_S
3c00: 4c 45 45 50 2c 20 30 2c 20 30 2c 20 6e 4d 69 63  LEEP, 0, 0, nMic
3c10: 72 6f 2c 20 30 2c 20 0a 20 20 20 20 52 45 41 4c  ro, 0, .    REAL
3c20: 56 46 53 28 70 56 66 73 29 2d 3e 78 53 6c 65 65  VFS(pVfs)->xSlee
3c30: 70 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  p(REALVFS(pVfs),
3c40: 20 6e 4d 69 63 72 6f 29 20 0a 20 20 29 3b 0a 7d   nMicro) .  );.}
3c50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3c60: 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
3c70: 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
3c80: 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d 65  number in *pTime
3c90: 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Out..*/.static i
3ca0: 6e 74 20 69 6e 73 74 43 75 72 72 65 6e 74 54 69  nt instCurrentTi
3cb0: 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
3cc0: 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54  pVfs, double *pT
3cd0: 69 6d 65 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49  imeOut){.  OS_TI
3ce0: 4d 45 5f 56 46 53 28 20 4f 53 5f 43 55 52 52 45  ME_VFS( OS_CURRE
3cf0: 4e 54 54 49 4d 45 2c 20 30 2c 20 30 2c 20 30 2c  NTTIME, 0, 0, 0,
3d00: 20 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 53 28   0,.    REALVFS(
3d10: 70 56 66 73 29 2d 3e 78 43 75 72 72 65 6e 74 54  pVfs)->xCurrentT
3d20: 69 6d 65 28 52 45 41 4c 56 46 53 28 70 56 66 73  ime(REALVFS(pVfs
3d30: 29 2c 20 70 54 69 6d 65 4f 75 74 29 20 0a 20 20  ), pTimeOut) .  
3d40: 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 76 66  );.}..sqlite3_vf
3d50: 73 20 2a 73 71 6c 69 74 65 33 5f 69 6e 73 74 76  s *sqlite3_instv
3d60: 66 73 5f 63 72 65 61 74 65 28 63 6f 6e 73 74 20  fs_create(const 
3d70: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
3d80: 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
3d90: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
3da0: 20 20 49 6e 73 74 56 66 73 20 2a 70 3b 0a 20 20    InstVfs *p;.  
3db0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61  sqlite3_vfs *pPa
3dc0: 72 65 6e 74 3b 0a 0a 20 20 70 50 61 72 65 6e 74  rent;..  pParent
3dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
3de0: 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20 20  ind(zParent);.  
3df0: 69 66 28 20 21 70 50 61 72 65 6e 74 20 29 7b 0a  if( !pParent ){.
3e00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3e10: 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 72  }..  nByte = str
3e20: 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b  len(zName) + 1 +
3e30: 20 73 69 7a 65 6f 66 28 49 6e 73 74 56 66 73 29   sizeof(InstVfs)
3e40: 3b 0a 20 20 70 20 3d 20 28 49 6e 73 74 56 66 73  ;.  p = (InstVfs
3e50: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
3e60: 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  c(nByte);.  if( 
3e70: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  p ){.    char *z
3e80: 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 26  Copy = (char *)&
3e90: 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  p[1];.    memset
3ea0: 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  (p, 0, nByte);. 
3eb0: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 26 69 6e     memcpy(p, &in
3ec0: 73 74 5f 76 66 73 2c 20 73 69 7a 65 6f 66 28 73  st_vfs, sizeof(s
3ed0: 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20 20  qlite3_vfs));.  
3ee0: 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 50 61 72    p->pVfs = pPar
3ef0: 65 6e 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ent;.    memcpy(
3f00: 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c 20 73 74  zCopy, zName, st
3f10: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
3f20: 20 20 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20    p->base.zName 
3f30: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
3f40: 7a 43 6f 70 79 3b 0a 20 20 20 20 70 2d 3e 62 61  zCopy;.    p->ba
3f50: 73 65 2e 73 7a 4f 73 46 69 6c 65 20 2b 3d 20 70  se.szOsFile += p
3f60: 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65  Parent->szOsFile
3f70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
3f80: 73 5f 72 65 67 69 73 74 65 72 28 28 73 71 6c 69  s_register((sqli
3f90: 74 65 33 5f 76 66 73 20 2a 29 70 2c 20 30 29 3b  te3_vfs *)p, 0);
3fa0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
3fb0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 3b  sqlite3_vfs *)p;
3fc0: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
3fd0: 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75  _instvfs_configu
3fe0: 72 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  re(.  sqlite3_vf
3ff0: 73 20 2a 70 56 66 73 2c 0a 20 20 76 6f 69 64 20  s *pVfs,.  void 
4000: 28 2a 78 43 61 6c 6c 29 28 0a 20 20 20 20 20 20  (*xCall)(.      
4010: 76 6f 69 64 2a 2c 20 0a 20 20 20 20 20 20 69 6e  void*, .      in
4020: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4040: 46 69 6c 65 20 69 64 20 2a 2f 0a 20 20 20 20 20  File id */.     
4050: 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20   int,           
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 2f 2a 20 45 76 65 6e 74 20 63 6f 64 65 20 2a 2f  /* Event code */
4080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
4090: 6e 74 36 34 2c 20 0a 20 20 20 20 20 20 69 6e 74  nt64, .      int
40a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
40c0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
40d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c      const char*,
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
4100: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 2c 20 0a 20  */.      int, . 
4110: 20 20 20 20 20 69 6e 74 2c 20 0a 20 20 20 20 20       int, .     
4120: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 0a 20   sqlite3_int64. 
4130: 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69   ),.  void *pCli
4140: 65 6e 74 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  ent,.  void (*xD
4150: 65 6c 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20  el)(void *).){. 
4160: 20 49 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49   InstVfs *p = (I
4170: 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20  nstVfs *)pVfs;. 
4180: 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78   assert( pVfs->x
4190: 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29  Open==instOpen )
41a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20  ;.  if( p->xDel 
41b0: 29 7b 0a 20 20 20 20 70 2d 3e 78 44 65 6c 28 70  ){.    p->xDel(p
41c0: 2d 3e 70 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a  ->pClient);.  }.
41d0: 20 20 70 2d 3e 78 43 61 6c 6c 20 3d 20 78 43 61    p->xCall = xCa
41e0: 6c 6c 3b 0a 20 20 70 2d 3e 78 44 65 6c 20 3d 20  ll;.  p->xDel = 
41f0: 78 44 65 6c 3b 0a 20 20 70 2d 3e 70 43 6c 69 65  xDel;.  p->pClie
4200: 6e 74 20 3d 20 70 43 6c 69 65 6e 74 3b 0a 7d 0a  nt = pClient;.}.
4210: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
4220: 73 74 76 66 73 5f 64 65 73 74 72 6f 79 28 73 71  stvfs_destroy(sq
4230: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29  lite3_vfs *pVfs)
4240: 7b 0a 20 20 69 66 28 20 70 56 66 73 20 29 7b 0a  {.  if( pVfs ){.
4250: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
4260: 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29  unregister(pVfs)
4270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
4280: 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28  stvfs_configure(
4290: 70 56 66 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  pVfs, 0, 0, 0);.
42a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
42b0: 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  (pVfs);.  }.}..v
42c0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  oid sqlite3_inst
42d0: 76 66 73 5f 72 65 73 65 74 28 73 71 6c 69 74 65  vfs_reset(sqlite
42e0: 33 5f 76 66 73 20 2a 70 56 66 73 29 7b 0a 20 20  3_vfs *pVfs){.  
42f0: 49 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49 6e  InstVfs *p = (In
4300: 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20  stVfs *)pVfs;.  
4310: 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78 4f  assert( pVfs->xO
4320: 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29 3b  pen==instOpen );
4330: 0a 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 54 69  .  memset(p->aTi
4340: 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  me, 0, sizeof(sq
4350: 6c 69 74 65 33 5f 69 6e 74 36 34 29 2a 4f 53 5f  lite3_int64)*OS_
4360: 4e 55 4d 45 56 45 4e 54 53 29 3b 0a 20 20 6d 65  NUMEVENTS);.  me
4370: 6d 73 65 74 28 70 2d 3e 61 43 6f 75 6e 74 2c 20  mset(p->aCount, 
4380: 30 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 4f  0, sizeof(int)*O
4390: 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b 0a 7d 0a  S_NUMEVENTS);.}.
43a0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
43b0: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 6e 61 6d  ite3_instvfs_nam
43c0: 65 28 69 6e 74 20 65 45 76 65 6e 74 29 7b 0a 20  e(int eEvent){. 
43d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76   const char *zEv
43e0: 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 77 69 74  ent = 0;..  swit
43f0: 63 68 28 20 65 45 76 65 6e 74 20 29 7b 0a 20 20  ch( eEvent ){.  
4400: 20 20 63 61 73 65 20 4f 53 5f 43 4c 4f 53 45 3a    case OS_CLOSE:
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76               zEv
4420: 65 6e 74 20 3d 20 22 78 43 6c 6f 73 65 22 3b 20  ent = "xClose"; 
4430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4440: 4f 53 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  OS_READ:        
4450: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
4460: 78 52 65 61 64 22 3b 20 62 72 65 61 6b 3b 0a 20  xRead"; break;. 
4470: 20 20 20 63 61 73 65 20 4f 53 5f 57 52 49 54 45     case OS_WRITE
4480: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  :             zE
4490: 76 65 6e 74 20 3d 20 22 78 57 72 69 74 65 22 3b  vent = "xWrite";
44a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
44b0: 20 4f 53 5f 54 52 55 4e 43 41 54 45 3a 20 20 20   OS_TRUNCATE:   
44c0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
44d0: 22 78 54 72 75 6e 63 61 74 65 22 3b 20 62 72 65  "xTruncate"; bre
44e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
44f0: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 20 20 20  SYNC:           
4500: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 79     zEvent = "xSy
4510: 6e 63 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  nc"; break;.    
4520: 63 61 73 65 20 4f 53 5f 46 49 4c 45 53 49 5a 45  case OS_FILESIZE
4530: 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e  :          zEven
4540: 74 20 3d 20 22 78 46 69 6c 65 73 69 7a 65 22 3b  t = "xFilesize";
4550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4560: 20 4f 53 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20   OS_LOCK:       
4570: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
4580: 22 78 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a  "xLock"; break;.
4590: 20 20 20 20 63 61 73 65 20 4f 53 5f 55 4e 4c 4f      case OS_UNLO
45a0: 43 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  CK:            z
45b0: 45 76 65 6e 74 20 3d 20 22 78 55 6e 6c 6f 63 6b  Event = "xUnlock
45c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
45d0: 73 65 20 4f 53 5f 43 48 45 43 4b 52 45 53 45 52  se OS_CHECKRESER
45e0: 56 45 44 4c 4f 43 4b 3a 20 7a 45 76 65 6e 74 20  VEDLOCK: zEvent 
45f0: 3d 20 22 78 43 68 65 63 6b 52 65 73 65 72 76 65  = "xCheckReserve
4600: 64 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20  dLock"; break;. 
4610: 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45 43     case OS_FILEC
4620: 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20 20 7a 45  ONTROL:       zE
4630: 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 43 6f 6e  vent = "xFileCon
4640: 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b 0a 20 20  trol"; break;.  
4650: 20 20 63 61 73 65 20 4f 53 5f 53 45 43 54 4f 52    case OS_SECTOR
4660: 53 49 5a 45 3a 20 20 20 20 20 20 20 20 7a 45 76  SIZE:        zEv
4670: 65 6e 74 20 3d 20 22 78 53 65 63 74 6f 72 53 69  ent = "xSectorSi
4680: 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ze"; break;.    
4690: 63 61 73 65 20 4f 53 5f 44 45 56 43 48 41 52 3a  case OS_DEVCHAR:
46a0: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
46b0: 74 20 3d 20 22 78 44 65 76 69 63 65 43 68 61 72  t = "xDeviceChar
46c0: 61 63 74 65 72 69 73 74 69 63 73 22 3b 20 62 72  acteristics"; br
46d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
46e0: 5f 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20  _OPEN:          
46f0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 4f      zEvent = "xO
4700: 70 65 6e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  pen"; break;.   
4710: 20 63 61 73 65 20 4f 53 5f 44 45 4c 45 54 45 3a   case OS_DELETE:
4720: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
4730: 6e 74 20 3d 20 22 78 44 65 6c 65 74 65 22 3b 20  nt = "xDelete"; 
4740: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4750: 4f 53 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  OS_ACCESS:      
4760: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
4770: 78 41 63 63 65 73 73 22 3b 20 62 72 65 61 6b 3b  xAccess"; break;
4780: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 47 45 54  .    case OS_GET
4790: 54 45 4d 50 4e 41 4d 45 3a 20 20 20 20 20 20 20  TEMPNAME:       
47a0: 7a 45 76 65 6e 74 20 3d 20 22 78 47 65 74 54 65  zEvent = "xGetTe
47b0: 6d 70 4e 61 6d 65 22 3b 20 62 72 65 61 6b 3b 0a  mpName"; break;.
47c0: 20 20 20 20 63 61 73 65 20 4f 53 5f 46 55 4c 4c      case OS_FULL
47d0: 50 41 54 48 4e 41 4d 45 3a 20 20 20 20 20 20 7a  PATHNAME:      z
47e0: 45 76 65 6e 74 20 3d 20 22 78 46 75 6c 6c 50 61  Event = "xFullPa
47f0: 74 68 6e 61 6d 65 22 3b 20 62 72 65 61 6b 3b 0a  thname"; break;.
4800: 20 20 20 20 63 61 73 65 20 4f 53 5f 52 41 4e 44      case OS_RAND
4810: 4f 4d 4e 45 53 53 3a 20 20 20 20 20 20 20 20 7a  OMNESS:        z
4820: 45 76 65 6e 74 20 3d 20 22 78 52 61 6e 64 6f 6d  Event = "xRandom
4830: 6e 65 73 73 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ness"; break;.  
4840: 20 20 63 61 73 65 20 4f 53 5f 53 4c 45 45 50 3a    case OS_SLEEP:
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76               zEv
4860: 65 6e 74 20 3d 20 22 78 53 6c 65 65 70 22 3b 20  ent = "xSleep"; 
4870: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4880: 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d 45 3a 20  OS_CURRENTTIME: 
4890: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
48a0: 78 43 75 72 72 65 6e 74 54 69 6d 65 22 3b 20 62  xCurrentTime"; b
48b0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
48c0: 75 72 6e 20 7a 45 76 65 6e 74 3b 0a 7d 0a 0a 76  urn zEvent;.}..v
48d0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  oid sqlite3_inst
48e0: 76 66 73 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  vfs_get(.  sqlit
48f0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
4900: 20 69 6e 74 20 65 45 76 65 6e 74 2c 20 0a 20 20   int eEvent, .  
4910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
4920: 76 65 6e 74 2c 20 0a 20 20 73 71 6c 69 74 65 33  vent, .  sqlite3
4930: 5f 69 6e 74 36 34 20 2a 70 6e 43 6c 69 63 6b 2c  _int64 *pnClick,
4940: 20 0a 20 20 69 6e 74 20 2a 70 6e 43 61 6c 6c 0a   .  int *pnCall.
4950: 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20  ){.  InstVfs *p 
4960: 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66  = (InstVfs *)pVf
4970: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  s;.  assert( pVf
4980: 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70  s->xOpen==instOp
4990: 65 6e 20 29 3b 0a 20 20 69 66 28 20 65 45 76 65  en );.  if( eEve
49a0: 6e 74 3c 31 20 7c 7c 20 65 45 76 65 6e 74 3e 3d  nt<1 || eEvent>=
49b0: 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 20 29 7b 0a  OS_NUMEVENTS ){.
49c0: 20 20 20 20 2a 70 7a 45 76 65 6e 74 20 3d 20 30      *pzEvent = 0
49d0: 3b 0a 20 20 20 20 2a 70 6e 43 6c 69 63 6b 20 3d  ;.    *pnClick =
49e0: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 61 6c 6c 20   0;.    *pnCall 
49f0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
4a00: 0a 20 20 7d 0a 0a 20 20 2a 70 7a 45 76 65 6e 74  .  }..  *pzEvent
4a10: 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76   = sqlite3_instv
4a20: 66 73 5f 6e 61 6d 65 28 65 45 76 65 6e 74 29 3b  fs_name(eEvent);
4a30: 0a 20 20 2a 70 6e 43 6c 69 63 6b 20 3d 20 70 2d  .  *pnClick = p-
4a40: 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 5d 3b 0a  >aTime[eEvent];.
4a50: 20 20 2a 70 6e 43 61 6c 6c 20 3d 20 70 2d 3e 61    *pnCall = p->a
4a60: 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 3b 0a 7d  Count[eEvent];.}
4a70: 0a 0a 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59  ..#define BINARY
4a80: 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45 20 31  LOG_BUFFERSIZE 1
4a90: 30 32 34 0a 0a 73 74 72 75 63 74 20 49 6e 73 74  024..struct Inst
4aa0: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 7b 0a 20  VfsBinaryLog {. 
4ab0: 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 63 68 61   int nBuf;.  cha
4ac0: 72 20 2a 7a 42 75 66 3b 0a 20 20 73 71 6c 69 74  r *zBuf;.  sqlit
4ad0: 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74  e3_int64 iOffset
4ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
4af0: 20 2a 70 4f 75 74 3b 0a 20 20 63 68 61 72 20 2a   *pOut;.  char *
4b00: 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  zOut;           
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4b20: 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  og file name */.
4b30: 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  };.typedef struc
4b40: 74 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c  t InstVfsBinaryL
4b50: 6f 67 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79  og InstVfsBinary
4b60: 4c 6f 67 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69  Log;..static voi
4b70: 64 20 70 75 74 33 32 62 69 74 73 28 75 6e 73 69  d put32bits(unsi
4b80: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 6e  gned char *p, un
4b90: 73 69 67 6e 65 64 20 69 6e 74 20 76 29 7b 0a 20  signed int v){. 
4ba0: 20 70 5b 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20   p[0] = v>>24;. 
4bb0: 20 70 5b 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20   p[1] = v>>16;. 
4bc0: 20 70 5b 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20   p[2] = v>>8;.  
4bd0: 70 5b 33 5d 20 3d 20 76 3b 0a 7d 0a 0a 73 74 61  p[3] = v;.}..sta
4be0: 74 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79 6c  tic void binaryl
4bf0: 6f 67 5f 66 6c 75 73 68 28 49 6e 73 74 56 66 73  og_flush(InstVfs
4c00: 42 69 6e 61 72 79 4c 6f 67 20 2a 70 4c 6f 67 29  BinaryLog *pLog)
4c10: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
4c20: 20 2a 70 46 69 6c 65 20 3d 20 70 4c 6f 67 2d 3e   *pFile = pLog->
4c30: 70 4f 75 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOut;..#ifdef SQ
4c40: 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65  LITE_TEST.  exte
4c50: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
4c60: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
4c70: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
4c80: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
4c90: 65 72 73 69 73 74 3b 0a 20 20 65 78 74 65 72 6e  ersist;.  extern
4ca0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 73   int sqlite3_dis
4cb0: 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a 0a  kfull_pending;..
4cc0: 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20    int pending = 
4cd0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
4ce0: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 69 6e 74 20  _pending;.  int 
4cf0: 70 65 72 73 69 73 74 20 3d 20 73 71 6c 69 74 65  persist = sqlite
4d00: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69  3_io_error_persi
4d10: 73 74 3b 0a 20 20 69 6e 74 20 64 69 73 6b 66 75  st;.  int diskfu
4d20: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 64 69 73  ll = sqlite3_dis
4d30: 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a 0a  kfull_pending;..
4d40: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
4d50: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  or_pending = 0;.
4d60: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
4d70: 6f 72 5f 70 65 72 73 69 73 74 20 3d 20 30 3b 0a  or_persist = 0;.
4d80: 20 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75    sqlite3_diskfu
4d90: 6c 6c 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ll_pending = 0;.
4da0: 23 65 6e 64 69 66 0a 0a 20 20 70 46 69 6c 65 2d  #endif..  pFile-
4db0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
4dc0: 65 28 70 46 69 6c 65 2c 20 70 4c 6f 67 2d 3e 7a  e(pFile, pLog->z
4dd0: 42 75 66 2c 20 70 4c 6f 67 2d 3e 6e 42 75 66 2c  Buf, pLog->nBuf,
4de0: 20 70 4c 6f 67 2d 3e 69 4f 66 66 73 65 74 29 3b   pLog->iOffset);
4df0: 0a 20 20 70 4c 6f 67 2d 3e 69 4f 66 66 73 65 74  .  pLog->iOffset
4e00: 20 2b 3d 20 70 4c 6f 67 2d 3e 6e 42 75 66 3b 0a   += pLog->nBuf;.
4e10: 20 20 70 4c 6f 67 2d 3e 6e 42 75 66 20 3d 20 30    pLog->nBuf = 0
4e20: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4e30: 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
4e40: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
4e50: 20 3d 20 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71   = pending;.  sq
4e60: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
4e70: 65 72 73 69 73 74 20 3d 20 70 65 72 73 69 73 74  ersist = persist
4e80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 69 73 6b  ;.  sqlite3_disk
4e90: 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 20 3d 20 64  full_pending = d
4ea0: 69 73 6b 66 75 6c 6c 3b 0a 23 65 6e 64 69 66 0a  iskfull;.#endif.
4eb0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  }..static void b
4ec0: 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 28 0a  inarylog_xcall(.
4ed0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74    void *p,.  int
4ee0: 20 65 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69   eEvent,.  int i
4ef0: 46 69 6c 65 49 64 2c 0a 20 20 73 71 6c 69 74 65  FileId,.  sqlite
4f00: 33 5f 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a  3_int64 nClick,.
4f10: 20 20 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64    int return_cod
4f20: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
4f30: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c  *zName,.  int fl
4f40: 61 67 73 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65  ags,.  int nByte
4f50: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
4f60: 34 20 69 4f 66 66 73 65 74 0a 29 7b 0a 20 20 49  4 iOffset.){.  I
4f70: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
4f80: 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74 56 66 73  *pLog = (InstVfs
4f90: 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70 3b 0a 20  BinaryLog *)p;. 
4fa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4fb0: 7a 52 65 63 3b 0a 20 20 69 66 28 20 28 32 38 2b  zRec;.  if( (28+
4fc0: 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e 42 49 4e 41  pLog->nBuf)>BINA
4fd0: 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45  RYLOG_BUFFERSIZE
4fe0: 20 29 7b 0a 20 20 20 20 62 69 6e 61 72 79 6c 6f   ){.    binarylo
4ff0: 67 5f 66 6c 75 73 68 28 70 4c 6f 67 29 3b 0a 20  g_flush(pLog);. 
5000: 20 7d 0a 20 20 7a 52 65 63 20 3d 20 28 75 6e 73   }.  zRec = (uns
5010: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 26 70 4c  igned char *)&pL
5020: 6f 67 2d 3e 7a 42 75 66 5b 70 4c 6f 67 2d 3e 6e  og->zBuf[pLog->n
5030: 42 75 66 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  Buf];.  put32bit
5040: 73 28 26 7a 52 65 63 5b 30 5d 2c 20 65 45 76 65  s(&zRec[0], eEve
5050: 6e 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  nt);.  put32bits
5060: 28 26 7a 52 65 63 5b 34 5d 2c 20 28 69 6e 74 29  (&zRec[4], (int)
5070: 69 46 69 6c 65 49 64 29 3b 0a 20 20 70 75 74 33  iFileId);.  put3
5080: 32 62 69 74 73 28 26 7a 52 65 63 5b 38 5d 2c 20  2bits(&zRec[8], 
5090: 28 69 6e 74 29 6e 43 6c 69 63 6b 29 3b 0a 20 20  (int)nClick);.  
50a0: 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b  put32bits(&zRec[
50b0: 31 32 5d 2c 20 72 65 74 75 72 6e 5f 63 6f 64 65  12], return_code
50c0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
50d0: 7a 52 65 63 5b 31 36 5d 2c 20 66 6c 61 67 73 29  zRec[16], flags)
50e0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
50f0: 52 65 63 5b 32 30 5d 2c 20 6e 42 79 74 65 29 3b  Rec[20], nByte);
5100: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 52  .  put32bits(&zR
5110: 65 63 5b 32 34 5d 2c 20 28 69 6e 74 29 69 4f 66  ec[24], (int)iOf
5120: 66 73 65 74 29 3b 0a 20 20 70 4c 6f 67 2d 3e 6e  fset);.  pLog->n
5130: 42 75 66 20 2b 3d 20 32 38 3b 0a 7d 0a 0a 73 74  Buf += 28;.}..st
5140: 61 74 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79  atic void binary
5150: 6c 6f 67 5f 78 64 65 6c 28 76 6f 69 64 20 2a 70  log_xdel(void *p
5160: 29 7b 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68  ){.  /* Close th
5170: 65 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 66  e log file and f
5180: 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ree the memory a
5190: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
51a0: 20 0a 20 20 2a 2a 20 49 6e 73 74 56 66 73 42 69   .  ** InstVfsBi
51b0: 6e 61 72 79 4c 6f 67 20 73 74 72 75 63 74 75 72  naryLog structur
51c0: 65 2e 0a 20 20 2a 2f 0a 20 20 49 6e 73 74 56 66  e..  */.  InstVf
51d0: 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 4c 6f 67  sBinaryLog *pLog
51e0: 20 3d 20 28 49 6e 73 74 56 66 73 42 69 6e 61 72   = (InstVfsBinar
51f0: 79 4c 6f 67 20 2a 29 70 3b 0a 20 20 73 71 6c 69  yLog *)p;.  sqli
5200: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
5210: 3d 20 70 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 20 20  = pLog->pOut;.  
5220: 69 66 28 20 70 4c 6f 67 2d 3e 6e 42 75 66 20 29  if( pLog->nBuf )
5230: 7b 0a 20 20 20 20 62 69 6e 61 72 79 6c 6f 67 5f  {.    binarylog_
5240: 66 6c 75 73 68 28 70 4c 6f 67 29 3b 0a 20 20 7d  flush(pLog);.  }
5250: 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
5260: 64 73 2d 3e 78 43 6c 6f 73 65 28 70 46 69 6c 65  ds->xClose(pFile
5270: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5280: 65 28 70 4c 6f 67 2d 3e 70 4f 75 74 29 3b 0a 20  e(pLog->pOut);. 
5290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
52a0: 6f 67 2d 3e 7a 42 75 66 29 3b 0a 20 20 73 71 6c  og->zBuf);.  sql
52b0: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 67 29 3b  ite3_free(pLog);
52c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
52d0: 62 69 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 0a  binarylog_blob(.
52e0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
52f0: 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Vfs,.  const cha
5300: 72 20 2a 7a 42 6c 6f 62 2c 0a 20 20 69 6e 74 20  r *zBlob,.  int 
5310: 6e 42 6c 6f 62 0a 29 7b 0a 20 20 75 6e 73 69 67  nBlob.){.  unsig
5320: 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 63 3b 0a  ned char *zRec;.
5330: 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20    int nWrite;.  
5340: 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56 66  InstVfs *pInstVf
5350: 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70  s = (InstVfs *)p
5360: 56 66 73 3b 0a 20 20 49 6e 73 74 56 66 73 42 69  Vfs;.  InstVfsBi
5370: 6e 61 72 79 4c 6f 67 20 2a 70 4c 6f 67 3b 0a 0a  naryLog *pLog;..
5380: 20 20 69 66 28 20 70 56 66 73 2d 3e 78 4f 70 65    if( pVfs->xOpe
5390: 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 7c 7c 20 70  n!=instOpen || p
53a0: 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 21 3d  InstVfs->xCall!=
53b0: 62 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 20  binarylog_xcall 
53c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
53d0: 20 7d 0a 0a 20 20 70 4c 6f 67 20 3d 20 28 49 6e   }..  pLog = (In
53e0: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a  stVfsBinaryLog *
53f0: 29 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65  )pInstVfs->pClie
5400: 6e 74 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 3c  nt;.  if( nBlob<
5410: 30 20 29 7b 0a 20 20 20 20 6e 42 6c 6f 62 20 3d  0 ){.    nBlob =
5420: 20 73 74 72 6c 65 6e 28 7a 42 6c 6f 62 29 3b 0a   strlen(zBlob);.
5430: 20 20 7d 0a 20 20 6e 57 72 69 74 65 20 3d 20 6e    }.  nWrite = n
5440: 42 6c 6f 62 20 2b 20 32 38 3b 0a 0a 20 20 69 66  Blob + 28;..  if
5450: 28 20 28 6e 57 72 69 74 65 2b 70 4c 6f 67 2d 3e  ( (nWrite+pLog->
5460: 6e 42 75 66 29 3e 42 49 4e 41 52 59 4c 4f 47 5f  nBuf)>BINARYLOG_
5470: 42 55 46 46 45 52 53 49 5a 45 20 29 7b 0a 20 20  BUFFERSIZE ){.  
5480: 20 20 62 69 6e 61 72 79 6c 6f 67 5f 66 6c 75 73    binarylog_flus
5490: 68 28 70 4c 6f 67 29 3b 0a 20 20 7d 0a 0a 20 20  h(pLog);.  }..  
54a0: 7a 52 65 63 20 3d 20 28 75 6e 73 69 67 6e 65 64  zRec = (unsigned
54b0: 20 63 68 61 72 20 2a 29 26 70 4c 6f 67 2d 3e 7a   char *)&pLog->z
54c0: 42 75 66 5b 70 4c 6f 67 2d 3e 6e 42 75 66 5d 3b  Buf[pLog->nBuf];
54d0: 0a 20 20 6d 65 6d 73 65 74 28 7a 52 65 63 2c 20  .  memset(zRec, 
54e0: 30 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20 70 75  0, nWrite);.  pu
54f0: 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 30 5d  t32bits(&zRec[0]
5500: 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 53 54 52 49  , BINARYLOG_STRI
5510: 4e 47 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  NG);.  put32bits
5520: 28 26 7a 52 65 63 5b 34 5d 2c 20 28 69 6e 74 29  (&zRec[4], (int)
5530: 6e 42 6c 6f 62 29 3b 0a 20 20 6d 65 6d 63 70 79  nBlob);.  memcpy
5540: 28 26 7a 52 65 63 5b 32 38 5d 2c 20 7a 42 6c 6f  (&zRec[28], zBlo
5550: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 70 4c 6f  b, nBlob);.  pLo
5560: 67 2d 3e 6e 42 75 66 20 2b 3d 20 6e 57 72 69 74  g->nBuf += nWrit
5570: 65 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74  e;.}..void sqlit
5580: 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 72  e3_instvfs_binar
5590: 79 6c 6f 67 5f 6d 61 72 6b 65 72 28 0a 20 20 73  ylog_marker(.  s
55a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
55b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
55c0: 7a 4d 61 72 6b 65 72 0a 29 7b 0a 20 20 49 6e 73  zMarker.){.  Ins
55d0: 74 56 66 73 20 2a 70 49 6e 73 74 56 66 73 20 3d  tVfs *pInstVfs =
55e0: 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73   (InstVfs *)pVfs
55f0: 3b 0a 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72  ;.  InstVfsBinar
5600: 79 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e  yLog *pLog = (In
5610: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a  stVfsBinaryLog *
5620: 29 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65  )pInstVfs->pClie
5630: 6e 74 3b 0a 20 20 62 69 6e 61 72 79 6c 6f 67 5f  nt;.  binarylog_
5640: 62 6c 6f 62 28 70 56 66 73 2c 20 7a 4d 61 72 6b  blob(pVfs, zMark
5650: 65 72 2c 20 2d 31 29 3b 0a 20 20 62 69 6e 61 72  er, -1);.  binar
5660: 79 6c 6f 67 5f 78 63 61 6c 6c 28 70 4c 6f 67 2c  ylog_xcall(pLog,
5670: 20 42 49 4e 41 52 59 4c 4f 47 5f 4d 41 52 4b 45   BINARYLOG_MARKE
5680: 52 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  R, 0, 0, 0, 0, 0
5690: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 73 71 6c 69  , 0, 0);.}..sqli
56a0: 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
56b0: 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c  _instvfs_binaryl
56c0: 6f 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  og(.  const char
56d0: 20 2a 7a 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20   *zVfs,.  const 
56e0: 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 56 66 73  char *zParentVfs
56f0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
5700: 2a 7a 4c 6f 67 0a 29 7b 0a 20 20 49 6e 73 74 56  *zLog.){.  InstV
5710: 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 3b 0a  fsBinaryLog *p;.
5720: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5730: 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Vfs;.  sqlite3_v
5740: 66 73 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 69  fs *pParent;.  i
5750: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
5760: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 3b  flags;.  int rc;
5770: 0a 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71  ..  pParent = sq
5780: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
5790: 50 61 72 65 6e 74 56 66 73 29 3b 0a 20 20 69 66  ParentVfs);.  if
57a0: 28 20 21 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  ( !pParent ){.  
57b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
57c0: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
57d0: 66 28 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c  f(InstVfsBinaryL
57e0: 6f 67 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6d  og) + pParent->m
57f0: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 70  xPathname+1;.  p
5800: 20 3d 20 28 49 6e 73 74 56 66 73 42 69 6e 61 72   = (InstVfsBinar
5810: 79 4c 6f 67 20 2a 29 73 71 6c 69 74 65 33 5f 6d  yLog *)sqlite3_m
5820: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
5830: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79  memset(p, 0, nBy
5840: 74 65 29 3b 0a 20 20 70 2d 3e 7a 42 75 66 20 3d  te);.  p->zBuf =
5850: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
5860: 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52  BINARYLOG_BUFFER
5870: 53 49 5a 45 29 3b 0a 20 20 70 2d 3e 7a 4f 75 74  SIZE);.  p->zOut
5880: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d   = (char *)&p[1]
5890: 3b 0a 20 20 70 2d 3e 70 4f 75 74 20 3d 20 28 73  ;.  p->pOut = (s
58a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
58b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 50 61  lite3_malloc(pPa
58c0: 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  rent->szOsFile);
58d0: 0a 20 20 70 50 61 72 65 6e 74 2d 3e 78 46 75 6c  .  pParent->xFul
58e0: 6c 50 61 74 68 6e 61 6d 65 28 70 50 61 72 65 6e  lPathname(pParen
58f0: 74 2c 20 7a 4c 6f 67 2c 20 70 50 61 72 65 6e 74  t, zLog, pParent
5900: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 70 2d  ->mxPathname, p-
5910: 3e 7a 4f 75 74 29 3b 0a 20 20 66 6c 61 67 73 20  >zOut);.  flags 
5920: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
5930: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
5940: 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
5950: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
5960: 55 52 4e 41 4c 3b 0a 20 20 70 50 61 72 65 6e 74  URNAL;.  pParent
5970: 2d 3e 78 44 65 6c 65 74 65 28 70 50 61 72 65 6e  ->xDelete(pParen
5980: 74 2c 20 70 2d 3e 7a 4f 75 74 2c 20 30 29 3b 0a  t, p->zOut, 0);.
5990: 20 20 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e    rc = pParent->
59a0: 78 4f 70 65 6e 28 70 50 61 72 65 6e 74 2c 20 70  xOpen(pParent, p
59b0: 2d 3e 7a 4f 75 74 2c 20 70 2d 3e 70 4f 75 74 2c  ->zOut, p->pOut,
59c0: 20 66 6c 61 67 73 2c 20 26 66 6c 61 67 73 29 3b   flags, &flags);
59d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
59e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63  E_OK ){.    memc
59f0: 70 79 28 70 2d 3e 7a 42 75 66 2c 20 22 73 71 6c  py(p->zBuf, "sql
5a00: 69 74 65 5f 6f 73 74 72 61 63 65 31 2e 2e 2e 2e  ite_ostrace1....
5a10: 2e 22 2c 20 32 30 29 3b 0a 20 20 20 20 70 2d 3e  .", 20);.    p->
5a20: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  iOffset = 0;.   
5a30: 20 70 2d 3e 6e 42 75 66 20 3d 20 32 30 3b 0a 20   p->nBuf = 20;. 
5a40: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
5a50: 20 20 20 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65     binarylog_xde
5a60: 6c 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  l(p);.    return
5a70: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 56 66 73 20   0;.  }..  pVfs 
5a80: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66  = sqlite3_instvf
5a90: 73 5f 63 72 65 61 74 65 28 7a 56 66 73 2c 20 7a  s_create(zVfs, z
5aa0: 50 61 72 65 6e 74 56 66 73 29 3b 0a 20 20 69 66  ParentVfs);.  if
5ab0: 28 20 70 56 66 73 20 29 7b 0a 20 20 20 20 73 71  ( pVfs ){.    sq
5ac0: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f  lite3_instvfs_co
5ad0: 6e 66 69 67 75 72 65 28 70 56 66 73 2c 20 62 69  nfigure(pVfs, bi
5ae0: 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 2c 20 70  narylog_xcall, p
5af0: 2c 20 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c  , binarylog_xdel
5b00: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
5b10: 20 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a   pVfs;.}../*****
5b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b60: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
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 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72 66 61  *.** Tcl interfa
5bc0: 63 65 20 73 74 61 72 74 73 20 68 65 72 65 2e 0a  ce starts here..
5bd0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
5be0: 53 54 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63  ST..#include <tc
5bf0: 6c 2e 68 3e 0a 0a 73 74 72 75 63 74 20 49 6e 73  l.h>..struct Ins
5c00: 74 56 66 73 43 61 6c 6c 20 7b 0a 20 20 54 63 6c  tVfsCall {.  Tcl
5c10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
5c20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
5c30: 69 70 74 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  ipt;.};.typedef 
5c40: 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 43 61  struct InstVfsCa
5c50: 6c 6c 20 49 6e 73 74 56 66 73 43 61 6c 6c 3b 0a  ll InstVfsCall;.
5c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
5c70: 74 5f 69 6e 73 74 76 66 73 5f 78 63 61 6c 6c 28  t_instvfs_xcall(
5c80: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e  .  void *p,.  in
5c90: 74 20 65 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20  t eEvent,.  int 
5ca0: 69 46 69 6c 65 49 64 2c 0a 20 20 73 71 6c 69 74  iFileId,.  sqlit
5cb0: 65 33 5f 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c  e3_int64 nClick,
5cc0: 0a 20 20 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f  .  int return_co
5cd0: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
5ce0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 66   *zName,.  int f
5cf0: 6c 61 67 73 2c 0a 20 20 69 6e 74 20 6e 42 79 74  lags,.  int nByt
5d00: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  e,.  sqlite3_int
5d10: 36 34 20 69 4f 66 66 73 65 74 0a 29 7b 0a 20 20  64 iOffset.){.  
5d20: 69 6e 74 20 72 63 3b 0a 20 20 49 6e 73 74 56 66  int rc;.  InstVf
5d30: 73 43 61 6c 6c 20 2a 70 43 61 6c 6c 20 3d 20 28  sCall *pCall = (
5d40: 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 29 70 3b  InstVfsCall *)p;
5d50: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a  .  Tcl_Obj *pObj
5d60: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
5d70: 4f 62 6a 28 20 70 43 61 6c 6c 2d 3e 70 53 63 72  Obj( pCall->pScr
5d80: 69 70 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ipt);.  const ch
5d90: 61 72 20 2a 7a 45 76 65 6e 74 20 3d 20 73 71 6c  ar *zEvent = sql
5da0: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 6e 61 6d  ite3_instvfs_nam
5db0: 65 28 65 45 76 65 6e 74 29 3b 0a 0a 20 20 54 63  e(eEvent);..  Tc
5dc0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
5dd0: 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Obj);.  Tcl_List
5de0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5df0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65  (0, pObj, Tcl_Ne
5e00: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 76 65 6e  wStringObj(zEven
5e10: 74 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  t, -1));.  Tcl_L
5e20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5e30: 65 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c  ent(0, pObj, Tcl
5e40: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e  _NewWideIntObj(n
5e50: 43 6c 69 63 6b 29 29 3b 0a 20 20 54 63 6c 5f 4c  Click));.  Tcl_L
5e60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5e70: 65 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c  ent(0, pObj, Tcl
5e80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
5e90: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
5ea0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5eb0: 65 6d 65 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54  ement(0, pObj, T
5ec0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79  cl_NewIntObj(nBy
5ed0: 74 65 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  te));.  Tcl_List
5ee0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5ef0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65  (0, pObj, Tcl_Ne
5f00: 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4f 66 66  wWideIntObj(iOff
5f10: 73 65 74 29 29 3b 0a 0a 20 20 72 63 20 3d 20 54  set));..  rc = T
5f20: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 43 61  cl_EvalObjEx(pCa
5f30: 6c 6c 2d 3e 69 6e 74 65 72 70 2c 20 70 4f 62 6a  ll->interp, pObj
5f40: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
5f50: 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  L|TCL_EVAL_DIREC
5f60: 54 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  T);.  if( rc ){.
5f70: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
5f80: 6e 64 45 72 72 6f 72 28 70 43 61 6c 6c 2d 3e 69  ndError(pCall->i
5f90: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63  nterp);.  }.  Tc
5fa0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5fb0: 4f 62 6a 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Obj);.}..static 
5fc0: 76 6f 69 64 20 74 65 73 74 5f 69 6e 73 74 76 66  void test_instvf
5fd0: 73 5f 78 64 65 6c 28 76 6f 69 64 20 2a 70 29 7b  s_xdel(void *p){
5fe0: 0a 20 20 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a  .  InstVfsCall *
5ff0: 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73  pCall = (InstVfs
6000: 43 61 6c 6c 20 2a 29 70 3b 0a 20 20 54 63 6c 5f  Call *)p;.  Tcl_
6010: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 61  DecrRefCount(pCa
6020: 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  ll->pScript);.  
6030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 61  sqlite3_free(pCa
6040: 6c 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ll);.}..static i
6050: 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  nt test_sqlite3_
6060: 69 6e 73 74 76 66 73 28 0a 20 20 76 6f 69 64 20  instvfs(.  void 
6070: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
6080: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6090: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
60a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
60b0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61   objv[].){.  sta
60c0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
60d0: 49 56 5f 73 74 72 73 5b 5d 20 3d 20 0a 20 20 20  IV_strs[] = .   
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 63              { "c
60f0: 72 65 61 74 65 22 2c 20 20 22 64 65 73 74 72 6f  reate",  "destro
6100: 79 22 2c 20 20 22 72 65 73 65 74 22 2c 20 20 22  y",  "reset",  "
6110: 72 65 70 6f 72 74 22 2c 20 22 63 6f 6e 66 69 67  report", "config
6120: 75 72 65 22 2c 20 22 62 69 6e 61 72 79 6c 6f 67  ure", "binarylog
6130: 22 2c 20 22 6d 61 72 6b 65 72 22 2c 20 30 20 7d  ", "marker", 0 }
6140: 3b 0a 20 20 65 6e 75 6d 20 49 56 5f 65 6e 75 6d  ;.  enum IV_enum
6150: 20 7b 20 49 56 5f 43 52 45 41 54 45 2c 20 49 56   { IV_CREATE, IV
6160: 5f 44 45 53 54 52 4f 59 2c 20 49 56 5f 52 45 53  _DESTROY, IV_RES
6170: 45 54 2c 20 49 56 5f 52 45 50 4f 52 54 2c 20 49  ET, IV_REPORT, I
6180: 56 5f 43 4f 4e 46 49 47 55 52 45 2c 20 49 56 5f  V_CONFIGURE, IV_
6190: 42 49 4e 41 52 59 4c 4f 47 2c 20 49 56 5f 4d 41  BINARYLOG, IV_MA
61a0: 52 4b 45 52 20 7d 3b 0a 20 20 69 6e 74 20 69 53  RKER };.  int iS
61b0: 75 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c  ub;..  if( objc<
61c0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
61d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
61e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d  , 1, objv, "SUB-
61f0: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
6200: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
6210: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
6220: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 49 56  erp, objv[1], IV
6230: 5f 73 74 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d  _strs, "sub-comm
6240: 61 6e 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20  and", 0, &iSub) 
6250: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
6260: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
6270: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 49 56  switch( (enum IV
6280: 5f 65 6e 75 6d 29 69 53 75 62 20 29 7b 0a 20 20  _enum)iSub ){.  
6290: 20 20 63 61 73 65 20 49 56 5f 43 52 45 41 54 45    case IV_CREATE
62a0: 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
62b0: 7a 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  zParent = 0;.   
62c0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
62d0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  p;.      int isD
62e0: 65 66 61 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  efault = 0;.    
62f0: 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 26 26 20    if( objc>2 && 
6300: 30 3d 3d 73 74 72 63 6d 70 28 22 2d 64 65 66 61  0==strcmp("-defa
6310: 75 6c 74 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  ult", Tcl_GetStr
6320: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b  ing(objv[2])) ){
6330: 0a 20 20 20 20 20 20 20 20 69 73 44 65 66 61 75  .        isDefau
6340: 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  lt = 1;.      }.
6350: 20 20 20 20 20 20 69 66 28 20 28 6f 62 6a 63 2d        if( (objc-
6360: 69 73 44 65 66 61 75 6c 74 29 21 3d 34 20 26 26  isDefault)!=4 &&
6370: 20 28 6f 62 6a 63 2d 69 73 44 65 66 61 75 6c 74   (objc-isDefault
6380: 29 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=3 ){.        
6390: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
63a0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
63b0: 2c 20 22 3f 2d 64 65 66 61 75 6c 74 3f 20 4e 41  , "?-default? NA
63c0: 4d 45 20 3f 50 41 52 45 4e 54 2d 56 46 53 3f 22  ME ?PARENT-VFS?"
63d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
63e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
63f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f     }.      if( o
6400: 62 6a 63 3d 3d 28 34 2b 69 73 44 65 66 61 75 6c  bjc==(4+isDefaul
6410: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  t) ){.        zP
6420: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
6430: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 2b 69 73 44  tring(objv[3+isD
6440: 65 66 61 75 6c 74 5d 29 3b 0a 20 20 20 20 20 20  efault]);.      
6450: 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  }.      p = sqli
6460: 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 72 65 61  te3_instvfs_crea
6470: 74 65 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  te(Tcl_GetString
6480: 28 6f 62 6a 76 5b 32 2b 69 73 44 65 66 61 75 6c  (objv[2+isDefaul
6490: 74 5d 29 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  t]), zParent);. 
64a0: 20 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20       if( !p ){. 
64b0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
64c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
64d0: 22 65 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20  "error creating 
64e0: 76 66 73 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  vfs ", 0);.     
64f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6500: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6510: 20 20 20 69 66 28 20 69 73 44 65 66 61 75 6c 74     if( isDefault
6520: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6530: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
6540: 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  (p, 1);.      }.
6550: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
6560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
6570: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 62  bjv[2]);.      b
6580: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6590: 63 61 73 65 20 49 56 5f 42 49 4e 41 52 59 4c 4f  case IV_BINARYLO
65a0: 47 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  G: {.      char 
65b0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
65c0: 20 20 63 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 30    char *zLog = 0
65d0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  ;.      char *zP
65e0: 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  arent = 0;.     
65f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b   sqlite3_vfs *p;
6600: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 65 66  .      int isDef
6610: 61 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ault = 0;.      
6620: 69 6e 74 20 61 72 67 62 61 73 65 20 3d 20 32 3b  int argbase = 2;
6630: 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ..      if( objc
6640: 3e 32 20 26 26 20 30 3d 3d 73 74 72 63 6d 70 28  >2 && 0==strcmp(
6650: 22 2d 64 65 66 61 75 6c 74 22 2c 20 54 63 6c 5f  "-default", Tcl_
6660: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61  GetString(objv[a
6670: 72 67 62 61 73 65 5d 29 29 20 29 7b 0a 20 20 20  rgbase])) ){.   
6680: 20 20 20 20 20 69 73 44 65 66 61 75 6c 74 20 3d       isDefault =
6690: 20 31 3b 0a 20 20 20 20 20 20 20 20 61 72 67 62   1;.        argb
66a0: 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ase++;.      }. 
66b0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 28 61       if( objc>(a
66c0: 72 67 62 61 73 65 2b 31 29 20 0a 20 20 20 20 20  rgbase+1) .     
66d0: 20 20 26 26 20 30 3d 3d 73 74 72 63 6d 70 28 22    && 0==strcmp("
66e0: 2d 70 61 72 65 6e 74 22 2c 20 54 63 6c 5f 47 65  -parent", Tcl_Ge
66f0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 72 67  tString(objv[arg
6700: 62 61 73 65 5d 29 29 20 0a 20 20 20 20 20 20 29  base])) .      )
6710: 7b 0a 20 20 20 20 20 20 20 20 7a 50 61 72 65 6e  {.        zParen
6720: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
6730: 67 28 6f 62 6a 76 5b 61 72 67 62 61 73 65 2b 31  g(objv[argbase+1
6740: 5d 29 3b 0a 20 20 20 20 20 20 20 20 61 72 67 62  ]);.        argb
6750: 61 73 65 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ase += 2;.      
6760: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  }..      if( (ob
6770: 6a 63 2d 61 72 67 62 61 73 65 29 21 3d 32 20 29  jc-argbase)!=2 )
6780: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
6790: 6f 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20 20 20  ongNumArgs(.    
67a0: 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
67b0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61  2, objv, "?-defa
67c0: 75 6c 74 3f 20 3f 2d 70 61 72 65 6e 74 20 56 46  ult? ?-parent VF
67d0: 53 3f 20 4e 41 4d 45 20 4c 4f 47 46 49 4c 45 22  S? NAME LOGFILE"
67e0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
67f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6800: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
6810: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
6820: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61  GetString(objv[a
6830: 72 67 62 61 73 65 5d 29 3b 0a 20 20 20 20 20 20  rgbase]);.      
6840: 7a 4c 6f 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zLog = Tcl_GetSt
6850: 72 69 6e 67 28 6f 62 6a 76 5b 61 72 67 62 61 73  ring(objv[argbas
6860: 65 2b 31 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d  e+1]);.      p =
6870: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
6880: 5f 62 69 6e 61 72 79 6c 6f 67 28 7a 4e 61 6d 65  _binarylog(zName
6890: 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 4c 6f 67 29  , zParent, zLog)
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 20 29  ;.      if( !p )
68b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
68c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
68d0: 70 2c 20 22 65 72 72 6f 72 20 63 72 65 61 74 69  p, "error creati
68e0: 6e 67 20 76 66 73 20 22 2c 20 30 29 3b 0a 20 20  ng vfs ", 0);.  
68f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6900: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
6910: 20 20 20 20 20 20 69 66 28 20 69 73 44 65 66 61        if( isDefa
6920: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ult ){.        s
6930: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
6940: 74 65 72 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  ter(p, 1);.     
6950: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74   }.      Tcl_Set
6960: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6970: 2c 20 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  , objv[2]);.    
6980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6990: 20 20 20 20 63 61 73 65 20 49 56 5f 4d 41 52 4b      case IV_MARK
69a0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
69b0: 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20  te3_vfs *p;.    
69c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
69d0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
69e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
69f0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 56 46 53 20  , 2, objv, "VFS 
6a00: 4d 41 52 4b 45 52 22 29 3b 0a 20 20 20 20 20 20  MARKER");.      
6a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6a20: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
6a30: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 66    p = sqlite3_vf
6a40: 73 5f 66 69 6e 64 28 54 63 6c 5f 47 65 74 53 74  s_find(Tcl_GetSt
6a50: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
6a60: 20 20 20 20 20 20 69 66 28 20 21 70 20 7c 7c 20        if( !p || 
6a70: 70 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73 74 4f 70  p->xOpen!=instOp
6a80: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  en ){.        Tc
6a90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6aa0: 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
6ab0: 76 66 73 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53  vfs: ", Tcl_GetS
6ac0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
6ad0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
6ae0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
6b00: 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61  te3_instvfs_bina
6b10: 72 79 6c 6f 67 5f 6d 61 72 6b 65 72 28 70 2c 20  rylog_marker(p, 
6b20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
6b30: 6a 76 5b 33 5d 29 29 3b 0a 20 20 20 20 20 20 54  jv[3]));.      T
6b40: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
6b50: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62 72  nterp);.      br
6b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
6b70: 63 61 73 65 20 49 56 5f 43 4f 4e 46 49 47 55 52  case IV_CONFIGUR
6b80: 45 3a 20 7b 0a 20 20 20 20 20 20 49 6e 73 74 56  E: {.      InstV
6b90: 66 73 43 61 6c 6c 20 2a 70 43 61 6c 6c 3b 0a 0a  fsCall *pCall;..
6ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
6bb0: 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 66 28 20  s *p;.      if( 
6bc0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
6bd0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6be0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6bf0: 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50  bjv, "NAME SCRIP
6c00: 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  T");.        ret
6c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6c20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d       }.      p =
6c30: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
6c40: 64 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  d(Tcl_GetString(
6c50: 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20  objv[2]));.     
6c60: 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 78 4f   if( !p || p->xO
6c70: 70 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 29 7b  pen!=instOpen ){
6c80: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
6c90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6ca0: 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  , "no such vfs: 
6cb0: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
6cc0: 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20  (objv[2]), 0);. 
6cd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6ce0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
6cf0: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  ..      if( strl
6d00: 65 6e 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  en(Tcl_GetString
6d10: 28 6f 62 6a 76 5b 33 5d 29 29 20 29 7b 0a 20 20  (objv[3])) ){.  
6d20: 20 20 20 20 20 20 70 43 61 6c 6c 20 3d 20 28 49        pCall = (I
6d30: 6e 73 74 56 66 73 43 61 6c 6c 20 2a 29 73 71 6c  nstVfsCall *)sql
6d40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
6d50: 6f 66 28 49 6e 73 74 56 66 73 43 61 6c 6c 29 29  of(InstVfsCall))
6d60: 3b 0a 20 20 20 20 20 20 20 20 70 43 61 6c 6c 2d  ;.        pCall-
6d70: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
6d80: 3b 0a 20 20 20 20 20 20 20 20 70 43 61 6c 6c 2d  ;.        pCall-
6d90: 3e 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  >pScript = Tcl_D
6da0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76  uplicateObj(objv
6db0: 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 54 63  [3]);.        Tc
6dc0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6dd0: 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Call->pScript);.
6de0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6df0: 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72  instvfs_configur
6e00: 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
6e10: 20 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78    test_instvfs_x
6e20: 63 61 6c 6c 2c 20 28 76 6f 69 64 20 2a 29 70 43  call, (void *)pC
6e30: 61 6c 6c 2c 20 74 65 73 74 5f 69 6e 73 74 76 66  all, test_instvf
6e40: 73 5f 78 64 65 6c 0a 20 20 20 20 20 20 20 20 29  s_xdel.        )
6e50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
6e70: 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 65  nstvfs_configure
6e80: 28 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  (p, 0, 0, 0);.  
6e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6ea0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
6eb0: 73 65 20 49 56 5f 52 45 50 4f 52 54 3a 0a 20 20  se IV_REPORT:.  
6ec0: 20 20 63 61 73 65 20 49 56 5f 44 45 53 54 52 4f    case IV_DESTRO
6ed0: 59 3a 0a 20 20 20 20 63 61 73 65 20 49 56 5f 52  Y:.    case IV_R
6ee0: 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  ESET: {.      sq
6ef0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20  lite3_vfs *p;.  
6f00: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
6f20: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6f30: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
6f40: 4d 45 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ME");.        re
6f50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20        }.      p 
6f70: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
6f80: 6e 64 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  nd(Tcl_GetString
6f90: 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20  (objv[2]));.    
6fa0: 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 78    if( !p || p->x
6fb0: 4f 70 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 29  Open!=instOpen )
6fc0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
6fd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6fe0: 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  p, "no such vfs:
6ff0: 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
7000: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a  g(objv[2]), 0);.
7010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
7020: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
7030: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28 28 65  }..      if( ((e
7040: 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75 62  num IV_enum)iSub
7050: 29 3d 3d 49 56 5f 44 45 53 54 52 4f 59 20 29 7b  )==IV_DESTROY ){
7060: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7070: 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79  _instvfs_destroy
7080: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
7090: 20 20 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56     if( ((enum IV
70a0: 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f  _enum)iSub)==IV_
70b0: 52 45 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20  RESET ){.       
70c0: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
70d0: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20  _reset(p);.     
70e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 28 65   }.      if( ((e
70f0: 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75 62  num IV_enum)iSub
7100: 29 3d 3d 49 56 5f 52 45 50 4f 52 54 20 29 7b 0a  )==IV_REPORT ){.
7110: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
7120: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
7130: 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  *pRet = Tcl_NewO
7140: 62 6a 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 63  bj();..        c
7150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7160: 20 3d 20 28 63 68 61 72 20 2a 29 31 3b 0a 20 20   = (char *)1;.  
7170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
7180: 74 36 34 20 6e 43 6c 69 63 6b 3b 0a 20 20 20 20  t64 nClick;.    
7190: 20 20 20 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20      int nCall;. 
71a0: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b         for(ii=1;
71b0: 20 7a 4e 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a 20   zName; ii++){. 
71c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
71d0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 70 2c 20  _instvfs_get(p, 
71e0: 69 69 2c 20 26 7a 4e 61 6d 65 2c 20 26 6e 43 6c  ii, &zName, &nCl
71f0: 69 63 6b 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20 20  ick, &nCall);.  
7200: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
7210: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
7220: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20   Tcl_Obj *pElem 
7230: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
7240: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
7250: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7260: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54  ment(0, pElem, T
7270: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7280: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20  zName, -1));.   
7290: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
72a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
72b0: 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f  t(0, pElem, Tcl_
72c0: 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c 29  NewIntObj(nCall)
72d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
72e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
72f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d  Element(0, pElem
7300: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
7310: 4f 62 6a 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20  Obj(nClick));.  
7320: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
7330: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7340: 6e 74 28 30 2c 20 70 52 65 74 2c 20 70 45 6c 65  nt(0, pRet, pEle
7350: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  m);.          }.
7360: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
7370: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
7380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
7390: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
73a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
73b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
73c0: 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69  _OK;.}..int Sqli
73d0: 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
73e0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
73f0: 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65  terp){.  Tcl_Cre
7400: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
7410: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 69  terp, "sqlite3_i
7420: 6e 73 74 76 66 73 22 2c 20 74 65 73 74 5f 73 71  nstvfs", test_sq
7430: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 2c 20 30  lite3_instvfs, 0
7440: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
7450: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  CL_OK;.}..#endif
7460: 0a                                               .