/ Hex Artifact Content
Login

Artifact b2947f2ef6201ecc0a922cd2241880a955f5af0d:


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 73 69 7a 65 2c 20 70 2d 3e 70 52 65 61  0, size, p->pRea
2860: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72  l->pMethods->xTr
2870: 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c  uncate(p->pReal,
2880: 20 73 69 7a 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   size));.}../*.*
2890: 2a 20 53 79 6e 63 20 61 6e 20 69 6e 73 74 2d 66  * Sync an inst-f
28a0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
28b0: 6e 74 20 69 6e 73 74 53 79 6e 63 28 73 71 6c 69  nt instSync(sqli
28c0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
28d0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4f   int flags){.  O
28e0: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 59 4e  S_TIME_IO(OS_SYN
28f0: 43 2c 20 66 6c 61 67 73 2c 20 30 2c 20 70 2d 3e  C, flags, 0, p->
2900: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
2910: 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c  >xSync(p->pReal,
2920: 20 66 6c 61 67 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a   flags));.}../*.
2930: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
2940: 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20  rrent file-size 
2950: 6f 66 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e  of an inst-file.
2960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2970: 6e 73 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nstFileSize(sqli
2980: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2990: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
29a0: 53 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45  Size){.  OS_TIME
29b0: 5f 49 4f 28 4f 53 5f 46 49 4c 45 53 49 5a 45 2c  _IO(OS_FILESIZE,
29c0: 20 28 69 6e 74 29 28 2a 70 53 69 7a 65 29 2c 20   (int)(*pSize), 
29d0: 30 2c 20 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c  0, .    p->pReal
29e0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
29f0: 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20  eSize(p->pReal, 
2a00: 70 53 69 7a 65 29 0a 20 20 29 3b 0a 7d 0a 0a 2f  pSize).  );.}../
2a10: 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 69 6e 73  *.** Lock an ins
2a20: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2a30: 63 20 69 6e 74 20 69 6e 73 74 4c 6f 63 6b 28 73  c int instLock(s
2a40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2a50: 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  le, int eLock){.
2a60: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f    OS_TIME_IO(OS_
2a70: 4c 4f 43 4b 2c 20 65 4c 6f 63 6b 2c 20 30 2c 20  LOCK, eLock, 0, 
2a80: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2a90: 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65  ds->xLock(p->pRe
2aa0: 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a  al, eLock));.}..
2ab0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20  /*.** Unlock an 
2ac0: 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  inst-file..*/.st
2ad0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 55 6e 6c  atic int instUnl
2ae0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2af0: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f   *pFile, int eLo
2b00: 63 6b 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49  ck){.  OS_TIME_I
2b10: 4f 28 4f 53 5f 55 4e 4c 4f 43 4b 2c 20 65 4c 6f  O(OS_UNLOCK, eLo
2b20: 63 6b 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d  ck, 0, p->pReal-
2b30: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f  >pMethods->xUnlo
2b40: 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f  ck(p->pReal, eLo
2b50: 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ck));.}../*.** C
2b60: 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72 20  heck if another 
2b70: 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64  file-handle hold
2b80: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2b90: 6b 20 6f 6e 20 61 6e 20 69 6e 73 74 2d 66 69 6c  k on an inst-fil
2ba0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2bb0: 20 69 6e 73 74 43 68 65 63 6b 52 65 73 65 72 76   instCheckReserv
2bc0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
2bd0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f  ile *pFile){.  O
2be0: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 43 48 45  S_TIME_IO(OS_CHE
2bf0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 2c 20  CKRESERVEDLOCK, 
2c00: 30 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e  0, 0, p->pReal->
2c10: 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b  pMethods->xCheck
2c20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e  ReservedLock(p->
2c30: 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pReal));.}../*.*
2c40: 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d  * File control m
2c50: 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f  ethod. For custo
2c60: 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  m operations on 
2c70: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f  an inst-file..*/
2c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
2c90: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
2ca0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2cb0: 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
2cc0: 41 72 67 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f  Arg){.  OS_TIME_
2cd0: 49 4f 28 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f  IO(OS_FILECONTRO
2ce0: 4c 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 52 65 61  L, 0, 0, p->pRea
2cf0: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69  l->pMethods->xFi
2d00: 6c 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65  leControl(p->pRe
2d10: 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a  al, op, pArg));.
2d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2d30: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
2d40: 69 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20  in bytes for an 
2d50: 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  inst-file..*/.st
2d60: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 53 65 63  atic int instSec
2d70: 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
2d80: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
2d90: 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 45  OS_TIME_IO(OS_SE
2da0: 43 54 4f 52 53 49 5a 45 2c 20 30 2c 20 30 2c 20  CTORSIZE, 0, 0, 
2db0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2dc0: 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28  ds->xSectorSize(
2dd0: 70 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f  p->pReal));.}../
2de0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2df0: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
2e00: 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70  istic flags supp
2e10: 6f 72 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74  orted by an inst
2e20: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2e30: 20 69 6e 74 20 69 6e 73 74 44 65 76 69 63 65 43   int instDeviceC
2e40: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
2e50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2e60: 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49  le){.  OS_TIME_I
2e70: 4f 28 4f 53 5f 44 45 56 43 48 41 52 2c 20 30 2c  O(OS_DEVCHAR, 0,
2e80: 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d   0, p->pReal->pM
2e90: 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43  ethods->xDeviceC
2ea0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2eb0: 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a  ->pReal));.}../*
2ec0: 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 69 6e 73 74  .** Open an inst
2ed0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
2ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
2ef0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2f00: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
2f10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
2f20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2f30: 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61  pFile,.  int fla
2f40: 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46  gs,.  int *pOutF
2f50: 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 73 74 5f 66  lags.){.  inst_f
2f60: 69 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f 66  ile *p = (inst_f
2f70: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70  ile *)pFile;.  p
2f80: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d  File->pMethods =
2f90: 20 26 69 6e 73 74 5f 69 6f 5f 6d 65 74 68 6f 64   &inst_io_method
2fa0: 73 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20 3d 20  s;.  p->pReal = 
2fb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
2fc0: 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 49 6e 73  &p[1];.  p->pIns
2fd0: 74 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20  tVfs = (InstVfs 
2fe0: 2a 29 70 56 66 73 3b 0a 20 20 70 2d 3e 7a 4e 61  *)pVfs;.  p->zNa
2ff0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 2d  me = zName;.  p-
3000: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
3010: 20 20 70 2d 3e 69 46 69 6c 65 49 64 20 3d 20 2b    p->iFileId = +
3020: 2b 70 2d 3e 70 49 6e 73 74 56 66 73 2d 3e 69 4e  +p->pInstVfs->iN
3030: 65 78 74 46 69 6c 65 49 64 3b 0a 0a 20 20 62 69  extFileId;..  bi
3040: 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66  narylog_blob(pVf
3050: 73 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  s, zName, -1);. 
3060: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f   OS_TIME_VFS(OS_
3070: 4f 50 45 4e 2c 20 7a 4e 61 6d 65 2c 20 66 6c 61  OPEN, zName, fla
3080: 67 73 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20  gs, p->iFileId, 
3090: 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 53 28 70  0,.    REALVFS(p
30a0: 56 66 73 29 2d 3e 78 4f 70 65 6e 28 52 45 41 4c  Vfs)->xOpen(REAL
30b0: 56 46 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65  VFS(pVfs), zName
30c0: 2c 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67  , p->pReal, flag
30d0: 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 0a 20 20  s, pOutFlags).  
30e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
30f0: 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61  te the file loca
3100: 74 65 64 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ted at zPath. If
3110: 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
3120: 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a  ument is true,.*
3130: 2a 20 65 6e 73 75 72 65 20 74 68 65 20 66 69 6c  * ensure the fil
3140: 65 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66 69 63  e-system modific
3150: 61 74 69 6f 6e 73 20 61 72 65 20 73 79 6e 63 65  ations are synce
3160: 64 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  d to disk before
3170: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
3180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
3190: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  tDelete(sqlite3_
31a0: 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
31b0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
31c0: 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 62 69  t dirSync){.  bi
31d0: 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66  narylog_blob(pVf
31e0: 73 2c 20 7a 50 61 74 68 2c 20 2d 31 29 3b 0a 20  s, zPath, -1);. 
31f0: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f   OS_TIME_VFS(OS_
3200: 44 45 4c 45 54 45 2c 20 7a 50 61 74 68 2c 20 30  DELETE, zPath, 0
3210: 2c 20 64 69 72 53 79 6e 63 2c 20 30 2c 0a 20 20  , dirSync, 0,.  
3220: 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d    REALVFS(pVfs)-
3230: 3e 78 44 65 6c 65 74 65 28 52 45 41 4c 56 46 53  >xDelete(REALVFS
3240: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 64  (pVfs), zPath, d
3250: 69 72 53 79 6e 63 29 20 0a 20 20 29 3b 0a 7d 0a  irSync) .  );.}.
3260: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
3270: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
3280: 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
3290: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
32a0: 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
32b0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
32c0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
32e0: 6e 73 74 41 63 63 65 73 73 28 73 71 6c 69 74 65  nstAccess(sqlite
32f0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
3300: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
3310: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 62 69  int flags){.  bi
3320: 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66  narylog_blob(pVf
3330: 73 2c 20 7a 50 61 74 68 2c 20 2d 31 29 3b 0a 20  s, zPath, -1);. 
3340: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f   OS_TIME_VFS(OS_
3350: 41 43 43 45 53 53 2c 20 7a 50 61 74 68 2c 20 30  ACCESS, zPath, 0
3360: 2c 20 66 6c 61 67 73 2c 20 30 2c 20 0a 20 20 20  , flags, 0, .   
3370: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e   REALVFS(pVfs)->
3380: 78 41 63 63 65 73 73 28 52 45 41 4c 56 46 53 28  xAccess(REALVFS(
3390: 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c  pVfs), zPath, fl
33a0: 61 67 73 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  ags) .  );.}../*
33b0: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66  .** Populate buf
33c0: 66 65 72 20 7a 42 75 66 4f 75 74 20 77 69 74 68  fer zBufOut with
33d0: 20 61 20 70 61 74 68 6e 61 6d 65 20 73 75 69 74   a pathname suit
33e0: 61 62 6c 65 20 66 6f 72 20 75 73 65 20 61 73 20  able for use as 
33f0: 61 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  a .** temporary 
3400: 66 69 6c 65 2e 20 7a 42 75 66 4f 75 74 20 69 73  file. zBufOut is
3410: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
3420: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
3430: 20 6f 66 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74   of .** at least
3440: 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e   (INST_MAX_PATHN
3450: 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f  AME+1) bytes..*/
3460: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
3470: 47 65 74 54 65 6d 70 4e 61 6d 65 28 73 71 6c 69  GetTempName(sqli
3480: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
3490: 6e 74 20 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a  nt nOut, char *z
34a0: 42 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49  BufOut){.  OS_TI
34b0: 4d 45 5f 56 46 53 28 20 4f 53 5f 47 45 54 54 45  ME_VFS( OS_GETTE
34c0: 4d 50 4e 41 4d 45 2c 20 30 2c 20 30 2c 20 30 2c  MPNAME, 0, 0, 0,
34d0: 20 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 53 28   0,.    REALVFS(
34e0: 70 56 66 73 29 2d 3e 78 47 65 74 54 65 6d 70 6e  pVfs)->xGetTempn
34f0: 61 6d 65 28 52 45 41 4c 56 46 53 28 70 56 66 73  ame(REALVFS(pVfs
3500: 29 2c 20 6e 4f 75 74 2c 20 7a 42 75 66 4f 75 74  ), nOut, zBufOut
3510: 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  );.  );.}../*.**
3520: 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72   Populate buffer
3530: 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20 66   zOut with the f
3540: 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61  ull canonical pa
3550: 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  thname correspon
3560: 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ding.** to the p
3570: 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68  athname in zPath
3580: 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61 6e  . zOut is guaran
3590: 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  teed to point to
35a0: 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20   a buffer.** of 
35b0: 61 74 20 6c 65 61 73 74 20 28 49 4e 53 54 5f 4d  at least (INST_M
35c0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20 62  AX_PATHNAME+1) b
35d0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
35e0: 69 6e 74 20 69 6e 73 74 46 75 6c 6c 50 61 74 68  int instFullPath
35f0: 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
3600: 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
3610: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
3620: 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20   .  int nOut, . 
3630: 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20   char *zOut.){. 
3640: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53   OS_TIME_VFS( OS
3650: 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 2c 20 7a  _FULLPATHNAME, z
3660: 50 61 74 68 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  Path, 0, 0, 0,. 
3670: 20 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29     REALVFS(pVfs)
3680: 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  ->xFullPathname(
3690: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a  REALVFS(pVfs), z
36a0: 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74  Path, nOut, zOut
36b0: 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  );.  );.}../*.**
36c0: 20 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69   Open the dynami
36d0: 63 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65  c library locate
36e0: 64 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72  d at zPath and r
36f0: 65 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a  eturn a handle..
3700: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
3710: 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74  instDlOpen(sqlit
3720: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
3730: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29  nst char *zPath)
3740: 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56  {.  return REALV
3750: 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65  FS(pVfs)->xDlOpe
3760: 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  n(REALVFS(pVfs),
3770: 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zPath);.}../*.*
3780: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62  * Populate the b
3790: 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73  uffer zErrMsg (s
37a0: 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73 29  ize nByte bytes)
37b0: 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65   with a human re
37c0: 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20  adable.** utf-8 
37d0: 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e  string describin
37e0: 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  g the most recen
37f0: 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
3800: 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a  red associated .
3810: 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20  ** with dynamic 
3820: 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74  libraries..*/.st
3830: 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 44 6c  atic void instDl
3840: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
3850: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
3860: 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  te, char *zErrMs
3870: 67 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56  g){.  REALVFS(pV
3880: 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 52 45  fs)->xDlError(RE
3890: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79  ALVFS(pVfs), nBy
38a0: 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
38b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
38c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
38d0: 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
38e0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
38f0: 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
3900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 6e  .static void *in
3910: 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  stDlSym(sqlite3_
3920: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
3930: 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  *pHandle, const 
3940: 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a  char *zSymbol){.
3950: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53    return REALVFS
3960: 28 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28 52  (pVfs)->xDlSym(R
3970: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70 48  EALVFS(pVfs), pH
3980: 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b  andle, zSymbol);
3990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
39a0: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
39b0: 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64  ary handle pHand
39c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
39d0: 69 64 20 69 6e 73 74 44 6c 43 6c 6f 73 65 28 73  id instDlClose(s
39e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
39f0: 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
3a00: 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56 66 73  {.  REALVFS(pVfs
3a10: 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 52 45 41 4c  )->xDlClose(REAL
3a20: 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e 64  VFS(pVfs), pHand
3a30: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  le);.}../*.** Po
3a40: 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
3a50: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
3a60: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79  zBufOut with nBy
3a70: 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20  te bytes of .** 
3a80: 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a  random data..*/.
3a90: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52  static int instR
3aa0: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
3ab0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
3ac0: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42   nByte, char *zB
3ad0: 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49 4d  ufOut){.  OS_TIM
3ae0: 45 5f 56 46 53 28 20 4f 53 5f 52 41 4e 44 4f 4d  E_VFS( OS_RANDOM
3af0: 4e 45 53 53 2c 20 30 2c 20 30 2c 20 6e 42 79 74  NESS, 0, 0, nByt
3b00: 65 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c 56 46  e, 0,.    REALVF
3b10: 53 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f 6d  S(pVfs)->xRandom
3b20: 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66  ness(REALVFS(pVf
3b30: 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f  s), nByte, zBufO
3b40: 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ut);.  );.}../*.
3b50: 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69  ** Sleep for nMi
3b60: 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  cro microseconds
3b70: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
3b80: 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
3b90: 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79  nds .** actually
3ba0: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
3bb0: 63 20 69 6e 74 20 69 6e 73 74 53 6c 65 65 70 28  c int instSleep(
3bc0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3bd0: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
3be0: 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f    OS_TIME_VFS( O
3bf0: 53 5f 53 4c 45 45 50 2c 20 30 2c 20 30 2c 20 6e  S_SLEEP, 0, 0, n
3c00: 4d 69 63 72 6f 2c 20 30 2c 20 0a 20 20 20 20 52  Micro, 0, .    R
3c10: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 53  EALVFS(pVfs)->xS
3c20: 6c 65 65 70 28 52 45 41 4c 56 46 53 28 70 56 66  leep(REALVFS(pVf
3c30: 73 29 2c 20 6e 4d 69 63 72 6f 29 20 0a 20 20 29  s), nMicro) .  )
3c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3c50: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
3c60: 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  me as a Julian D
3c70: 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54  ay number in *pT
3c80: 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  imeOut..*/.stati
3c90: 63 20 69 6e 74 20 69 6e 73 74 43 75 72 72 65 6e  c int instCurren
3ca0: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
3cb0: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
3cc0: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 4f 53  *pTimeOut){.  OS
3cd0: 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 43 55  _TIME_VFS( OS_CU
3ce0: 52 52 45 4e 54 54 49 4d 45 2c 20 30 2c 20 30 2c  RRENTTIME, 0, 0,
3cf0: 20 30 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c 56   0, 0,.    REALV
3d00: 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65  FS(pVfs)->xCurre
3d10: 6e 74 54 69 6d 65 28 52 45 41 4c 56 46 53 28 70  ntTime(REALVFS(p
3d20: 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 20  Vfs), pTimeOut) 
3d30: 0a 20 20 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33  .  );.}..sqlite3
3d40: 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 5f 69 6e  _vfs *sqlite3_in
3d50: 73 74 76 66 73 5f 63 72 65 61 74 65 28 63 6f 6e  stvfs_create(con
3d60: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
3d80: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ent){.  int nByt
3d90: 65 3b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 3b  e;.  InstVfs *p;
3da0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3db0: 70 50 61 72 65 6e 74 3b 0a 0a 20 20 70 50 61 72  pParent;..  pPar
3dc0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ent = sqlite3_vf
3dd0: 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b  s_find(zParent);
3de0: 0a 20 20 69 66 28 20 21 70 50 61 72 65 6e 74 20  .  if( !pParent 
3df0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3e00: 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20  .  }..  nByte = 
3e10: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
3e20: 31 20 2b 20 73 69 7a 65 6f 66 28 49 6e 73 74 56  1 + sizeof(InstV
3e30: 66 73 29 3b 0a 20 20 70 20 3d 20 28 49 6e 73 74  fs);.  p = (Inst
3e40: 56 66 73 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Vfs *)sqlite3_ma
3e50: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
3e60: 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
3e70: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
3e80: 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  *)&p[1];.    mem
3e90: 73 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29  set(p, 0, nByte)
3ea0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
3eb0: 26 69 6e 73 74 5f 76 66 73 2c 20 73 69 7a 65 6f  &inst_vfs, sizeo
3ec0: 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
3ed0: 0a 20 20 20 20 70 2d 3e 70 56 66 73 20 3d 20 70  .    p->pVfs = p
3ee0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 6d 65 6d 63  Parent;.    memc
3ef0: 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c  py(zCopy, zName,
3f00: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
3f10: 0a 20 20 20 20 70 2d 3e 62 61 73 65 2e 7a 4e 61  .    p->base.zNa
3f20: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
3f30: 20 2a 29 7a 43 6f 70 79 3b 0a 20 20 20 20 70 2d   *)zCopy;.    p-
3f40: 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 2b  >base.szOsFile +
3f50: 3d 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46  = pParent->szOsF
3f60: 69 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ile;.    sqlite3
3f70: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 28 73  _vfs_register((s
3f80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 2c 20  qlite3_vfs *)p, 
3f90: 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
3fa0: 6e 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  n (sqlite3_vfs *
3fb0: 29 70 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  )p;.}..void sqli
3fc0: 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66  te3_instvfs_conf
3fd0: 69 67 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33  igure(.  sqlite3
3fe0: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 76 6f  _vfs *pVfs,.  vo
3ff0: 69 64 20 28 2a 78 43 61 6c 6c 29 28 0a 20 20 20  id (*xCall)(.   
4000: 20 20 20 76 6f 69 64 2a 2c 20 0a 20 20 20 20 20     void*, .     
4010: 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20   int,           
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 2f 2a 20 46 69 6c 65 20 69 64 20 2a 2f 0a 20 20  /* File id */.  
4040: 20 20 20 20 69 6e 74 2c 20 20 20 20 20 20 20 20      int,        
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 2f 2a 20 45 76 65 6e 74 20 63 6f 64 65     /* Event code
4070: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
4080: 33 5f 69 6e 74 36 34 2c 20 0a 20 20 20 20 20 20  3_int64, .      
4090: 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  int,            
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
40c0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
40d0: 72 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r*,             
40e0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
40f0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 2c  me */.      int,
4100: 20 0a 20 20 20 20 20 20 69 6e 74 2c 20 0a 20 20   .      int, .  
4110: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4120: 34 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70  4.  ),.  void *p
4130: 43 6c 69 65 6e 74 2c 0a 20 20 76 6f 69 64 20 28  Client,.  void (
4140: 2a 78 44 65 6c 29 28 76 6f 69 64 20 2a 29 0a 29  *xDel)(void *).)
4150: 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20 3d  {.  InstVfs *p =
4160: 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73   (InstVfs *)pVfs
4170: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
4180: 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65  ->xOpen==instOpe
4190: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 78 44  n );.  if( p->xD
41a0: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 78 44 65  el ){.    p->xDe
41b0: 6c 28 70 2d 3e 70 43 6c 69 65 6e 74 29 3b 0a 20  l(p->pClient);. 
41c0: 20 7d 0a 20 20 70 2d 3e 78 43 61 6c 6c 20 3d 20   }.  p->xCall = 
41d0: 78 43 61 6c 6c 3b 0a 20 20 70 2d 3e 78 44 65 6c  xCall;.  p->xDel
41e0: 20 3d 20 78 44 65 6c 3b 0a 20 20 70 2d 3e 70 43   = xDel;.  p->pC
41f0: 6c 69 65 6e 74 20 3d 20 70 43 6c 69 65 6e 74 3b  lient = pClient;
4200: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
4210: 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79  _instvfs_destroy
4220: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
4230: 66 73 29 7b 0a 20 20 69 66 28 20 70 56 66 73 20  fs){.  if( pVfs 
4240: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
4250: 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56  fs_unregister(pV
4260: 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fs);.    sqlite3
4270: 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75  _instvfs_configu
4280: 72 65 28 70 56 66 73 2c 20 30 2c 20 30 2c 20 30  re(pVfs, 0, 0, 0
4290: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
42a0: 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d  ree(pVfs);.  }.}
42b0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  ..void sqlite3_i
42c0: 6e 73 74 76 66 73 5f 72 65 73 65 74 28 73 71 6c  nstvfs_reset(sql
42d0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29 7b  ite3_vfs *pVfs){
42e0: 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20 3d 20  .  InstVfs *p = 
42f0: 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b  (InstVfs *)pVfs;
4300: 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
4310: 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e  >xOpen==instOpen
4320: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2d 3e   );.  memset(p->
4330: 61 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66  aTime, 0, sizeof
4340: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2a  (sqlite3_int64)*
4350: 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b 0a 20  OS_NUMEVENTS);. 
4360: 20 6d 65 6d 73 65 74 28 70 2d 3e 61 43 6f 75 6e   memset(p->aCoun
4370: 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 74  t, 0, sizeof(int
4380: 29 2a 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b  )*OS_NUMEVENTS);
4390: 0a 7d 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .}..const char *
43a0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
43b0: 6e 61 6d 65 28 69 6e 74 20 65 45 76 65 6e 74 29  name(int eEvent)
43c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
43d0: 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 73  zEvent = 0;..  s
43e0: 77 69 74 63 68 28 20 65 45 76 65 6e 74 20 29 7b  witch( eEvent ){
43f0: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43 4c 4f  .    case OS_CLO
4400: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
4410: 7a 45 76 65 6e 74 20 3d 20 22 78 43 6c 6f 73 65  zEvent = "xClose
4420: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4430: 73 65 20 4f 53 5f 52 45 41 44 3a 20 20 20 20 20  se OS_READ:     
4440: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
4450: 3d 20 22 78 52 65 61 64 22 3b 20 62 72 65 61 6b  = "xRead"; break
4460: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 57 52  ;.    case OS_WR
4470: 49 54 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ITE:            
4480: 20 7a 45 76 65 6e 74 20 3d 20 22 78 57 72 69 74   zEvent = "xWrit
4490: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  e"; break;.    c
44a0: 61 73 65 20 4f 53 5f 54 52 55 4e 43 41 54 45 3a  ase OS_TRUNCATE:
44b0: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74            zEvent
44c0: 20 3d 20 22 78 54 72 75 6e 63 61 74 65 22 3b 20   = "xTruncate"; 
44d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
44e0: 4f 53 5f 53 59 4e 43 3a 20 20 20 20 20 20 20 20  OS_SYNC:        
44f0: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
4500: 78 53 79 6e 63 22 3b 20 62 72 65 61 6b 3b 0a 20  xSync"; break;. 
4510: 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45 53     case OS_FILES
4520: 49 5a 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45  IZE:          zE
4530: 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 73 69 7a  vent = "xFilesiz
4540: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  e"; break;.    c
4550: 61 73 65 20 4f 53 5f 4c 4f 43 4b 3a 20 20 20 20  ase OS_LOCK:    
4560: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74            zEvent
4570: 20 3d 20 22 78 4c 6f 63 6b 22 3b 20 62 72 65 61   = "xLock"; brea
4580: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 55  k;.    case OS_U
4590: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20  NLOCK:          
45a0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 55 6e 6c    zEvent = "xUnl
45b0: 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ock"; break;.   
45c0: 20 63 61 73 65 20 4f 53 5f 43 48 45 43 4b 52 45   case OS_CHECKRE
45d0: 53 45 52 56 45 44 4c 4f 43 4b 3a 20 7a 45 76 65  SERVEDLOCK: zEve
45e0: 6e 74 20 3d 20 22 78 43 68 65 63 6b 52 65 73 65  nt = "xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 22 3b 20 62 72 65 61 6b  rvedLock"; break
4600: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49  ;.    case OS_FI
4610: 4c 45 43 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20  LECONTROL:      
4620: 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65   zEvent = "xFile
4630: 43 6f 6e 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b  Control"; break;
4640: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 45 43  .    case OS_SEC
4650: 54 4f 52 53 49 5a 45 3a 20 20 20 20 20 20 20 20  TORSIZE:        
4660: 7a 45 76 65 6e 74 20 3d 20 22 78 53 65 63 74 6f  zEvent = "xSecto
4670: 72 53 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20  rSize"; break;. 
4680: 20 20 20 63 61 73 65 20 4f 53 5f 44 45 56 43 48     case OS_DEVCH
4690: 41 52 3a 20 20 20 20 20 20 20 20 20 20 20 7a 45  AR:           zE
46a0: 76 65 6e 74 20 3d 20 22 78 44 65 76 69 63 65 43  vent = "xDeviceC
46b0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 22 3b  haracteristics";
46c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
46d0: 20 4f 53 5f 4f 50 45 4e 3a 20 20 20 20 20 20 20   OS_OPEN:       
46e0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
46f0: 22 78 4f 70 65 6e 22 3b 20 62 72 65 61 6b 3b 0a  "xOpen"; break;.
4700: 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45 4c 45      case OS_DELE
4710: 54 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  TE:            z
4720: 45 76 65 6e 74 20 3d 20 22 78 44 65 6c 65 74 65  Event = "xDelete
4730: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4740: 73 65 20 4f 53 5f 41 43 43 45 53 53 3a 20 20 20  se OS_ACCESS:   
4750: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
4760: 3d 20 22 78 41 63 63 65 73 73 22 3b 20 62 72 65  = "xAccess"; bre
4770: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4780: 47 45 54 54 45 4d 50 4e 41 4d 45 3a 20 20 20 20  GETTEMPNAME:    
4790: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 47 65     zEvent = "xGe
47a0: 74 54 65 6d 70 4e 61 6d 65 22 3b 20 62 72 65 61  tTempName"; brea
47b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46  k;.    case OS_F
47c0: 55 4c 4c 50 41 54 48 4e 41 4d 45 3a 20 20 20 20  ULLPATHNAME:    
47d0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 75 6c    zEvent = "xFul
47e0: 6c 50 61 74 68 6e 61 6d 65 22 3b 20 62 72 65 61  lPathname"; brea
47f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 52  k;.    case OS_R
4800: 41 4e 44 4f 4d 4e 45 53 53 3a 20 20 20 20 20 20  ANDOMNESS:      
4810: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 52 61 6e    zEvent = "xRan
4820: 64 6f 6d 6e 65 73 73 22 3b 20 62 72 65 61 6b 3b  domness"; break;
4830: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 4c 45  .    case OS_SLE
4840: 45 50 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  EP:             
4850: 7a 45 76 65 6e 74 20 3d 20 22 78 53 6c 65 65 70  zEvent = "xSleep
4860: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4870: 73 65 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d  se OS_CURRENTTIM
4880: 45 3a 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20  E:       zEvent 
4890: 3d 20 22 78 43 75 72 72 65 6e 74 54 69 6d 65 22  = "xCurrentTime"
48a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ; break;.  }..  
48b0: 72 65 74 75 72 6e 20 7a 45 76 65 6e 74 3b 0a 7d  return zEvent;.}
48c0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  ..void sqlite3_i
48d0: 6e 73 74 76 66 73 5f 67 65 74 28 0a 20 20 73 71  nstvfs_get(.  sq
48e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
48f0: 20 0a 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 20   .  int eEvent, 
4900: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
4910: 70 7a 45 76 65 6e 74 2c 20 0a 20 20 73 71 6c 69  pzEvent, .  sqli
4920: 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 43 6c 69  te3_int64 *pnCli
4930: 63 6b 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43 61  ck, .  int *pnCa
4940: 6c 6c 0a 29 7b 0a 20 20 49 6e 73 74 56 66 73 20  ll.){.  InstVfs 
4950: 2a 70 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29  *p = (InstVfs *)
4960: 70 56 66 73 3b 0a 20 20 61 73 73 65 72 74 28 20  pVfs;.  assert( 
4970: 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73  pVfs->xOpen==ins
4980: 74 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 65  tOpen );.  if( e
4990: 45 76 65 6e 74 3c 31 20 7c 7c 20 65 45 76 65 6e  Event<1 || eEven
49a0: 74 3e 3d 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 20  t>=OS_NUMEVENTS 
49b0: 29 7b 0a 20 20 20 20 2a 70 7a 45 76 65 6e 74 20  ){.    *pzEvent 
49c0: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6c 69 63  = 0;.    *pnClic
49d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 61  k = 0;.    *pnCa
49e0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ll = 0;.    retu
49f0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 45 76  rn;.  }..  *pzEv
4a00: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e  ent = sqlite3_in
4a10: 73 74 76 66 73 5f 6e 61 6d 65 28 65 45 76 65 6e  stvfs_name(eEven
4a20: 74 29 3b 0a 20 20 2a 70 6e 43 6c 69 63 6b 20 3d  t);.  *pnClick =
4a30: 20 70 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74   p->aTime[eEvent
4a40: 5d 3b 0a 20 20 2a 70 6e 43 61 6c 6c 20 3d 20 70  ];.  *pnCall = p
4a50: 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d  ->aCount[eEvent]
4a60: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 49 4e  ;.}..#define BIN
4a70: 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a  ARYLOG_BUFFERSIZ
4a80: 45 20 31 30 32 34 0a 0a 73 74 72 75 63 74 20 49  E 1024..struct I
4a90: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
4aa0: 7b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  {.  int nBuf;.  
4ab0: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 73 71  char *zBuf;.  sq
4ac0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
4ad0: 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  set;.  sqlite3_f
4ae0: 69 6c 65 20 2a 70 4f 75 74 3b 0a 20 20 63 68 61  ile *pOut;.  cha
4af0: 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20  r *zOut;        
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b10: 2a 20 4c 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20  * Log file name 
4b20: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
4b30: 72 75 63 74 20 49 6e 73 74 56 66 73 42 69 6e 61  ruct InstVfsBina
4b40: 72 79 4c 6f 67 20 49 6e 73 74 56 66 73 42 69 6e  ryLog InstVfsBin
4b50: 61 72 79 4c 6f 67 3b 0a 0a 73 74 61 74 69 63 20  aryLog;..static 
4b60: 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 75  void put32bits(u
4b70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
4b80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 29   unsigned int v)
4b90: 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 32 34  {.  p[0] = v>>24
4ba0: 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e 3e 31 36  ;.  p[1] = v>>16
4bb0: 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e 3e 38 3b  ;.  p[2] = v>>8;
4bc0: 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a 7d 0a 0a  .  p[3] = v;.}..
4bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 61  static void bina
4be0: 72 79 6c 6f 67 5f 78 63 61 6c 6c 28 0a 20 20 76  rylog_xcall(.  v
4bf0: 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 65 45  oid *p,.  int eE
4c00: 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69 46 69 6c  vent,.  int iFil
4c10: 65 49 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  eId,.  sqlite3_i
4c20: 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20 69  nt64 nClick,.  i
4c30: 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c 0a  nt return_code,.
4c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
4c50: 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  ame,.  int flags
4c60: 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a 20  ,.  int nByte,. 
4c70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
4c80: 4f 66 66 73 65 74 0a 29 7b 0a 20 20 49 6e 73 74  Offset.){.  Inst
4c90: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 4c  VfsBinaryLog *pL
4ca0: 6f 67 20 3d 20 28 49 6e 73 74 56 66 73 42 69 6e  og = (InstVfsBin
4cb0: 61 72 79 4c 6f 67 20 2a 29 70 3b 0a 20 20 75 6e  aryLog *)p;.  un
4cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 65  signed char *zRe
4cd0: 63 3b 0a 20 20 69 66 28 20 28 32 38 2b 70 4c 6f  c;.  if( (28+pLo
4ce0: 67 2d 3e 6e 42 75 66 29 3e 42 49 4e 41 52 59 4c  g->nBuf)>BINARYL
4cf0: 4f 47 5f 42 55 46 46 45 52 53 49 5a 45 20 29 7b  OG_BUFFERSIZE ){
4d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
4d10: 65 20 2a 70 46 69 6c 65 20 3d 20 70 4c 6f 67 2d  e *pFile = pLog-
4d20: 3e 70 4f 75 74 3b 0a 20 20 20 20 70 46 69 6c 65  >pOut;.    pFile
4d30: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69  ->pMethods->xWri
4d40: 74 65 28 70 46 69 6c 65 2c 20 70 4c 6f 67 2d 3e  te(pFile, pLog->
4d50: 7a 42 75 66 2c 20 70 4c 6f 67 2d 3e 6e 42 75 66  zBuf, pLog->nBuf
4d60: 2c 20 70 4c 6f 67 2d 3e 69 4f 66 66 73 65 74 29  , pLog->iOffset)
4d70: 3b 0a 20 20 20 20 70 4c 6f 67 2d 3e 69 4f 66 66  ;.    pLog->iOff
4d80: 73 65 74 20 2b 3d 20 70 4c 6f 67 2d 3e 6e 42 75  set += pLog->nBu
4d90: 66 3b 0a 20 20 20 20 70 4c 6f 67 2d 3e 6e 42 75  f;.    pLog->nBu
4da0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 52 65  f = 0;.  }.  zRe
4db0: 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  c = (unsigned ch
4dc0: 61 72 20 2a 29 26 70 4c 6f 67 2d 3e 7a 42 75 66  ar *)&pLog->zBuf
4dd0: 5b 70 4c 6f 67 2d 3e 6e 42 75 66 5d 3b 0a 20 20  [pLog->nBuf];.  
4de0: 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b  put32bits(&zRec[
4df0: 30 5d 2c 20 65 45 76 65 6e 74 29 3b 0a 20 20 70  0], eEvent);.  p
4e00: 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 34  ut32bits(&zRec[4
4e10: 5d 2c 20 28 69 6e 74 29 69 46 69 6c 65 49 64 29  ], (int)iFileId)
4e20: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
4e30: 52 65 63 5b 38 5d 2c 20 28 69 6e 74 29 6e 43 6c  Rec[8], (int)nCl
4e40: 69 63 6b 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ick);.  put32bit
4e50: 73 28 26 7a 52 65 63 5b 31 32 5d 2c 20 72 65 74  s(&zRec[12], ret
4e60: 75 72 6e 5f 63 6f 64 65 29 3b 0a 20 20 70 75 74  urn_code);.  put
4e70: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 31 36 5d  32bits(&zRec[16]
4e80: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 75 74 33  , flags);.  put3
4e90: 32 62 69 74 73 28 26 7a 52 65 63 5b 32 30 5d 2c  2bits(&zRec[20],
4ea0: 20 6e 42 79 74 65 29 3b 0a 20 20 70 75 74 33 32   nByte);.  put32
4eb0: 62 69 74 73 28 26 7a 52 65 63 5b 32 34 5d 2c 20  bits(&zRec[24], 
4ec0: 28 69 6e 74 29 69 4f 66 66 73 65 74 29 3b 0a 20  (int)iOffset);. 
4ed0: 20 70 4c 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 32   pLog->nBuf += 2
4ee0: 38 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  8;.}..static voi
4ef0: 64 20 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c  d binarylog_xdel
4f00: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 2f 2a 20  (void *p){.  /* 
4f10: 43 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69  Close the log fi
4f20: 6c 65 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  le and free the 
4f30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
4f40: 20 66 6f 72 20 74 68 65 20 0a 20 20 2a 2a 20 49   for the .  ** I
4f50: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
4f60: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
4f70: 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c    InstVfsBinaryL
4f80: 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74  og *pLog = (Inst
4f90: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70  VfsBinaryLog *)p
4fa0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
4fb0: 20 2a 70 46 69 6c 65 20 3d 20 70 4c 6f 67 2d 3e   *pFile = pLog->
4fc0: 70 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f 67  pOut;.  if( pLog
4fd0: 2d 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 70 46  ->nBuf ){.    pF
4fe0: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
4ff0: 57 72 69 74 65 28 70 46 69 6c 65 2c 20 70 4c 6f  Write(pFile, pLo
5000: 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 2d 3e 6e  g->zBuf, pLog->n
5010: 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f 66 66 73  Buf, pLog->iOffs
5020: 65 74 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  et);.  }.  pFile
5030: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
5040: 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  se(pFile);.  sql
5050: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 67 2d 3e  ite3_free(pLog->
5060: 70 4f 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  pOut);.  sqlite3
5070: 5f 66 72 65 65 28 70 4c 6f 67 2d 3e 7a 42 75 66  _free(pLog->zBuf
5080: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5090: 65 28 70 4c 6f 67 29 3b 0a 7d 0a 0a 73 74 61 74  e(pLog);.}..stat
50a0: 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f  ic void binarylo
50b0: 67 5f 62 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  g_blob(.  sqlite
50c0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63  3_vfs *pVfs,.  c
50d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62  onst char *zBlob
50e0: 2c 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ,.  int nBlob.){
50f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5100: 20 2a 7a 52 65 63 3b 0a 20 20 69 6e 74 20 6e 57   *zRec;.  int nW
5110: 72 69 74 65 3b 0a 20 20 49 6e 73 74 56 66 73 20  rite;.  InstVfs 
5120: 2a 70 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73  *pInstVfs = (Ins
5130: 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 49  tVfs *)pVfs;.  I
5140: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
5150: 2a 70 4c 6f 67 3b 0a 0a 20 20 69 66 28 20 70 56  *pLog;..  if( pV
5160: 66 73 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73 74 4f  fs->xOpen!=instO
5170: 70 65 6e 20 7c 7c 20 70 49 6e 73 74 56 66 73 2d  pen || pInstVfs-
5180: 3e 78 43 61 6c 6c 21 3d 62 69 6e 61 72 79 6c 6f  >xCall!=binarylo
5190: 67 5f 78 63 61 6c 6c 20 29 7b 0a 20 20 20 20 72  g_xcall ){.    r
51a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 4c  eturn;.  }..  pL
51b0: 6f 67 20 3d 20 28 49 6e 73 74 56 66 73 42 69 6e  og = (InstVfsBin
51c0: 61 72 79 4c 6f 67 20 2a 29 70 49 6e 73 74 56 66  aryLog *)pInstVf
51d0: 73 2d 3e 70 43 6c 69 65 6e 74 3b 0a 20 20 69 66  s->pClient;.  if
51e0: 28 20 6e 42 6c 6f 62 3c 30 20 29 7b 0a 20 20 20  ( nBlob<0 ){.   
51f0: 20 6e 42 6c 6f 62 20 3d 20 73 74 72 6c 65 6e 28   nBlob = strlen(
5200: 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20 20 6e 57  zBlob);.  }.  nW
5210: 72 69 74 65 20 3d 20 6e 42 6c 6f 62 20 2b 20 32  rite = nBlob + 2
5220: 38 3b 0a 0a 20 20 69 66 28 20 28 6e 57 72 69 74  8;..  if( (nWrit
5230: 65 2b 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e 42 49  e+pLog->nBuf)>BI
5240: 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49  NARYLOG_BUFFERSI
5250: 5a 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ZE ){.    sqlite
5260: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  3_file *pFile = 
5270: 70 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 20 20 20 20  pLog->pOut;.    
5280: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  pFile->pMethods-
5290: 3e 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20 70  >xWrite(pFile, p
52a0: 4c 6f 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 2d  Log->zBuf, pLog-
52b0: 3e 6e 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f 66  >nBuf, pLog->iOf
52c0: 66 73 65 74 29 3b 0a 20 20 20 20 70 4c 6f 67 2d  fset);.    pLog-
52d0: 3e 69 4f 66 66 73 65 74 20 2b 3d 20 70 4c 6f 67  >iOffset += pLog
52e0: 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70 4c 6f 67  ->nBuf;.    pLog
52f0: 2d 3e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a  ->nBuf = 0;.  }.
5300: 0a 20 20 7a 52 65 63 20 3d 20 28 75 6e 73 69 67  .  zRec = (unsig
5310: 6e 65 64 20 63 68 61 72 20 2a 29 26 70 4c 6f 67  ned char *)&pLog
5320: 2d 3e 7a 42 75 66 5b 70 4c 6f 67 2d 3e 6e 42 75  ->zBuf[pLog->nBu
5330: 66 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 52 65  f];.  memset(zRe
5340: 63 2c 20 30 2c 20 6e 57 72 69 74 65 29 3b 0a 20  c, 0, nWrite);. 
5350: 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63   put32bits(&zRec
5360: 5b 30 5d 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 53  [0], BINARYLOG_S
5370: 54 52 49 4e 47 29 3b 0a 20 20 70 75 74 33 32 62  TRING);.  put32b
5380: 69 74 73 28 26 7a 52 65 63 5b 34 5d 2c 20 28 69  its(&zRec[4], (i
5390: 6e 74 29 6e 42 6c 6f 62 29 3b 0a 20 20 6d 65 6d  nt)nBlob);.  mem
53a0: 63 70 79 28 26 7a 52 65 63 5b 32 38 5d 2c 20 7a  cpy(&zRec[28], z
53b0: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
53c0: 70 4c 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 6e 57  pLog->nBuf += nW
53d0: 72 69 74 65 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  rite;.}..void sq
53e0: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69  lite3_instvfs_bi
53f0: 6e 61 72 79 6c 6f 67 5f 6d 61 72 6b 65 72 28 0a  narylog_marker(.
5400: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5410: 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Vfs,.  const cha
5420: 72 20 2a 7a 4d 61 72 6b 65 72 0a 29 7b 0a 20 20  r *zMarker.){.  
5430: 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56 66  InstVfs *pInstVf
5440: 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70  s = (InstVfs *)p
5450: 56 66 73 3b 0a 20 20 49 6e 73 74 56 66 73 42 69  Vfs;.  InstVfsBi
5460: 6e 61 72 79 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20  naryLog *pLog = 
5470: 28 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f  (InstVfsBinaryLo
5480: 67 20 2a 29 70 49 6e 73 74 56 66 73 2d 3e 70 43  g *)pInstVfs->pC
5490: 6c 69 65 6e 74 3b 0a 20 20 62 69 6e 61 72 79 6c  lient;.  binaryl
54a0: 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 4d  og_blob(pVfs, zM
54b0: 61 72 6b 65 72 2c 20 2d 31 29 3b 0a 20 20 62 69  arker, -1);.  bi
54c0: 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 28 70 4c  narylog_xcall(pL
54d0: 6f 67 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 4d 41  og, BINARYLOG_MA
54e0: 52 4b 45 52 2c 20 30 2c 20 30 2c 20 30 2c 20 30  RKER, 0, 0, 0, 0
54f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 73  , 0, 0, 0);.}..s
5500: 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
5510: 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61  te3_instvfs_bina
5520: 72 79 6c 6f 67 28 0a 20 20 63 6f 6e 73 74 20 63  rylog(.  const c
5530: 68 61 72 20 2a 7a 56 66 73 2c 0a 20 20 63 6f 6e  har *zVfs,.  con
5540: 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
5550: 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Vfs, .  const ch
5560: 61 72 20 2a 7a 4c 6f 67 0a 29 7b 0a 20 20 49 6e  ar *zLog.){.  In
5570: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a  stVfsBinaryLog *
5580: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  p;.  sqlite3_vfs
5590: 20 2a 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65   *pVfs;.  sqlite
55a0: 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b 0a  3_vfs *pParent;.
55b0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
55c0: 6e 74 20 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  nt flags;.  int 
55d0: 72 63 3b 0a 0a 20 20 70 50 61 72 65 6e 74 20 3d  rc;..  pParent =
55e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
55f0: 64 28 7a 50 61 72 65 6e 74 56 66 73 29 3b 0a 20  d(zParentVfs);. 
5600: 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 29 7b   if( !pParent ){
5610: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5620: 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   }..  nByte = si
5630: 7a 65 6f 66 28 49 6e 73 74 56 66 73 42 69 6e 61  zeof(InstVfsBina
5640: 72 79 4c 6f 67 29 20 2b 20 70 50 61 72 65 6e 74  ryLog) + pParent
5650: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
5660: 20 20 70 20 3d 20 28 49 6e 73 74 56 66 73 42 69    p = (InstVfsBi
5670: 6e 61 72 79 4c 6f 67 20 2a 29 73 71 6c 69 74 65  naryLog *)sqlite
5680: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
5690: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
56a0: 6e 42 79 74 65 29 3b 0a 20 20 70 2d 3e 7a 42 75  nByte);.  p->zBu
56b0: 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f = sqlite3_mall
56c0: 6f 63 28 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46  oc(BINARYLOG_BUF
56d0: 46 45 52 53 49 5a 45 29 3b 0a 20 20 70 2d 3e 7a  FERSIZE);.  p->z
56e0: 4f 75 74 20 3d 20 28 63 68 61 72 20 2a 29 26 70  Out = (char *)&p
56f0: 5b 31 5d 3b 0a 20 20 70 2d 3e 70 4f 75 74 20 3d  [1];.  p->pOut =
5700: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
5710: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
5720: 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c  pParent->szOsFil
5730: 65 29 3b 0a 20 20 70 50 61 72 65 6e 74 2d 3e 78  e);.  pParent->x
5740: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 50 61  FullPathname(pPa
5750: 72 65 6e 74 2c 20 7a 4c 6f 67 2c 20 70 50 61 72  rent, zLog, pPar
5760: 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  ent->mxPathname,
5770: 20 70 2d 3e 7a 4f 75 74 29 3b 0a 20 20 66 6c 61   p->zOut);.  fla
5780: 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
5790: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
57a0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
57b0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
57c0: 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 70 50 61 72  _JOURNAL;.  pPar
57d0: 65 6e 74 2d 3e 78 44 65 6c 65 74 65 28 70 50 61  ent->xDelete(pPa
57e0: 72 65 6e 74 2c 20 70 2d 3e 7a 4f 75 74 2c 20 30  rent, p->zOut, 0
57f0: 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 72 65 6e  );.  rc = pParen
5800: 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72 65 6e 74  t->xOpen(pParent
5810: 2c 20 70 2d 3e 7a 4f 75 74 2c 20 70 2d 3e 70 4f  , p->zOut, p->pO
5820: 75 74 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67  ut, flags, &flag
5830: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
5840: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
5850: 63 20 3d 20 70 2d 3e 70 4f 75 74 2d 3e 70 4d 65  c = p->pOut->pMe
5860: 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d  thods->xWrite(p-
5870: 3e 70 4f 75 74 2c 20 22 73 71 6c 69 74 65 5f 6f  >pOut, "sqlite_o
5880: 73 74 72 61 63 65 31 2e 2e 2e 2e 2e 22 2c 20 32  strace1.....", 2
5890: 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  0, 0);.    p->iO
58a0: 66 66 73 65 74 20 3d 20 32 30 3b 0a 20 20 7d 0a  ffset = 20;.  }.
58b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
58c0: 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28 70  binarylog_xdel(p
58d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
58e0: 0a 20 20 7d 0a 0a 20 20 70 56 66 73 20 3d 20 73  .  }..  pVfs = s
58f0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63  qlite3_instvfs_c
5900: 72 65 61 74 65 28 7a 56 66 73 2c 20 7a 50 61 72  reate(zVfs, zPar
5910: 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20 70  entVfs);.  if( p
5920: 56 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Vfs ){.    sqlit
5930: 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69  e3_instvfs_confi
5940: 67 75 72 65 28 70 56 66 73 2c 20 62 69 6e 61 72  gure(pVfs, binar
5950: 79 6c 6f 67 5f 78 63 61 6c 6c 2c 20 70 2c 20 62  ylog_xcall, p, b
5960: 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 29 3b 0a  inarylog_xdel);.
5970: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 56    }..  return pV
5980: 66 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  fs;.}../********
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59d0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
59e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5a20: 2a 20 54 63 6c 20 69 6e 74 65 72 66 61 63 65 20  * Tcl interface 
5a30: 73 74 61 72 74 73 20 68 65 72 65 2e 0a 2a 2f 0a  starts here..*/.
5a40: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
5a50: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
5a60: 3e 0a 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66  >..struct InstVf
5a70: 73 43 61 6c 6c 20 7b 0a 20 20 54 63 6c 5f 49 6e  sCall {.  Tcl_In
5a80: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
5a90: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
5aa0: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
5ab0: 75 63 74 20 49 6e 73 74 56 66 73 43 61 6c 6c 20  uct InstVfsCall 
5ac0: 49 6e 73 74 56 66 73 43 61 6c 6c 3b 0a 0a 73 74  InstVfsCall;..st
5ad0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 69  atic void test_i
5ae0: 6e 73 74 76 66 73 5f 78 63 61 6c 6c 28 0a 20 20  nstvfs_xcall(.  
5af0: 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 65  void *p,.  int e
5b00: 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69 46 69  Event,.  int iFi
5b10: 6c 65 49 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  leId,.  sqlite3_
5b20: 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20  int64 nClick,.  
5b30: 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c  int return_code,
5b40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5b50: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  Name,.  int flag
5b60: 73 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a  s,.  int nByte,.
5b70: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5b80: 69 4f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74  iOffset.){.  int
5b90: 20 72 63 3b 0a 20 20 49 6e 73 74 56 66 73 43 61   rc;.  InstVfsCa
5ba0: 6c 6c 20 2a 70 43 61 6c 6c 20 3d 20 28 49 6e 73  ll *pCall = (Ins
5bb0: 74 56 66 73 43 61 6c 6c 20 2a 29 70 3b 0a 20 20  tVfsCall *)p;.  
5bc0: 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20  Tcl_Obj *pObj = 
5bd0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5be0: 28 20 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74  ( pCall->pScript
5bf0: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5c00: 2a 7a 45 76 65 6e 74 20 3d 20 73 71 6c 69 74 65  *zEvent = sqlite
5c10: 33 5f 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65  3_instvfs_name(e
5c20: 45 76 65 6e 74 29 3b 0a 0a 20 20 54 63 6c 5f 49  Event);..  Tcl_I
5c30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a  ncrRefCount(pObj
5c40: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5c50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5c60: 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74   pObj, Tcl_NewSt
5c70: 72 69 6e 67 4f 62 6a 28 7a 45 76 65 6e 74 2c 20  ringObj(zEvent, 
5c80: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
5c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5ca0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65  (0, pObj, Tcl_Ne
5cb0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 43 6c 69  wWideIntObj(nCli
5cc0: 63 6b 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ck));.  Tcl_List
5cd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5ce0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65  (0, pObj, Tcl_Ne
5cf0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
5d00: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5d10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5d20: 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f  nt(0, pObj, Tcl_
5d30: 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29  NewIntObj(nByte)
5d40: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5d50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5d60: 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69   pObj, Tcl_NewWi
5d70: 64 65 49 6e 74 4f 62 6a 28 69 4f 66 66 73 65 74  deIntObj(iOffset
5d80: 29 29 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f  ));..  rc = Tcl_
5d90: 45 76 61 6c 4f 62 6a 45 78 28 70 43 61 6c 6c 2d  EvalObjEx(pCall-
5da0: 3e 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54  >interp, pObj, T
5db0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
5dc0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
5dd0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
5de0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
5df0: 72 72 6f 72 28 70 43 61 6c 6c 2d 3e 69 6e 74 65  rror(pCall->inte
5e00: 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  rp);.  }.  Tcl_D
5e10: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a  ecrRefCount(pObj
5e20: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
5e30: 64 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78  d test_instvfs_x
5e40: 64 65 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  del(void *p){.  
5e50: 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 70 43 61  InstVfsCall *pCa
5e60: 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73 43 61 6c  ll = (InstVfsCal
5e70: 6c 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63  l *)p;.  Tcl_Dec
5e80: 72 52 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d  rRefCount(pCall-
5e90: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 73 71 6c  >pScript);.  sql
5ea0: 69 74 65 33 5f 66 72 65 65 28 70 43 61 6c 6c 29  ite3_free(pCall)
5eb0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
5ec0: 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 69 6e 73  test_sqlite3_ins
5ed0: 74 76 66 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  tvfs(.  void * c
5ee0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
5ef0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5f00: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
5f10: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
5f20: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63  jv[].){.  static
5f30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 49 56 5f   const char *IV_
5f40: 73 74 72 73 5b 5d 20 3d 20 0a 20 20 20 20 20 20  strs[] = .      
5f50: 20 20 20 20 20 20 20 20 20 7b 20 22 63 72 65 61           { "crea
5f60: 74 65 22 2c 20 20 22 64 65 73 74 72 6f 79 22 2c  te",  "destroy",
5f70: 20 20 22 72 65 73 65 74 22 2c 20 20 22 72 65 70    "reset",  "rep
5f80: 6f 72 74 22 2c 20 22 63 6f 6e 66 69 67 75 72 65  ort", "configure
5f90: 22 2c 20 22 62 69 6e 61 72 79 6c 6f 67 22 2c 20  ", "binarylog", 
5fa0: 22 6d 61 72 6b 65 72 22 2c 20 30 20 7d 3b 0a 20  "marker", 0 };. 
5fb0: 20 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 20 7b 20   enum IV_enum { 
5fc0: 49 56 5f 43 52 45 41 54 45 2c 20 49 56 5f 44 45  IV_CREATE, IV_DE
5fd0: 53 54 52 4f 59 2c 20 49 56 5f 52 45 53 45 54 2c  STROY, IV_RESET,
5fe0: 20 49 56 5f 52 45 50 4f 52 54 2c 20 49 56 5f 43   IV_REPORT, IV_C
5ff0: 4f 4e 46 49 47 55 52 45 2c 20 49 56 5f 42 49 4e  ONFIGURE, IV_BIN
6000: 41 52 59 4c 4f 47 2c 20 49 56 5f 4d 41 52 4b 45  ARYLOG, IV_MARKE
6010: 52 20 7d 3b 0a 20 20 69 6e 74 20 69 53 75 62 3b  R };.  int iSub;
6020: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
6030: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
6040: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
6050: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d  , objv, "SUB-COM
6060: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a  MAND ...");.  }.
6070: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
6080: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
6090: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 49 56 5f 73 74  , objv[1], IV_st
60a0: 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64  rs, "sub-command
60b0: 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a  ", 0, &iSub) ){.
60c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
60d0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
60e0: 74 63 68 28 20 28 65 6e 75 6d 20 49 56 5f 65 6e  tch( (enum IV_en
60f0: 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20 20 63  um)iSub ){.    c
6100: 61 73 65 20 49 56 5f 43 52 45 41 54 45 3a 20 7b  ase IV_CREATE: {
6110: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 61  .      char *zPa
6120: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
6130: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a  sqlite3_vfs *p;.
6140: 20 20 20 20 20 20 69 6e 74 20 69 73 44 65 66 61        int isDefa
6150: 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ult = 0;.      i
6160: 66 28 20 6f 62 6a 63 3e 32 20 26 26 20 30 3d 3d  f( objc>2 && 0==
6170: 73 74 72 63 6d 70 28 22 2d 64 65 66 61 75 6c 74  strcmp("-default
6180: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
6190: 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20  (objv[2])) ){.  
61a0: 20 20 20 20 20 20 69 73 44 65 66 61 75 6c 74 20        isDefault 
61b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
61c0: 20 20 20 69 66 28 20 28 6f 62 6a 63 2d 69 73 44     if( (objc-isD
61d0: 65 66 61 75 6c 74 29 21 3d 34 20 26 26 20 28 6f  efault)!=4 && (o
61e0: 62 6a 63 2d 69 73 44 65 66 61 75 6c 74 29 21 3d  bjc-isDefault)!=
61f0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
6200: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6210: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6220: 3f 2d 64 65 66 61 75 6c 74 3f 20 4e 41 4d 45 20  ?-default? NAME 
6230: 3f 50 41 52 45 4e 54 2d 56 46 53 3f 22 29 3b 0a  ?PARENT-VFS?");.
6240: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
6250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
6260: 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  }.      if( objc
6270: 3d 3d 28 34 2b 69 73 44 65 66 61 75 6c 74 29 20  ==(4+isDefault) 
6280: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 61 72 65  ){.        zPare
6290: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  nt = Tcl_GetStri
62a0: 6e 67 28 6f 62 6a 76 5b 33 2b 69 73 44 65 66 61  ng(objv[3+isDefa
62b0: 75 6c 74 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult]);.      }. 
62c0: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
62d0: 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65 28  _instvfs_create(
62e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
62f0: 6a 76 5b 32 2b 69 73 44 65 66 61 75 6c 74 5d 29  jv[2+isDefault])
6300: 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , zParent);.    
6310: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
6320: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6330: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72  sult(interp, "er
6340: 72 6f 72 20 63 72 65 61 74 69 6e 67 20 76 66 73  ror creating vfs
6350: 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
6360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6380: 69 66 28 20 69 73 44 65 66 61 75 6c 74 20 29 7b  if( isDefault ){
6390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
63a0: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 2c  _vfs_register(p,
63b0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
63c0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
63d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ult(interp, objv
63e0: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [2]);.      brea
63f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6400: 65 20 49 56 5f 42 49 4e 41 52 59 4c 4f 47 3a 20  e IV_BINARYLOG: 
6410: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
6420: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
6430: 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 30 3b 0a 20  har *zLog = 0;. 
6440: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
6450: 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
6460: 73 44 65 66 61 75 6c 74 20 3d 20 30 3b 0a 20 20  sDefault = 0;.  
6470: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 26      if( objc>2 &
6480: 26 20 30 3d 3d 73 74 72 63 6d 70 28 22 2d 64 65  & 0==strcmp("-de
6490: 66 61 75 6c 74 22 2c 20 54 63 6c 5f 47 65 74 53  fault", Tcl_GetS
64a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
64b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 65 66  ){.        isDef
64c0: 61 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  ault = 1;.      
64d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 6a  }.      if( (obj
64e0: 63 2d 69 73 44 65 66 61 75 6c 74 29 21 3d 34 20  c-isDefault)!=4 
64f0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
6500: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6510: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
6520: 64 65 66 61 75 6c 74 3f 20 4e 41 4d 45 20 4c 4f  default? NAME LO
6530: 47 46 49 4c 45 22 29 3b 0a 20 20 20 20 20 20 20  GFILE");.       
6540: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6550: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
6560: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
6570: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 2b 69 73  String(objv[2+is
6580: 44 65 66 61 75 6c 74 5d 29 3b 0a 20 20 20 20 20  Default]);.     
6590: 20 7a 4c 6f 67 20 3d 20 54 63 6c 5f 47 65 74 53   zLog = Tcl_GetS
65a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 2b 69 73 44  tring(objv[3+isD
65b0: 65 66 61 75 6c 74 5d 29 3b 0a 20 20 20 20 20 20  efault]);.      
65c0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  p = sqlite3_inst
65d0: 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 28 7a 4e  vfs_binarylog(zN
65e0: 61 6d 65 2c 20 30 2c 20 7a 4c 6f 67 29 3b 0a 20  ame, 0, zLog);. 
65f0: 20 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20       if( !p ){. 
6600: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
6610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6620: 22 65 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20  "error creating 
6630: 76 66 73 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  vfs ", 0);.     
6640: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6650: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6660: 20 20 20 69 66 28 20 69 73 44 65 66 61 75 6c 74     if( isDefault
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6680: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
6690: 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  (p, 1);.      }.
66a0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
66b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
66c0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 62  bjv[2]);.      b
66d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
66e0: 20 63 61 73 65 20 49 56 5f 4d 41 52 4b 45 52 3a   case IV_MARKER:
66f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6700: 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69  _vfs *p;.      i
6710: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
6720: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6730: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6740: 2c 20 6f 62 6a 76 2c 20 22 56 46 53 20 4d 41 52  , objv, "VFS MAR
6750: 4b 45 52 22 29 3b 0a 20 20 20 20 20 20 20 20 72  KER");.        r
6760: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
6780: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
6790: 69 6e 64 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  ind(Tcl_GetStrin
67a0: 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20  g(objv[2]));.   
67b0: 20 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e     if( !p || p->
67c0: 78 4f 70 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20  xOpen!=instOpen 
67d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
67e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
67f0: 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73  rp, "no such vfs
6800: 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  : ", Tcl_GetStri
6810: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b  ng(objv[2]), 0);
6820: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6830: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
6840: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
6850: 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c  _instvfs_binaryl
6860: 6f 67 5f 6d 61 72 6b 65 72 28 70 2c 20 54 63 6c  og_marker(p, Tcl
6870: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
6880: 33 5d 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  3]));.      Tcl_
6890: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
68a0: 72 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rp);.      break
68b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
68c0: 65 20 49 56 5f 43 4f 4e 46 49 47 55 52 45 3a 20  e IV_CONFIGURE: 
68d0: 7b 0a 20 20 20 20 20 20 49 6e 73 74 56 66 73 43  {.      InstVfsC
68e0: 61 6c 6c 20 2a 70 43 61 6c 6c 3b 0a 0a 20 20 20  all *pCall;..   
68f0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
6900: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  p;.      if( obj
6910: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
6920: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6930: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6940: 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29  , "NAME SCRIPT")
6950: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6960: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6970: 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71    }.      p = sq
6980: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 54  lite3_vfs_find(T
6990: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
69a0: 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  v[2]));.      if
69b0: 28 20 21 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e  ( !p || p->xOpen
69c0: 21 3d 69 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20  !=instOpen ){.  
69d0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
69e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
69f0: 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 22 2c 20  no such vfs: ", 
6a00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
6a10: 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20  jv[2]), 0);.    
6a20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6a30: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  RROR;.      }.. 
6a40: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
6a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
6a60: 6a 76 5b 33 5d 29 29 20 29 7b 0a 20 20 20 20 20  jv[3])) ){.     
6a70: 20 20 20 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74     pCall = (Inst
6a80: 56 66 73 43 61 6c 6c 20 2a 29 73 71 6c 69 74 65  VfsCall *)sqlite
6a90: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
6aa0: 49 6e 73 74 56 66 73 43 61 6c 6c 29 29 3b 0a 20  InstVfsCall));. 
6ab0: 20 20 20 20 20 20 20 70 43 61 6c 6c 2d 3e 69 6e         pCall->in
6ac0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
6ad0: 20 20 20 20 20 20 20 70 43 61 6c 6c 2d 3e 70 53         pCall->pS
6ae0: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
6af0: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 33 5d  icateObj(objv[3]
6b00: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
6b10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 61 6c  ncrRefCount(pCal
6b20: 6c 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  l->pScript);.   
6b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73       sqlite3_ins
6b40: 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28 70  tvfs_configure(p
6b50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  , .            t
6b60: 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 63 61 6c  est_instvfs_xcal
6b70: 6c 2c 20 28 76 6f 69 64 20 2a 29 70 43 61 6c 6c  l, (void *)pCall
6b80: 2c 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78  , test_instvfs_x
6b90: 64 65 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  del.        );. 
6ba0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74      sqlite3_inst
6bc0: 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 2c  vfs_configure(p,
6bd0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
6be0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6bf0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
6c00: 49 56 5f 52 45 50 4f 52 54 3a 0a 20 20 20 20 63  IV_REPORT:.    c
6c10: 61 73 65 20 49 56 5f 44 45 53 54 52 4f 59 3a 0a  ase IV_DESTROY:.
6c20: 20 20 20 20 63 61 73 65 20 49 56 5f 52 45 53 45      case IV_RESE
6c30: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
6c40: 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20  e3_vfs *p;.     
6c50: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
6c60: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
6c70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6c80: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 22   2, objv, "NAME"
6c90: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
6ca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6cb0: 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73     }.      p = s
6cc0: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
6cd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
6ce0: 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 69  jv[2]));.      i
6cf0: 66 28 20 21 70 20 7c 7c 20 70 2d 3e 78 4f 70 65  f( !p || p->xOpe
6d00: 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 29 7b 0a 20  n!=instOpen ){. 
6d10: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
6d20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6d30: 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 22 2c  "no such vfs: ",
6d40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
6d50: 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20  bjv[2]), 0);.   
6d60: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6d70: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a  ERROR;.      }..
6d80: 20 20 20 20 20 20 69 66 28 20 28 28 65 6e 75 6d        if( ((enum
6d90: 20 49 56 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d   IV_enum)iSub)==
6da0: 49 56 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20  IV_DESTROY ){.  
6db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
6dc0: 73 74 76 66 73 5f 64 65 73 74 72 6f 79 28 70 29  stvfs_destroy(p)
6dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6de0: 69 66 28 20 28 28 65 6e 75 6d 20 49 56 5f 65 6e  if( ((enum IV_en
6df0: 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f 52 45 53  um)iSub)==IV_RES
6e00: 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ET ){.        sq
6e10: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 72 65  lite3_instvfs_re
6e20: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  set(p);.      }.
6e30: 20 20 20 20 20 20 69 66 28 20 28 28 65 6e 75 6d        if( ((enum
6e40: 20 49 56 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d   IV_enum)iSub)==
6e50: 49 56 5f 52 45 50 4f 52 54 20 29 7b 0a 20 20 20  IV_REPORT ){.   
6e60: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6e70: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
6e80: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
6e90: 29 3b 0a 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  );..        cons
6ea0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
6eb0: 28 63 68 61 72 20 2a 29 31 3b 0a 20 20 20 20 20  (char *)1;.     
6ec0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
6ed0: 20 6e 43 6c 69 63 6b 3b 0a 20 20 20 20 20 20 20   nClick;.       
6ee0: 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20 20 20 20   int nCall;.    
6ef0: 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 7a 4e      for(ii=1; zN
6f00: 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ame; ii++){.    
6f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
6f20: 73 74 76 66 73 5f 67 65 74 28 70 2c 20 69 69 2c  stvfs_get(p, ii,
6f30: 20 26 7a 4e 61 6d 65 2c 20 26 6e 43 6c 69 63 6b   &zName, &nClick
6f40: 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20 20 20 20 20  , &nCall);.     
6f50: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
6f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  {.            Tc
6f70: 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20 3d 20 54  l_Obj *pElem = T
6f80: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
6f90: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
6fa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6fb0: 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f  t(0, pElem, Tcl_
6fc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
6fd0: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  me, -1));.      
6fe0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
6ff0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
7000: 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77  , pElem, Tcl_New
7010: 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c 29 29 3b 0a  IntObj(nCall));.
7020: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
7030: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7040: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54  ment(0, pElem, T
7050: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
7060: 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20 20 20 20  (nClick));.     
7070: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
7080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7090: 30 2c 20 70 52 65 74 2c 20 70 45 6c 65 6d 29 3b  0, pRet, pElem);
70a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
70b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
70c0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
70d0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
70e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
70f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7100: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7110: 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74  ;.}..int Sqlitet
7120: 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54  estOsinst_Init(T
7130: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7140: 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
7150: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
7160: 70 2c 20 22 73 71 6c 69 74 65 33 5f 69 6e 73 74  p, "sqlite3_inst
7170: 76 66 73 22 2c 20 74 65 73 74 5f 73 71 6c 69 74  vfs", test_sqlit
7180: 65 33 5f 69 6e 73 74 76 66 73 2c 20 30 2c 20 30  e3_instvfs, 0, 0
7190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
71a0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a        OK;.}..#endif.