/ Hex Artifact Content
Login

Artifact b6ef38b4b363a83597f9228d8bf9f63d7dc1f801:


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 23  umentation..*/.#
0240: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20  if SQLITE_TEST  
0250: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
0260: 66 69 6c 65 20 69 73 20 75 73 65 64 20 66 6f 72  file is used for
0270: 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2a 2f   testing only */
0280: 0a 0a 2f 2a 0a 2a 2a 20 50 75 62 6c 69 63 20 69  ../*.** Public i
0290: 6e 74 65 72 66 61 63 65 3a 0a 2a 2a 0a 2a 2a 20  nterface:.**.** 
02a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66    sqlite3_instvf
02b0: 73 5f 63 72 65 61 74 65 28 29 0a 2a 2a 20 20 20  s_create().**   
02c0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
02d0: 64 65 73 74 72 6f 79 28 29 0a 2a 2a 20 20 20 73  destroy().**   s
02e0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63  qlite3_instvfs_c
02f0: 6f 6e 66 69 67 75 72 65 28 29 0a 2a 2a 0a 2a 2a  onfigure().**.**
0300: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76     sqlite3_instv
0310: 66 73 5f 72 65 73 65 74 28 29 0a 2a 2a 20 20 20  fs_reset().**   
0320: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
0330: 67 65 74 28 29 0a 2a 2a 0a 2a 2a 20 54 63 6c 20  get().**.** Tcl 
0340: 69 6e 74 65 72 66 61 63 65 3a 0a 2a 2a 20 0a 2a  interface:.** .*
0350: 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  *   sqlite3_inst
0360: 76 66 73 20 63 72 65 61 74 65 20 4e 41 4d 45 20  vfs create NAME 
0370: 3f 50 41 52 45 4e 54 3f 0a 2a 2a 0a 2a 2a 20 20  ?PARENT?.**.**  
0380: 20 20 20 20 20 43 72 65 61 74 65 20 61 6e 64 20       Create and 
0390: 72 65 67 69 73 74 65 72 20 6e 65 77 20 76 66 73  register new vfs
03a0: 20 63 61 6c 6c 65 64 20 24 4e 41 4d 45 2c 20 77   called $NAME, w
03b0: 68 69 63 68 20 69 73 20 61 20 77 72 61 70 70 65  hich is a wrappe
03c0: 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  r around.**     
03d0: 20 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 76    the existing v
03e0: 66 73 20 24 50 41 52 45 4e 54 2e 20 49 66 20 74  fs $PARENT. If t
03f0: 68 65 20 50 41 52 45 4e 54 20 61 72 67 75 6d 65  he PARENT argume
0400: 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74  nt is omitted, t
0410: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77 20  he.**       new 
0420: 76 66 73 20 69 73 20 61 20 77 72 61 70 70 65 72  vfs is a wrapper
0430: 20 61 72 6f 75 6e 64 20 74 68 65 20 63 75 72 72   around the curr
0440: 65 6e 74 20 64 65 66 61 75 6c 74 20 76 66 73 2e  ent default vfs.
0450: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  .**.**   sqlite3
0460: 5f 69 6e 73 74 76 66 73 20 64 65 73 74 72 6f 79  _instvfs destroy
0470: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20   NAME.**.**     
0480: 20 20 44 65 72 65 67 69 73 74 65 72 20 61 6e 64    Deregister and
0490: 20 64 65 73 74 72 6f 79 20 74 68 65 20 76 66 73   destroy the vfs
04a0: 20 6e 61 6d 65 64 20 24 4e 41 4d 45 2c 20 77 68   named $NAME, wh
04b0: 69 63 68 20 6d 75 73 74 20 68 61 76 65 20 62 65  ich must have be
04c0: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 63 72 65 61  en.**       crea
04d0: 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
04e0: 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  r invocation of 
04f0: 5b 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73  [sqlite3_instvfs
0500: 20 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a 2a 2a 20   create]..**.** 
0510: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66    sqlite3_instvf
0520: 73 20 63 6f 6e 66 69 67 75 72 65 20 4e 41 4d 45  s configure NAME
0530: 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 20 20   SCRIPT.**.**   
0540: 20 20 20 20 43 6f 6e 66 69 67 75 72 65 20 74 68      Configure th
0550: 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  e callback scrip
0560: 74 20 66 6f 72 20 74 68 65 20 76 66 73 20 24 4e  t for the vfs $N
0570: 41 4d 45 2c 20 77 68 69 63 68 20 6d 75 63 68 20  AME, which much 
0580: 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20 62 65  have.**       be
0590: 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 61 6e  en created by an
05a0: 20 65 61 72 6c 69 65 72 20 69 6e 76 6f 63 61 74   earlier invocat
05b0: 69 6f 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f  ion of [sqlite3_
05c0: 69 6e 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e  instvfs create].
05d0: 0a 2a 2a 20 20 20 20 20 20 20 41 66 74 65 72 20  .**       After 
05e0: 61 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  a callback scrip
05f0: 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  t has been confi
0600: 67 75 72 65 64 2c 20 69 74 20 69 73 20 69 6e 76  gured, it is inv
0610: 6f 6b 65 64 20 65 61 63 68 0a 2a 2a 20 20 20 20  oked each.**    
0620: 20 20 20 74 69 6d 65 20 61 20 76 66 73 20 6f 72     time a vfs or
0630: 20 66 69 6c 65 20 6d 65 74 68 6f 64 20 69 73 20   file method is 
0640: 63 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65  called by SQLite
0650: 2e 20 42 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e  . Before invokin
0660: 67 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 63  g.**       the c
0670: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 2c 20  allback script, 
0680: 66 69 76 65 20 61 72 67 75 6d 65 6e 74 73 20 61  five arguments a
0690: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69  re appended to i
06a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
06b0: 20 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74   * The name of t
06c0: 68 65 20 69 6e 76 6f 6b 65 64 20 6d 65 74 68 6f  he invoked metho
06d0: 64 20 2d 20 69 2e 65 2e 20 22 78 52 65 61 64 22  d - i.e. "xRead"
06e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
06f0: 2a 20 54 68 65 20 74 69 6d 65 20 63 6f 6e 73 75  * The time consu
0700: 6d 65 64 20 62 79 20 74 68 65 20 6d 65 74 68 6f  med by the metho
0710: 64 20 63 61 6c 6c 20 61 73 20 6d 65 61 73 75 72  d call as measur
0720: 65 64 20 62 79 20 68 77 74 69 6d 65 28 29 20 28  ed by hwtime() (
0730: 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
0740: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 0a 2a  integer value).*
0750: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 41  *.**         * A
0760: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 77 69   string value wi
0770: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  th a different m
0780: 65 61 6e 69 6e 67 20 66 6f 72 20 64 69 66 66 65  eaning for diffe
0790: 72 65 6e 74 20 63 61 6c 6c 73 2e 20 0a 2a 2a 20  rent calls. .** 
07a0: 20 20 20 20 20 20 20 20 20 20 46 6f 72 20 66 69            For fi
07b0: 6c 65 20 6d 65 74 68 6f 64 73 2c 20 74 68 65 20  le methods, the 
07c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
07d0: 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20   being operated 
07e0: 6f 6e 2e 20 46 6f 72 0a 2a 2a 20 20 20 20 20 20  on. For.**      
07f0: 20 20 20 20 20 6f 74 68 65 72 20 6d 65 74 68 6f       other metho
0800: 64 73 20 69 74 20 69 73 20 74 68 65 20 66 69 6c  ds it is the fil
0810: 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 2c 20  ename argument, 
0820: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  if any..**.**   
0830: 20 20 20 20 20 20 2a 20 41 20 33 32 2d 62 69 74        * A 32-bit
0840: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77   integer value w
0850: 69 74 68 20 61 20 63 61 6c 6c 2d 73 70 65 63 69  ith a call-speci
0860: 66 69 63 20 6d 65 61 6e 69 6e 67 2e 0a 2a 2a 0a  fic meaning..**.
0870: 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20 36  **         * A 6
0880: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
0890: 6c 75 65 2e 20 46 6f 72 20 78 52 65 61 64 28 29  lue. For xRead()
08a0: 20 61 6e 64 20 78 57 72 69 74 65 28 29 20 63 61   and xWrite() ca
08b0: 6c 6c 73 20 74 68 69 73 0a 2a 2a 20 20 20 20 20  lls this.**     
08c0: 20 20 20 20 20 20 69 73 20 74 68 65 20 66 69 6c        is the fil
08d0: 65 20 6f 66 66 73 65 74 20 62 65 69 6e 67 20 77  e offset being w
08e0: 72 69 74 74 65 6e 20 74 6f 20 6f 72 20 72 65 61  ritten to or rea
08f0: 64 20 66 72 6f 6d 2e 20 55 6e 75 73 65 64 20 62  d from. Unused b
0900: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  y.**           a
0910: 6c 6c 20 6f 74 68 65 72 20 63 61 6c 6c 73 2e 0a  ll other calls..
0920: 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  **.**   sqlite3_
0930: 69 6e 73 74 76 66 73 20 72 65 73 65 74 20 4e 41  instvfs reset NA
0940: 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 5a  ME.**.**       Z
0950: 65 72 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ero the internal
0960: 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 73 20   event counters 
0970: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0980: 76 66 73 20 24 4e 41 4d 45 2c 20 0a 2a 2a 20 20  vfs $NAME, .**  
0990: 20 20 20 20 20 77 68 69 63 68 20 6d 75 73 74 20       which must 
09a0: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
09b0: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
09c0: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  invocation of .*
09d0: 2a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  *       [sqlite3
09e0: 5f 69 6e 73 74 76 66 73 20 63 72 65 61 74 65 5d  _instvfs create]
09f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ..**.**   sqlite
0a00: 33 5f 69 6e 73 74 76 66 73 20 72 65 70 6f 72 74  3_instvfs report
0a10: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20   NAME.**.**     
0a20: 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
0a30: 75 65 73 20 6f 66 20 74 68 65 20 69 6e 74 65 72  ues of the inter
0a40: 6e 61 6c 20 65 76 65 6e 74 20 63 6f 75 6e 74 65  nal event counte
0a50: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  rs associated .*
0a60: 2a 20 20 20 20 20 20 20 77 69 74 68 20 76 66 73  *       with vfs
0a70: 20 24 4e 41 4d 45 2e 20 54 68 65 20 72 65 70 6f   $NAME. The repo
0a80: 72 74 20 66 6f 72 6d 61 74 20 69 73 20 61 20 6c  rt format is a l
0a90: 69 73 74 20 77 69 74 68 20 6f 6e 65 20 65 6c 65  ist with one ele
0aa0: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 66 6f  ment.**       fo
0ab0: 72 20 65 61 63 68 20 6d 65 74 68 6f 64 20 63 61  r each method ca
0ac0: 6c 6c 20 28 78 57 72 69 74 65 2c 20 78 52 65 61  ll (xWrite, xRea
0ad0: 64 20 65 74 63 2e 29 2e 20 45 61 63 68 20 65 6c  d etc.). Each el
0ae0: 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 20 20 20 20  ement is.**     
0af0: 20 20 69 74 73 65 6c 66 20 61 20 6c 69 73 74 20    itself a list 
0b00: 77 69 74 68 20 74 68 72 65 65 20 65 6c 65 6d 65  with three eleme
0b10: 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  nts:.**.**      
0b20: 20 20 20 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66     * The name of
0b30: 20 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c   the method call
0b40: 20 2d 20 69 2e 65 2e 20 22 78 57 72 69 74 65 22   - i.e. "xWrite"
0b50: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 54  ,.**         * T
0b60: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
0b70: 6f 66 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  of calls to the 
0b80: 6d 65 74 68 6f 64 20 28 61 6e 20 69 6e 74 65 67  method (an integ
0b90: 65 72 29 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  er)..**         
0ba0: 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
0bb0: 74 69 6d 65 20 63 6f 6e 73 75 6d 65 64 20 62 79  time consumed by
0bc0: 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 74 68   all calls to th
0bd0: 65 20 6d 65 74 68 6f 64 20 61 73 0a 2a 2a 20 20  e method as.**  
0be0: 20 20 20 20 20 20 20 20 20 6d 65 61 73 75 72 65           measure
0bf0: 64 20 62 79 20 68 77 74 69 6d 65 28 29 20 28 61  d by hwtime() (a
0c00: 6e 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2f 0a 0a  n integer)..*/..
0c10: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0c20: 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  3.h".#include "s
0c30: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a  qliteInt.h"../*.
0c40: 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e  ** Maximum pathn
0c50: 61 6d 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f  ame length suppo
0c60: 72 74 65 64 20 62 79 20 74 68 65 20 69 6e 73 74  rted by the inst
0c70: 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23 64 65   backend..*/.#de
0c80: 66 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f 50 41  fine INST_MAX_PA
0c90: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f 2a 20  THNAME 512.../* 
0ca0: 46 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  File methods */.
0cb0: 23 64 65 66 69 6e 65 20 4f 53 5f 43 4c 4f 53 45  #define OS_CLOSE
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
0cd0: 23 64 65 66 69 6e 65 20 4f 53 5f 52 45 41 44 20  #define OS_READ 
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 0a                2.
0cf0: 23 64 65 66 69 6e 65 20 4f 53 5f 57 52 49 54 45  #define OS_WRITE
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 0a                3.
0d10: 23 64 65 66 69 6e 65 20 4f 53 5f 54 52 55 4e 43  #define OS_TRUNC
0d20: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 34 0a  ATE           4.
0d30: 23 64 65 66 69 6e 65 20 4f 53 5f 53 59 4e 43 20  #define OS_SYNC 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 0a                5.
0d50: 23 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 53  #define OS_FILES
0d60: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 36 0a  IZE           6.
0d70: 23 64 65 66 69 6e 65 20 4f 53 5f 4c 4f 43 4b 20  #define OS_LOCK 
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 0a                7.
0d90: 23 64 65 66 69 6e 65 20 4f 53 5f 55 4e 4c 4f 43  #define OS_UNLOC
0da0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 38 0a  K             8.
0db0: 23 64 65 66 69 6e 65 20 4f 53 5f 43 48 45 43 4b  #define OS_CHECK
0dc0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 20 20 39 0a  RESERVEDLOCK  9.
0dd0: 23 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 43  #define OS_FILEC
0de0: 4f 4e 54 52 4f 4c 20 20 20 20 20 20 20 31 30 0a  ONTROL       10.
0df0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 45 43 54 4f  #define OS_SECTO
0e00: 52 53 49 5a 45 20 20 20 20 20 20 20 20 31 31 0a  RSIZE        11.
0e10: 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 56 43 48  #define OS_DEVCH
0e20: 41 52 20 20 20 20 20 20 20 20 20 20 20 31 32 0a  AR           12.
0e30: 0a 2f 2a 20 56 66 73 20 6d 65 74 68 6f 64 73 20  ./* Vfs methods 
0e40: 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 53 5f 4f 50  */.#define OS_OP
0e50: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EN              
0e60: 31 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44 45  13.#define OS_DE
0e70: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
0e80: 31 34 0a 23 64 65 66 69 6e 65 20 4f 53 5f 41 43  14.#define OS_AC
0e90: 43 45 53 53 20 20 20 20 20 20 20 20 20 20 20 20  CESS            
0ea0: 31 35 0a 23 64 65 66 69 6e 65 20 4f 53 5f 47 45  15.#define OS_GE
0eb0: 54 54 45 4d 50 4e 41 4d 45 20 20 20 20 20 20 20  TTEMPNAME       
0ec0: 31 36 0a 23 64 65 66 69 6e 65 20 4f 53 5f 46 55  16.#define OS_FU
0ed0: 4c 4c 50 41 54 48 4e 41 4d 45 20 20 20 20 20 20  LLPATHNAME      
0ee0: 31 37 0a 23 64 65 66 69 6e 65 20 4f 53 5f 52 41  17.#define OS_RA
0ef0: 4e 44 4f 4d 4e 45 53 53 20 20 20 20 20 20 20 20  NDOMNESS        
0f00: 31 38 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53 4c  18.#define OS_SL
0f10: 45 45 50 20 20 20 20 20 20 20 20 20 20 20 20 20  EEP             
0f20: 31 39 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 55  19.#define OS_CU
0f30: 52 52 45 4e 54 54 49 4d 45 20 20 20 20 20 20 20  RRENTTIME       
0f40: 32 30 0a 0a 23 64 65 66 69 6e 65 20 4f 53 5f 4e  20..#define OS_N
0f50: 55 4d 45 56 45 4e 54 53 20 20 20 20 20 20 20 20  UMEVENTS        
0f60: 20 32 31 0a 0a 73 74 72 75 63 74 20 49 6e 73 74   21..struct Inst
0f70: 56 66 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Vfs {.  sqlite3_
0f80: 76 66 73 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  vfs base;.  sqli
0f90: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
0fa0: 20 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e   .  void *pClien
0fb0: 74 3b 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  t;.  void (*xDel
0fc0: 29 28 76 6f 69 64 20 2a 29 3b 0a 20 20 76 6f 69  )(void *);.  voi
0fd0: 64 20 28 2a 78 43 61 6c 6c 29 28 76 6f 69 64 20  d (*xCall)(void 
0fe0: 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f  *, int, sqlite3_
0ff0: 69 6e 74 36 34 2c 20 63 6f 6e 73 74 20 63 68 61  int64, const cha
1000: 72 20 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65  r *, int, sqlite
1010: 33 5f 69 6e 74 36 34 29 3b 0a 0a 20 20 2f 2a 20  3_int64);..  /* 
1020: 43 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 36  Counters */.  i6
1030: 34 20 61 54 69 6d 65 5b 4f 53 5f 4e 55 4d 45 56  4 aTime[OS_NUMEV
1040: 45 4e 54 53 5d 3b 0a 20 20 69 6e 74 20 61 43 6f  ENTS];.  int aCo
1050: 75 6e 74 5b 4f 53 5f 4e 55 4d 45 56 45 4e 54 53  unt[OS_NUMEVENTS
1060: 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  ];.};.typedef st
1070: 72 75 63 74 20 49 6e 73 74 56 66 73 20 49 6e 73  ruct InstVfs Ins
1080: 74 56 66 73 3b 0a 0a 23 64 65 66 69 6e 65 20 52  tVfs;..#define R
1090: 45 41 4c 56 46 53 28 70 29 20 28 28 28 49 6e 73  EALVFS(p) (((Ins
10a0: 74 56 66 73 20 2a 29 28 70 29 29 2d 3e 70 56 66  tVfs *)(p))->pVf
10b0: 73 29 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  s)..typedef stru
10c0: 63 74 20 69 6e 73 74 5f 66 69 6c 65 20 69 6e 73  ct inst_file ins
10d0: 74 5f 66 69 6c 65 3b 0a 73 74 72 75 63 74 20 69  t_file;.struct i
10e0: 6e 73 74 5f 66 69 6c 65 20 7b 0a 20 20 73 71 6c  nst_file {.  sql
10f0: 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b 0a  ite3_file base;.
1100: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1110: 70 52 65 61 6c 3b 0a 20 20 49 6e 73 74 56 66 73  pReal;.  InstVfs
1120: 20 2a 70 49 6e 73 74 56 66 73 3b 0a 20 20 63 6f   *pInstVfs;.  co
1130: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1140: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f  .};../*.** Metho
1150: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66  d declarations f
1160: 6f 72 20 69 6e 73 74 5f 66 69 6c 65 2e 0a 2a 2f  or inst_file..*/
1170: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
1180: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
1190: 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
11a0: 20 69 6e 73 74 52 65 61 64 28 73 71 6c 69 74 65   instRead(sqlite
11b0: 33 5f 66 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c 20  3_file*, void*, 
11c0: 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65  int iAmt, sqlite
11d0: 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a  3_int64 iOfst);.
11e0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 57  static int instW
11f0: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  rite(sqlite3_fil
1200: 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  e*,const void*,i
1210: 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33  nt iAmt, sqlite3
1220: 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73  _int64 iOfst);.s
1230: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 54 72  tatic int instTr
1240: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1250: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
1260: 74 36 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69  t64 size);.stati
1270: 63 20 69 6e 74 20 69 6e 73 74 53 79 6e 63 28 73  c int instSync(s
1280: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1290: 74 20 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63  t flags);.static
12a0: 20 69 6e 74 20 69 6e 73 74 46 69 6c 65 53 69 7a   int instFileSiz
12b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  e(sqlite3_file*,
12c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
12d0: 70 53 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69  pSize);.static i
12e0: 6e 74 20 69 6e 73 74 4c 6f 63 6b 28 73 71 6c 69  nt instLock(sqli
12f0: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
1300: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
1310: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1320: 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1330: 69 63 20 69 6e 74 20 69 6e 73 74 43 68 65 63 6b  ic int instCheck
1340: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
1350: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
1360: 74 69 63 20 69 6e 74 20 69 6e 73 74 46 69 6c 65  tic int instFile
1370: 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1380: 66 69 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76  file*, int op, v
1390: 6f 69 64 20 2a 70 41 72 67 29 3b 0a 73 74 61 74  oid *pArg);.stat
13a0: 69 63 20 69 6e 74 20 69 6e 73 74 53 65 63 74 6f  ic int instSecto
13b0: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
13c0: 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
13d0: 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72 61   instDeviceChara
13e0: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
13f0: 65 33 5f 66 69 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a  e3_file*);../*.*
1400: 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 61  * Method declara
1410: 74 69 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f 76  tions for inst_v
1420: 66 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fs..*/.static in
1430: 74 20 69 6e 73 74 4f 70 65 6e 28 73 71 6c 69 74  t instOpen(sqlit
1440: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63  e3_vfs*, const c
1450: 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66  har *, sqlite3_f
1460: 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 20  ile*, int , int 
1470: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  *);.static int i
1480: 6e 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nstDelete(sqlite
1490: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
14a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73  ar *zName, int s
14b0: 79 6e 63 44 69 72 29 3b 0a 73 74 61 74 69 63 20  yncDir);.static 
14c0: 69 6e 74 20 69 6e 73 74 41 63 63 65 73 73 28 73  int instAccess(s
14d0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e  qlite3_vfs*, con
14e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
14f0: 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74 61 74  int flags);.stat
1500: 69 63 20 69 6e 74 20 69 6e 73 74 47 65 74 54 65  ic int instGetTe
1510: 6d 70 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  mpName(sqlite3_v
1520: 66 73 2a 2c 20 69 6e 74 20 6e 4f 75 74 2c 20 63  fs*, int nOut, c
1530: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
1540: 69 63 20 69 6e 74 20 69 6e 73 74 46 75 6c 6c 50  ic int instFullP
1550: 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  athname(sqlite3_
1560: 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
1570: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20 63 68   *zName, int, ch
1580: 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69  ar *zOut);.stati
1590: 63 20 76 6f 69 64 20 2a 69 6e 73 74 44 6c 4f 70  c void *instDlOp
15a0: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
15b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
15c0: 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69 63 20  lename);.static 
15d0: 76 6f 69 64 20 69 6e 73 74 44 6c 45 72 72 6f 72  void instDlError
15e0: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69  (sqlite3_vfs*, i
15f0: 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
1600: 7a 45 72 72 4d 73 67 29 3b 0a 73 74 61 74 69 63  zErrMsg);.static
1610: 20 76 6f 69 64 20 2a 69 6e 73 74 44 6c 53 79 6d   void *instDlSym
1620: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 76 6f  (sqlite3_vfs*,vo
1630: 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  id*, const char 
1640: 2a 7a 53 79 6d 62 6f 6c 29 3b 0a 73 74 61 74 69  *zSymbol);.stati
1650: 63 20 76 6f 69 64 20 69 6e 73 74 44 6c 43 6c 6f  c void instDlClo
1660: 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  se(sqlite3_vfs*,
1670: 20 76 6f 69 64 2a 29 3b 0a 73 74 61 74 69 63 20   void*);.static 
1680: 69 6e 74 20 69 6e 73 74 52 61 6e 64 6f 6d 6e 65  int instRandomne
1690: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
16a0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
16b0: 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20   *zOut);.static 
16c0: 69 6e 74 20 69 6e 73 74 53 6c 65 65 70 28 73 71  int instSleep(sq
16d0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
16e0: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 73  microseconds);.s
16f0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 43 75  tatic int instCu
1700: 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
1710: 33 5f 76 66 73 2a 2c 20 64 6f 75 62 6c 65 2a 29  3_vfs*, double*)
1720: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
1730: 33 5f 76 66 73 20 69 6e 73 74 5f 76 66 73 20 3d  3_vfs inst_vfs =
1740: 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20   {.  1,         
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1760: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 69  iVersion */.  si
1770: 7a 65 6f 66 28 69 6e 73 74 5f 66 69 6c 65 29 2c  zeof(inst_file),
1780: 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c        /* szOsFil
1790: 65 20 2a 2f 0a 20 20 49 4e 53 54 5f 4d 41 58 5f  e */.  INST_MAX_
17a0: 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 2f  PATHNAME,      /
17b0: 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
17c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
17d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
17e0: 78 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  xt */.  0,      
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c  /* zName */.  0,
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
1830: 61 20 2a 2f 0a 20 20 69 6e 73 74 4f 70 65 6e 2c  a */.  instOpen,
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1850: 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 69 6e 73  * xOpen */.  ins
1860: 74 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  tDelete,        
1870: 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
1880: 2a 2f 0a 20 20 69 6e 73 74 41 63 63 65 73 73 2c  */.  instAccess,
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a0: 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 73  xAccess */.  ins
18b0: 74 47 65 74 54 65 6d 70 4e 61 6d 65 2c 20 20 20  tGetTempName,   
18c0: 20 20 20 20 20 2f 2a 20 78 47 65 74 54 65 6d 70       /* xGetTemp
18d0: 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 73 74 46 75  Name */.  instFu
18e0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
18f0: 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
1900: 6d 65 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 4f 70  me */.  instDlOp
1910: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1920: 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
1930: 69 6e 73 74 44 6c 45 72 72 6f 72 2c 20 20 20 20  instDlError,    
1940: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
1950: 72 6f 72 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 53  ror */.  instDlS
1960: 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ym,             
1970: 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
1980: 69 6e 73 74 44 6c 43 6c 6f 73 65 2c 20 20 20 20  instDlClose,    
1990: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
19a0: 6f 73 65 20 2a 2f 0a 20 20 69 6e 73 74 52 61 6e  ose */.  instRan
19b0: 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20  domness,        
19c0: 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
19d0: 2a 2f 0a 20 20 69 6e 73 74 53 6c 65 65 70 2c 20  */.  instSleep, 
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f0: 78 53 6c 65 65 70 20 2a 2f 0a 20 20 69 6e 73 74  xSleep */.  inst
1a00: 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20  CurrentTime     
1a10: 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
1a20: 69 6d 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69  ime */.};..stati
1a30: 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  c sqlite3_io_met
1a40: 68 6f 64 73 20 69 6e 73 74 5f 69 6f 5f 6d 65 74  hods inst_io_met
1a50: 68 6f 64 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20  hods = {.  1,   
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
1a80: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 73 74 43 6c  sion */.  instCl
1a90: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1ab0: 6f 73 65 20 2a 2f 0a 20 20 69 6e 73 74 52 65 61  ose */.  instRea
1ac0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
1ae0: 64 20 2a 2f 0a 20 20 69 6e 73 74 57 72 69 74 65  d */.  instWrite
1af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b00: 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
1b10: 20 2a 2f 0a 20 20 69 6e 73 74 54 72 75 6e 63 61   */.  instTrunca
1b20: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1b30: 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
1b40: 74 65 20 2a 2f 0a 20 20 69 6e 73 74 53 79 6e 63  te */.  instSync
1b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
1b70: 20 2a 2f 0a 20 20 69 6e 73 74 46 69 6c 65 53 69   */.  instFileSi
1b80: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1b90: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
1ba0: 7a 65 20 2a 2f 0a 20 20 69 6e 73 74 4c 6f 63 6b  ze */.  instLock
1bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1bd0: 20 2a 2f 0a 20 20 69 6e 73 74 55 6e 6c 6f 63 6b   */.  instUnlock
1be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bf0: 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1c00: 20 2a 2f 0a 20 20 69 6e 73 74 43 68 65 63 6b 52   */.  instCheckR
1c10: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
1c20: 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
1c30: 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
1c40: 20 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c   instFileControl
1c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c60: 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
1c70: 20 2a 2f 0a 20 20 69 6e 73 74 53 65 63 74 6f 72   */.  instSector
1c80: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1c90: 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
1ca0: 53 69 7a 65 20 2a 2f 0a 20 20 69 6e 73 74 44 65  Size */.  instDe
1cb0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1cc0: 69 63 73 20 20 20 20 20 20 20 2f 2a 20 78 44 65  ics       /* xDe
1cd0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ce0: 69 63 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ics */.};../*.**
1cf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
1d00: 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 77 6f 72 6b  outine only work
1d10: 73 20 6f 6e 20 70 65 6e 74 69 75 6d 2d 63 6c 61  s on pentium-cla
1d20: 73 73 20 70 72 6f 63 65 73 73 6f 72 73 2e 0a 2a  ss processors..*
1d30: 2a 20 49 74 20 75 73 65 73 20 74 68 65 20 52 44  * It uses the RD
1d40: 54 53 43 20 6f 70 63 6f 64 65 20 74 6f 20 72 65  TSC opcode to re
1d50: 61 64 20 74 68 65 20 63 79 63 6c 65 20 63 6f 75  ad the cycle cou
1d60: 6e 74 20 76 61 6c 75 65 20 6f 75 74 20 6f 66 20  nt value out of 
1d70: 74 68 65 0a 2a 2a 20 70 72 6f 63 65 73 73 6f 72  the.** processor
1d80: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 61   and returns tha
1d90: 74 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 63  t value.  This c
1da0: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 68  an be used for h
1db0: 69 67 68 2d 72 65 73 0a 2a 2a 20 70 72 6f 66 69  igh-res.** profi
1dc0: 6c 69 6e 67 2e 0a 2a 2f 0a 5f 5f 69 6e 6c 69 6e  ling..*/.__inlin
1dd0: 65 5f 5f 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e__ unsigned lon
1de0: 67 20 6c 6f 6e 67 20 69 6e 74 20 68 77 74 69 6d  g long int hwtim
1df0: 65 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69 67  e(void){.  unsig
1e00: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e  ned long long in
1e10: 74 20 78 3b 0a 20 20 5f 5f 61 73 6d 5f 5f 28 22  t x;.  __asm__("
1e20: 72 64 74 73 63 5c 6e 5c 74 22 0a 20 20 20 20 20  rdtsc\n\t".     
1e30: 20 20 20 20 20 22 6d 6f 76 20 25 25 65 64 78 2c       "mov %%edx,
1e40: 20 25 25 65 63 78 5c 6e 5c 74 22 0a 20 20 20 20   %%ecx\n\t".    
1e50: 20 20 20 20 20 20 3a 22 3d 41 22 20 28 78 29 29        :"=A" (x))
1e60: 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
1e70: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 54 49 4d 45  .#define OS_TIME
1e80: 5f 49 4f 28 65 45 76 65 6e 74 2c 20 41 2c 20 42  _IO(eEvent, A, B
1e90: 2c 20 43 61 6c 6c 29 20 7b 20 20 20 20 20 5c 0a  , Call) {     \.
1ea0: 20 20 69 6e 73 74 5f 66 69 6c 65 20 2a 70 20 3d    inst_file *p =
1eb0: 20 28 69 6e 73 74 5f 66 69 6c 65 20 2a 29 70 46   (inst_file *)pF
1ec0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 5c 0a 20  ile;         \. 
1ed0: 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56   InstVfs *pInstV
1ee0: 66 73 20 3d 20 70 2d 3e 70 49 6e 73 74 56 66 73  fs = p->pInstVfs
1ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20  ;           \.  
1f00: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1f30: 36 34 20 74 20 3d 20 68 77 74 69 6d 65 28 29 3b  64 t = hwtime();
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 63            \.  rc
1f60: 20 3d 20 43 61 6c 6c 3b 20 20 20 20 20 20 20 20   = Call;        
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 20 3d           \.  t =
1f90: 20 68 77 74 69 6d 65 28 29 20 2d 20 74 3b 20 20   hwtime() - t;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 5c 0a 20 20 70 49 6e 73          \.  pIns
1fc0: 74 56 66 73 2d 3e 61 54 69 6d 65 5b 65 45 76 65  tVfs->aTime[eEve
1fd0: 6e 74 5d 20 2b 3d 20 74 3b 20 20 20 20 20 20 20  nt] += t;       
1fe0: 20 20 20 20 20 20 20 5c 0a 20 20 70 49 6e 73 74         \.  pInst
1ff0: 56 66 73 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65  Vfs->aCount[eEve
2000: 6e 74 5d 20 2b 3d 20 31 3b 20 20 20 20 20 20 20  nt] += 1;       
2010: 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 49        \.  if( pI
2020: 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 20 29 7b  nstVfs->xCall ){
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 5c 0a 20 20 20 20 70 49 6e 73 74       \.    pInst
2050: 56 66 73 2d 3e 78 43 61 6c 6c 28 70 49 6e 73 74  Vfs->xCall(pInst
2060: 56 66 73 2d 3e 70 43 6c 69 65 6e 74 2c 20 65 45  Vfs->pClient, eE
2070: 76 65 6e 74 2c 20 74 2c 20 70 2d 3e 7a 4e 61 6d  vent, t, p->zNam
2080: 65 2c 20 41 2c 20 42 29 3b 20 5c 0a 20 20 7d 20  e, A, B); \.  } 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
20c0: 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 20  urn rc;         
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
20f0: 66 69 6e 65 20 4f 53 5f 54 49 4d 45 5f 56 46 53  fine OS_TIME_VFS
2100: 28 65 45 76 65 6e 74 2c 20 5a 2c 20 41 2c 20 42  (eEvent, Z, A, B
2110: 2c 20 43 61 6c 6c 29 20 7b 20 20 20 20 20 20 5c  , Call) {      \
2120: 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73  .  InstVfs *pIns
2130: 74 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20  tVfs = (InstVfs 
2140: 2a 29 70 56 66 73 3b 20 20 20 5c 0a 20 20 69 6e  *)pVfs;   \.  in
2150: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 5c 0a 20 20 69 36 34 20 74 20 3d       \.  i64 t =
2180: 20 68 77 74 69 6d 65 28 29 3b 20 20 20 20 20 20   hwtime();      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20 20  \.  rc = Call;  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
21d0: 20 3d 20 68 77 74 69 6d 65 28 29 20 2d 20 74 3b   = hwtime() - t;
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56        \.  pInstV
2200: 66 73 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74  fs->aTime[eEvent
2210: 5d 20 2b 3d 20 74 3b 20 20 20 20 20 20 20 20 20  ] += t;         
2220: 20 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61   \.  pInstVfs->a
2230: 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d  Count[eEvent] +=
2240: 20 31 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20   1;         \.  
2250: 69 66 28 20 70 49 6e 73 74 56 66 73 2d 3e 78 43  if( pInstVfs->xC
2260: 61 6c 6c 20 29 7b 20 20 20 20 20 20 20 20 20 20  all ){          
2270: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 49 6e         \.    pIn
2280: 73 74 56 66 73 2d 3e 78 43 61 6c 6c 28 70 49 6e  stVfs->xCall(pIn
2290: 73 74 56 66 73 2d 3e 70 43 6c 69 65 6e 74 2c 20  stVfs->pClient, 
22a0: 65 45 76 65 6e 74 2c 20 74 2c 20 5a 2c 20 41 2c  eEvent, t, Z, A,
22b0: 20 42 29 3b 20 5c 0a 20 20 7d 20 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: 5c 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  \.  return rc;  
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 5c 0a 7d 0a 0a             \.}..
2310: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
2320: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
2330: 74 69 63 20 69 6e 74 20 69 6e 73 74 43 6c 6f 73  tic int instClos
2340: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
2350: 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d  pFile){.  OS_TIM
2360: 45 5f 49 4f 28 4f 53 5f 43 4c 4f 53 45 2c 20 30  E_IO(OS_CLOSE, 0
2370: 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 43 6c  , 0, sqlite3OsCl
2380: 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 29 3b 0a  ose(p->pReal));.
2390: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
23a0: 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 2d  ta from an inst-
23b0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
23c0: 69 6e 74 20 69 6e 73 74 52 65 61 64 28 0a 20 20  int instRead(.  
23d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
23e0: 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42  ile, .  void *zB
23f0: 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
2400: 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
2410: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4f 53 5f 54   iOfst.){.  OS_T
2420: 49 4d 45 5f 49 4f 28 4f 53 5f 52 45 41 44 2c 20  IME_IO(OS_READ, 
2430: 69 41 6d 74 2c 20 69 4f 66 73 74 2c 20 73 71 6c  iAmt, iOfst, sql
2440: 69 74 65 33 4f 73 52 65 61 64 28 70 2d 3e 70 52  ite3OsRead(p->pR
2450: 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c  eal, zBuf, iAmt,
2460: 20 69 4f 66 73 74 29 29 3b 0a 7d 0a 0a 2f 2a 0a   iOfst));.}../*.
2470: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f  ** Write data to
2480: 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a   an inst-file..*
2490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
24a0: 74 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  tWrite(.  sqlite
24b0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
24c0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 0a   const void *z,.
24d0: 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20 73 71    int iAmt,.  sq
24e0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
24f0: 0a 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f  .){.  OS_TIME_IO
2500: 28 4f 53 5f 57 52 49 54 45 2c 20 69 41 6d 74 2c  (OS_WRITE, iAmt,
2510: 20 69 4f 66 73 74 2c 20 73 71 6c 69 74 65 33 4f   iOfst, sqlite3O
2520: 73 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c  sWrite(p->pReal,
2530: 20 7a 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29   z, iAmt, iOfst)
2540: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  );.}../*.** Trun
2550: 63 61 74 65 20 61 6e 20 69 6e 73 74 2d 66 69 6c  cate an inst-fil
2560: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2570: 20 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73 71   instTruncate(sq
2580: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2590: 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  e, sqlite_int64 
25a0: 73 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45  size){.  OS_TIME
25b0: 5f 49 4f 28 4f 53 5f 54 52 55 4e 43 41 54 45 2c  _IO(OS_TRUNCATE,
25c0: 20 30 2c 20 73 69 7a 65 2c 20 73 71 6c 69 74 65   0, size, sqlite
25d0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 2d 3e 70  3OsTruncate(p->p
25e0: 52 65 61 6c 2c 20 73 69 7a 65 29 29 3b 0a 7d 0a  Real, size));.}.
25f0: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 69  ./*.** Sync an i
2600: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
2610: 74 69 63 20 69 6e 74 20 69 6e 73 74 53 79 6e 63  tic int instSync
2620: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2630: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  File, int flags)
2640: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
2650: 53 5f 53 59 4e 43 2c 20 66 6c 61 67 73 2c 20 30  S_SYNC, flags, 0
2660: 2c 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  , sqlite3OsSync(
2670: 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29  p->pReal, flags)
2680: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2690: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  rn the current f
26a0: 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 69  ile-size of an i
26b0: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nst-file..*/.sta
26c0: 74 69 63 20 69 6e 74 20 69 6e 73 74 46 69 6c 65  tic int instFile
26d0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
26e0: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
26f0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
2700: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f    OS_TIME_IO(OS_
2710: 46 49 4c 45 53 49 5a 45 2c 20 30 2c 20 30 2c 20  FILESIZE, 0, 0, 
2720: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
2730: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a  e(p->pReal, pSiz
2740: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  e));.}../*.** Lo
2750: 63 6b 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e  ck an inst-file.
2760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2770: 6e 73 74 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nstLock(sqlite3_
2780: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2790: 20 65 4c 6f 63 6b 29 7b 0a 20 20 4f 53 5f 54 49   eLock){.  OS_TI
27a0: 4d 45 5f 49 4f 28 4f 53 5f 4c 4f 43 4b 2c 20 65  ME_IO(OS_LOCK, e
27b0: 4c 6f 63 6b 2c 20 30 2c 20 73 71 6c 69 74 65 33  Lock, 0, sqlite3
27c0: 4f 73 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  OsLock(p->pReal,
27d0: 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a   eLock));.}../*.
27e0: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 69 6e 73  ** Unlock an ins
27f0: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2800: 63 20 69 6e 74 20 69 6e 73 74 55 6e 6c 6f 63 6b  c int instUnlock
2810: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2820: 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  File, int eLock)
2830: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
2840: 53 5f 55 4e 4c 4f 43 4b 2c 20 65 4c 6f 63 6b 2c  S_UNLOCK, eLock,
2850: 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c   0, sqlite3OsUnl
2860: 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c  ock(p->pReal, eL
2870: 6f 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ock));.}../*.** 
2880: 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
2890: 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
28a0: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
28b0: 63 6b 20 6f 6e 20 61 6e 20 69 6e 73 74 2d 66 69  ck on an inst-fi
28c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
28d0: 74 20 69 6e 73 74 43 68 65 63 6b 52 65 73 65 72  t instCheckReser
28e0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
28f0: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
2900: 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 43 48  OS_TIME_IO(OS_CH
2910: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 2c  ECKRESERVEDLOCK,
2920: 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f 73   0, 0, sqlite3Os
2930: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2940: 6b 28 70 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d 0a  k(p->pReal));.}.
2950: 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74  ./*.** File cont
2960: 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20  rol method. For 
2970: 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e  custom operation
2980: 73 20 6f 6e 20 61 6e 20 69 6e 73 74 2d 66 69 6c  s on an inst-fil
2990: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
29a0: 20 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c   instFileControl
29b0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
29c0: 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  File, int op, vo
29d0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 4f 53 5f  id *pArg){.  OS_
29e0: 54 49 4d 45 5f 49 4f 28 4f 53 5f 46 49 4c 45 43  TIME_IO(OS_FILEC
29f0: 4f 4e 54 52 4f 4c 2c 20 30 2c 20 30 2c 20 73 71  ONTROL, 0, 0, sq
2a00: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2a10: 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c  ol(p->pReal, op,
2a20: 20 70 41 72 67 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArg));.}../*.*
2a30: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
2a40: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65  tor-size in byte
2a50: 73 20 66 6f 72 20 61 6e 20 69 6e 73 74 2d 66 69  s for an inst-fi
2a60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2a70: 74 20 69 6e 73 74 53 65 63 74 6f 72 53 69 7a 65  t instSectorSize
2a80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2a90: 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45  File){.  OS_TIME
2aa0: 5f 49 4f 28 4f 53 5f 53 45 43 54 4f 52 53 49 5a  _IO(OS_SECTORSIZ
2ab0: 45 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  E, 0, 0, sqlite3
2ac0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  OsSectorSize(p->
2ad0: 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pReal));.}../*.*
2ae0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
2af0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
2b00: 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
2b10: 65 64 20 62 79 20 61 6e 20 69 6e 73 74 2d 66 69  ed by an inst-fi
2b20: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2b30: 74 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72  t instDeviceChar
2b40: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
2b50: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
2b60: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
2b70: 53 5f 44 45 56 43 48 41 52 2c 20 30 2c 20 30 2c  S_DEVCHAR, 0, 0,
2b80: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2b90: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2ba0: 70 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f  p->pReal));.}../
2bb0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 69 6e 73  *.** Open an ins
2bc0: 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  t file handle..*
2bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
2be0: 74 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  tOpen(.  sqlite3
2bf0: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f  _vfs *pVfs,.  co
2c00: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2c10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2c20: 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c  *pFile,.  int fl
2c30: 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74  ags,.  int *pOut
2c40: 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 73 74 5f  Flags.){.  inst_
2c50: 66 69 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f  file *p = (inst_
2c60: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
2c70: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
2c80: 3d 20 26 69 6e 73 74 5f 69 6f 5f 6d 65 74 68 6f  = &inst_io_metho
2c90: 64 73 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20 3d  ds;.  p->pReal =
2ca0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
2cb0: 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 49 6e  )&p[1];.  p->pIn
2cc0: 73 74 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73  stVfs = (InstVfs
2cd0: 20 2a 29 70 56 66 73 3b 0a 20 20 70 2d 3e 7a 4e   *)pVfs;.  p->zN
2ce0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20  ame = zName;..  
2cf0: 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f 4f  OS_TIME_VFS(OS_O
2d00: 50 45 4e 2c 20 7a 4e 61 6d 65 2c 20 66 6c 61 67  PEN, zName, flag
2d10: 73 2c 20 30 2c 0a 20 20 20 20 73 71 6c 69 74 65  s, 0,.    sqlite
2d20: 33 4f 73 4f 70 65 6e 28 52 45 41 4c 56 46 53 28  3OsOpen(REALVFS(
2d30: 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c 20 70 2d  pVfs), zName, p-
2d40: 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20 70  >pReal, flags, p
2d50: 4f 75 74 46 6c 61 67 73 29 0a 20 20 29 3b 0a 7d  OutFlags).  );.}
2d60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2d70: 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20  he file located 
2d80: 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
2d90: 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
2da0: 74 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 65 6e  t is true,.** en
2db0: 73 75 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  sure the file-sy
2dc0: 73 74 65 6d 20 6d 6f 64 69 66 69 63 61 74 69 6f  stem modificatio
2dd0: 6e 73 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f  ns are synced to
2de0: 20 64 69 73 6b 20 62 65 66 6f 72 65 0a 2a 2a 20   disk before.** 
2df0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
2e00: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 6c  atic int instDel
2e10: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
2e20: 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
2e30: 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69  r *zPath, int di
2e40: 72 53 79 6e 63 29 7b 0a 20 20 4f 53 5f 54 49 4d  rSync){.  OS_TIM
2e50: 45 5f 56 46 53 28 4f 53 5f 44 45 4c 45 54 45 2c  E_VFS(OS_DELETE,
2e60: 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 2c   zPath, dirSync,
2e70: 20 30 2c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0,.    sqlite3O
2e80: 73 44 65 6c 65 74 65 28 52 45 41 4c 56 46 53 28  sDelete(REALVFS(
2e90: 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 64 69  pVfs), zPath, di
2ea0: 72 53 79 6e 63 29 20 0a 20 20 29 3b 0a 7d 0a 0a  rSync) .  );.}..
2eb0: 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 61  /*.** Test for a
2ec0: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
2ed0: 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  s. Return true i
2ee0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2ef0: 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73  permission.** is
2f00: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66   available, or f
2f10: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
2f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
2f30: 73 74 41 63 63 65 73 73 28 73 71 6c 69 74 65 33  stAccess(sqlite3
2f40: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
2f50: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
2f60: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4f 53 5f  nt flags){.  OS_
2f70: 54 49 4d 45 5f 56 46 53 28 4f 53 5f 41 43 43 45  TIME_VFS(OS_ACCE
2f80: 53 53 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73  SS, zPath, flags
2f90: 2c 20 30 2c 20 0a 20 20 20 20 73 71 6c 69 74 65  , 0, .    sqlite
2fa0: 33 4f 73 41 63 63 65 73 73 28 52 45 41 4c 56 46  3OsAccess(REALVF
2fb0: 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20  S(pVfs), zPath, 
2fc0: 66 6c 61 67 73 29 20 0a 20 20 29 3b 0a 7d 0a 0a  flags) .  );.}..
2fd0: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62  /*.** Populate b
2fe0: 75 66 66 65 72 20 7a 42 75 66 4f 75 74 20 77 69  uffer zBufOut wi
2ff0: 74 68 20 61 20 70 61 74 68 6e 61 6d 65 20 73 75  th a pathname su
3000: 69 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 61  itable for use a
3010: 73 20 61 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  s a .** temporar
3020: 79 20 66 69 6c 65 2e 20 7a 42 75 66 4f 75 74 20  y file. zBufOut 
3030: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
3040: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
3050: 65 72 20 6f 66 20 0a 2a 2a 20 61 74 20 6c 65 61  er of .** at lea
3060: 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54  st (INST_MAX_PAT
3070: 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a  HNAME+1) bytes..
3080: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
3090: 73 74 47 65 74 54 65 6d 70 4e 61 6d 65 28 73 71  stGetTempName(sq
30a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
30b0: 20 69 6e 74 20 6e 4f 75 74 2c 20 63 68 61 72 20   int nOut, char 
30c0: 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f  *zBufOut){.  OS_
30d0: 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 47 45 54  TIME_VFS( OS_GET
30e0: 54 45 4d 50 4e 41 4d 45 2c 20 30 2c 20 30 2c 20  TEMPNAME, 0, 0, 
30f0: 30 2c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0,.    sqlite3Os
3100: 47 65 74 54 65 6d 70 6e 61 6d 65 28 52 45 41 4c  GetTempname(REAL
3110: 56 46 53 28 70 56 66 73 29 2c 20 6e 4f 75 74 2c  VFS(pVfs), nOut,
3120: 20 7a 42 75 66 4f 75 74 29 3b 0a 20 20 29 3b 0a   zBufOut);.  );.
3130: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
3140: 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69  e buffer zOut wi
3150: 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f  th the full cano
3160: 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63  nical pathname c
3170: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
3180: 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  to the pathname 
3190: 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69  in zPath. zOut i
31a0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
31b0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
31c0: 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74  r.** of at least
31d0: 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e   (INST_MAX_PATHN
31e0: 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f  AME+1) bytes..*/
31f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
3200: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
3210: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3220: 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
3230: 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20   *zPath, .  int 
3240: 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a  nOut, .  char *z
3250: 4f 75 74 0a 29 7b 0a 20 20 4f 53 5f 54 49 4d 45  Out.){.  OS_TIME
3260: 5f 56 46 53 28 20 4f 53 5f 46 55 4c 4c 50 41 54  _VFS( OS_FULLPAT
3270: 48 4e 41 4d 45 2c 20 7a 50 61 74 68 2c 20 30 2c  HNAME, zPath, 0,
3280: 20 30 2c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0,.    sqlite3O
3290: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 52 45  sFullPathname(RE
32a0: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61  ALVFS(pVfs), zPa
32b0: 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b  th, nOut, zOut);
32c0: 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  .  );.}../*.** O
32d0: 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20  pen the dynamic 
32e0: 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20  library located 
32f0: 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74  at zPath and ret
3300: 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f  urn a handle..*/
3310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 6e  .static void *in
3320: 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  stDlOpen(sqlite3
3330: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
3340: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
3350: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3360: 4f 73 44 6c 4f 70 65 6e 28 52 45 41 4c 56 46 53  OsDlOpen(REALVFS
3370: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 29 3b 0a  (pVfs), zPath);.
3380: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
3390: 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72  e the buffer zEr
33a0: 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65  rMsg (size nByte
33b0: 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68   bytes) with a h
33c0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a  uman readable.**
33d0: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65   utf-8 string de
33e0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73  scribing the mos
33f0: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65  t recent error e
3400: 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63  ncountered assoc
3410: 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64  iated .** with d
3420: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73  ynamic libraries
3430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3440: 20 69 6e 73 74 44 6c 45 72 72 6f 72 28 73 71 6c   instDlError(sql
3450: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
3460: 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
3470: 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c  *zErrMsg){.  sql
3480: 69 74 65 33 4f 73 44 6c 45 72 72 6f 72 28 52 45  ite3OsDlError(RE
3490: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79  ALVFS(pVfs), nBy
34a0: 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
34b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
34c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
34d0: 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
34e0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
34f0: 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
3500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 6e  .static void *in
3510: 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  stDlSym(sqlite3_
3520: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
3530: 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  *pHandle, const 
3540: 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a  char *zSymbol){.
3550: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3560: 4f 73 44 6c 53 79 6d 28 52 45 41 4c 56 46 53 28  OsDlSym(REALVFS(
3570: 70 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 2c 20  pVfs), pHandle, 
3580: 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  zSymbol);.}../*.
3590: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e  ** Close the dyn
35a0: 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e  amic library han
35b0: 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a  dle pHandle..*/.
35c0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74  static void inst
35d0: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
35e0: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
35f0: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 73 71 6c  *pHandle){.  sql
3600: 69 74 65 33 4f 73 44 6c 43 6c 6f 73 65 28 52 45  ite3OsDlClose(RE
3610: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70 48 61  ALVFS(pVfs), pHa
3620: 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndle);.}../*.** 
3630: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
3640: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
3650: 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e  y zBufOut with n
3660: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a  Byte bytes of .*
3670: 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a  * random data..*
3680: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
3690: 74 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  tRandomness(sqli
36a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
36b0: 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
36c0: 7a 42 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54  zBufOut){.  OS_T
36d0: 49 4d 45 5f 56 46 53 28 20 4f 53 5f 52 41 4e 44  IME_VFS( OS_RAND
36e0: 4f 4d 4e 45 53 53 2c 20 30 2c 20 6e 42 79 74 65  OMNESS, 0, nByte
36f0: 2c 20 30 2c 0a 20 20 20 20 73 71 6c 69 74 65 33  , 0,.    sqlite3
3700: 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 52 45 41  OsRandomness(REA
3710: 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74  LVFS(pVfs), nByt
3720: 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 20 20 29  e, zBufOut);.  )
3730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  ;.}../*.** Sleep
3740: 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69 63 72   for nMicro micr
3750: 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75 72 6e  oseconds. Return
3760: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
3770: 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a 20  icroseconds .** 
3780: 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74 2e 0a  actually slept..
3790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
37a0: 73 74 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  stSleep(sqlite3_
37b0: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
37c0: 4d 69 63 72 6f 29 7b 0a 20 20 4f 53 5f 54 49 4d  Micro){.  OS_TIM
37d0: 45 5f 56 46 53 28 20 4f 53 5f 53 4c 45 45 50 2c  E_VFS( OS_SLEEP,
37e0: 20 30 2c 20 6e 4d 69 63 72 6f 2c 20 30 2c 20 0a   0, nMicro, 0, .
37f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65      sqlite3OsSle
3800: 65 70 28 52 45 41 4c 56 46 53 28 70 56 66 73 29  ep(REALVFS(pVfs)
3810: 2c 20 6e 4d 69 63 72 6f 29 20 0a 20 20 29 3b 0a  , nMicro) .  );.
3820: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3830: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
3840: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
3850: 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d   number in *pTim
3860: 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eOut..*/.static 
3870: 69 6e 74 20 69 6e 73 74 43 75 72 72 65 6e 74 54  int instCurrentT
3880: 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
3890: 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
38a0: 54 69 6d 65 4f 75 74 29 7b 0a 20 20 4f 53 5f 54  TimeOut){.  OS_T
38b0: 49 4d 45 5f 56 46 53 28 20 4f 53 5f 43 55 52 52  IME_VFS( OS_CURR
38c0: 45 4e 54 54 49 4d 45 2c 20 30 2c 20 30 2c 20 30  ENTTIME, 0, 0, 0
38d0: 2c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ,.    sqlite3OsC
38e0: 75 72 72 65 6e 74 54 69 6d 65 28 52 45 41 4c 56  urrentTime(REALV
38f0: 46 53 28 70 56 66 73 29 2c 20 70 54 69 6d 65 4f  FS(pVfs), pTimeO
3900: 75 74 29 20 0a 20 20 29 3b 0a 7d 0a 0a 73 71 6c  ut) .  );.}..sql
3910: 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
3920: 33 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65  3_instvfs_create
3930: 28 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68  (char *zName, ch
3940: 61 72 20 2a 7a 50 61 72 65 6e 74 29 7b 0a 20 20  ar *zParent){.  
3950: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 49 6e 73  int nByte;.  Ins
3960: 74 56 66 73 20 2a 70 3b 0a 20 20 73 71 6c 69 74  tVfs *p;.  sqlit
3970: 65 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b  e3_vfs *pParent;
3980: 0a 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71  ..  pParent = sq
3990: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
39a0: 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 21  Parent);.  if( !
39b0: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 72  pParent ){.    r
39c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
39d0: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nByte = strlen(z
39e0: 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69 7a 65  Name) + 1 + size
39f0: 6f 66 28 49 6e 73 74 56 66 73 29 3b 0a 20 20 70  of(InstVfs);.  p
3a00: 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 73 71   = (InstVfs *)sq
3a10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
3a20: 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  te);.  if( p ){.
3a30: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20      char *zCopy 
3a40: 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b  = (char *)&p[1];
3a50: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
3a60: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d 65  , nByte);.    me
3a70: 6d 63 70 79 28 70 2c 20 26 69 6e 73 74 5f 76 66  mcpy(p, &inst_vf
3a80: 73 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  s, sizeof(sqlite
3a90: 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 70 2d 3e  3_vfs));.    p->
3aa0: 70 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a  pVfs = pParent;.
3ab0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79      memcpy(zCopy
3ac0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
3ad0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 2d 3e  zName));.    p->
3ae0: 62 61 73 65 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f  base.zName = (co
3af0: 6e 73 74 20 63 68 61 72 20 2a 29 7a 43 6f 70 79  nst char *)zCopy
3b00: 3b 0a 20 20 20 20 70 2d 3e 62 61 73 65 2e 73 7a  ;.    p->base.sz
3b10: 4f 73 46 69 6c 65 20 2b 3d 20 70 50 61 72 65 6e  OsFile += pParen
3b20: 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 20  t->szOsFile;.   
3b30: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
3b40: 69 73 74 65 72 28 28 73 71 6c 69 74 65 33 5f 76  ister((sqlite3_v
3b50: 66 73 20 2a 29 70 2c 20 30 29 3b 0a 20 20 7d 0a  fs *)p, 0);.  }.
3b60: 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
3b70: 65 33 5f 76 66 73 20 2a 29 70 3b 0a 7d 0a 0a 76  e3_vfs *)p;.}..v
3b80: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  oid sqlite3_inst
3b90: 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28 0a 20  vfs_configure(. 
3ba0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
3bb0: 66 73 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 61  fs,.  void (*xCa
3bc0: 6c 6c 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c  ll)(void *, int,
3bd0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20   sqlite3_int64, 
3be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
3bf0: 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t, sqlite3_int64
3c00: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  ),.  void *pClie
3c10: 6e 74 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  nt,.  void (*xDe
3c20: 6c 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  l)(void *).){.  
3c30: 49 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49 6e  InstVfs *p = (In
3c40: 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20  stVfs *)pVfs;.  
3c50: 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78 4f  assert( pVfs->xO
3c60: 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29 3b  pen==instOpen );
3c70: 0a 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29  .  if( p->xDel )
3c80: 7b 0a 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d  {.    p->xDel(p-
3c90: 3e 70 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 20  >pClient);.  }. 
3ca0: 20 70 2d 3e 78 43 61 6c 6c 20 3d 20 78 43 61 6c   p->xCall = xCal
3cb0: 6c 3b 0a 20 20 70 2d 3e 78 44 65 6c 20 3d 20 78  l;.  p->xDel = x
3cc0: 44 65 6c 3b 0a 20 20 70 2d 3e 70 43 6c 69 65 6e  Del;.  p->pClien
3cd0: 74 20 3d 20 70 43 6c 69 65 6e 74 3b 0a 7d 0a 0a  t = pClient;.}..
3ce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73  void sqlite3_ins
3cf0: 74 76 66 73 5f 64 65 73 74 72 6f 79 28 73 71 6c  tvfs_destroy(sql
3d00: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29 7b  ite3_vfs *pVfs){
3d10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
3d20: 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29 3b  nregister(pVfs);
3d30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3d40: 70 56 66 73 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73  pVfs);.}..void s
3d50: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 72  qlite3_instvfs_r
3d60: 65 73 65 74 28 73 71 6c 69 74 65 33 5f 76 66 73  eset(sqlite3_vfs
3d70: 20 2a 70 56 66 73 29 7b 0a 20 20 49 6e 73 74 56   *pVfs){.  InstV
3d80: 66 73 20 2a 70 20 3d 20 28 49 6e 73 74 56 66 73  fs *p = (InstVfs
3d90: 20 2a 29 70 56 66 73 3b 0a 20 20 61 73 73 65 72   *)pVfs;.  asser
3da0: 74 28 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d  t( pVfs->xOpen==
3db0: 69 6e 73 74 4f 70 65 6e 20 29 3b 0a 20 20 6d 65  instOpen );.  me
3dc0: 6d 73 65 74 28 70 2d 3e 61 54 69 6d 65 2c 20 30  mset(p->aTime, 0
3dd0: 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 2a 4f 53  , sizeof(i64)*OS
3de0: 5f 4e 55 4d 45 56 45 4e 54 53 29 3b 0a 20 20 6d  _NUMEVENTS);.  m
3df0: 65 6d 73 65 74 28 70 2d 3e 61 43 6f 75 6e 74 2c  emset(p->aCount,
3e00: 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a   0, sizeof(int)*
3e10: 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b 0a 7d  OS_NUMEVENTS);.}
3e20: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  ..const char *sq
3e30: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 6e 61  lite3_instvfs_na
3e40: 6d 65 28 69 6e 74 20 65 45 76 65 6e 74 29 7b 0a  me(int eEvent){.
3e50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
3e60: 76 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 77 69  vent = 0;..  swi
3e70: 74 63 68 28 20 65 45 76 65 6e 74 20 29 7b 0a 20  tch( eEvent ){. 
3e80: 20 20 20 63 61 73 65 20 4f 53 5f 43 4c 4f 53 45     case OS_CLOSE
3e90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  :             zE
3ea0: 76 65 6e 74 20 3d 20 22 78 43 6c 6f 73 65 22 3b  vent = "xClose";
3eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3ec0: 20 4f 53 5f 52 45 41 44 3a 20 20 20 20 20 20 20   OS_READ:       
3ed0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
3ee0: 22 78 52 65 61 64 22 3b 20 62 72 65 61 6b 3b 0a  "xRead"; break;.
3ef0: 20 20 20 20 63 61 73 65 20 4f 53 5f 57 52 49 54      case OS_WRIT
3f00: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
3f10: 45 76 65 6e 74 20 3d 20 22 78 57 72 69 74 65 22  Event = "xWrite"
3f20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3f30: 65 20 4f 53 5f 54 52 55 4e 43 41 54 45 3a 20 20  e OS_TRUNCATE:  
3f40: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
3f50: 20 22 78 54 72 75 6e 63 61 74 65 22 3b 20 62 72   "xTruncate"; br
3f60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
3f70: 5f 53 59 4e 43 3a 20 20 20 20 20 20 20 20 20 20  _SYNC:          
3f80: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53      zEvent = "xS
3f90: 79 6e 63 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ync"; break;.   
3fa0: 20 63 61 73 65 20 4f 53 5f 46 49 4c 45 53 49 5a   case OS_FILESIZ
3fb0: 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76 65  E:          zEve
3fc0: 6e 74 20 3d 20 22 78 46 69 6c 65 73 69 7a 65 22  nt = "xFilesize"
3fd0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3fe0: 65 20 4f 53 5f 4c 4f 43 4b 3a 20 20 20 20 20 20  e OS_LOCK:      
3ff0: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
4000: 20 22 78 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b   "xLock"; break;
4010: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 55 4e 4c  .    case OS_UNL
4020: 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20  OCK:            
4030: 7a 45 76 65 6e 74 20 3d 20 22 78 55 6e 6c 6f 63  zEvent = "xUnloc
4040: 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  k"; break;.    c
4050: 61 73 65 20 4f 53 5f 43 48 45 43 4b 52 45 53 45  ase OS_CHECKRESE
4060: 52 56 45 44 4c 4f 43 4b 3a 20 7a 45 76 65 6e 74  RVEDLOCK: zEvent
4070: 20 3d 20 22 78 43 68 65 63 6b 52 65 73 65 72 76   = "xCheckReserv
4080: 65 64 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a  edLock"; break;.
4090: 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45      case OS_FILE
40a0: 43 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20 20 7a  CONTROL:       z
40b0: 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 43 6f  Event = "xFileCo
40c0: 6e 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b 0a 20  ntrol"; break;. 
40d0: 20 20 20 63 61 73 65 20 4f 53 5f 53 45 43 54 4f     case OS_SECTO
40e0: 52 53 49 5a 45 3a 20 20 20 20 20 20 20 20 7a 45  RSIZE:        zE
40f0: 76 65 6e 74 20 3d 20 22 78 53 65 63 74 6f 72 53  vent = "xSectorS
4100: 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ize"; break;.   
4110: 20 63 61 73 65 20 4f 53 5f 44 45 56 43 48 41 52   case OS_DEVCHAR
4120: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65  :           zEve
4130: 6e 74 20 3d 20 22 78 44 65 76 69 63 65 43 68 61  nt = "xDeviceCha
4140: 72 61 63 74 65 72 69 73 74 69 63 73 22 3b 20 62  racteristics"; b
4150: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
4160: 53 5f 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  S_OPEN:         
4170: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
4180: 4f 70 65 6e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  Open"; break;.  
4190: 20 20 63 61 73 65 20 4f 53 5f 44 45 4c 45 54 45    case OS_DELETE
41a0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76  :            zEv
41b0: 65 6e 74 20 3d 20 22 78 44 65 6c 65 74 65 22 3b  ent = "xDelete";
41c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
41d0: 20 4f 53 5f 41 43 43 45 53 53 3a 20 20 20 20 20   OS_ACCESS:     
41e0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
41f0: 22 78 41 63 63 65 73 73 22 3b 20 62 72 65 61 6b  "xAccess"; break
4200: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 47 45  ;.    case OS_GE
4210: 54 54 45 4d 50 4e 41 4d 45 3a 20 20 20 20 20 20  TTEMPNAME:      
4220: 20 7a 45 76 65 6e 74 20 3d 20 22 78 47 65 74 54   zEvent = "xGetT
4230: 65 6d 70 4e 61 6d 65 22 3b 20 62 72 65 61 6b 3b  empName"; break;
4240: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 55 4c  .    case OS_FUL
4250: 4c 50 41 54 48 4e 41 4d 45 3a 20 20 20 20 20 20  LPATHNAME:      
4260: 7a 45 76 65 6e 74 20 3d 20 22 78 46 75 6c 6c 50  zEvent = "xFullP
4270: 61 74 68 6e 61 6d 65 22 3b 20 62 72 65 61 6b 3b  athname"; break;
4280: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 52 41 4e  .    case OS_RAN
4290: 44 4f 4d 4e 45 53 53 3a 20 20 20 20 20 20 20 20  DOMNESS:        
42a0: 7a 45 76 65 6e 74 20 3d 20 22 78 52 61 6e 64 6f  zEvent = "xRando
42b0: 6d 6e 65 73 73 22 3b 20 62 72 65 61 6b 3b 0a 20  mness"; break;. 
42c0: 20 20 20 63 61 73 65 20 4f 53 5f 53 4c 45 45 50     case OS_SLEEP
42d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  :             zE
42e0: 76 65 6e 74 20 3d 20 22 78 53 6c 65 65 70 22 3b  vent = "xSleep";
42f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4300: 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d 45 3a   OS_CURRENTTIME:
4310: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
4320: 22 78 43 75 72 72 65 6e 74 54 69 6d 65 22 3b 20  "xCurrentTime"; 
4330: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
4340: 74 75 72 6e 20 7a 45 76 65 6e 74 3b 0a 7d 0a 0a  turn zEvent;.}..
4350: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73  void sqlite3_ins
4360: 74 76 66 73 5f 67 65 74 28 0a 20 20 73 71 6c 69  tvfs_get(.  sqli
4370: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
4380: 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 20 0a 20    int eEvent, . 
4390: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
43a0: 45 76 65 6e 74 2c 20 0a 20 20 73 71 6c 69 74 65  Event, .  sqlite
43b0: 33 5f 69 6e 74 36 34 20 2a 70 6e 43 6c 69 63 6b  3_int64 *pnClick
43c0: 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43 61 6c 6c  , .  int *pnCall
43d0: 0a 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70  .){.  InstVfs *p
43e0: 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56   = (InstVfs *)pV
43f0: 66 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56  fs;.  assert( pV
4400: 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f  fs->xOpen==instO
4410: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 65 45 76  pen );.  if( eEv
4420: 65 6e 74 3c 31 20 7c 7c 20 65 45 76 65 6e 74 3e  ent<1 || eEvent>
4430: 3d 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 20 29 7b  =OS_NUMEVENTS ){
4440: 0a 20 20 20 20 2a 70 7a 45 76 65 6e 74 20 3d 20  .    *pzEvent = 
4450: 30 3b 0a 20 20 20 20 2a 70 6e 43 6c 69 63 6b 20  0;.    *pnClick 
4460: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 61 6c 6c  = 0;.    *pnCall
4470: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
4480: 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 45 76 65 6e  ;.  }..  *pzEven
4490: 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  t = sqlite3_inst
44a0: 76 66 73 5f 6e 61 6d 65 28 65 45 76 65 6e 74 29  vfs_name(eEvent)
44b0: 3b 0a 20 20 2a 70 6e 43 6c 69 63 6b 20 3d 20 70  ;.  *pnClick = p
44c0: 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 5d 3b  ->aTime[eEvent];
44d0: 0a 20 20 2a 70 6e 43 61 6c 6c 20 3d 20 70 2d 3e  .  *pnCall = p->
44e0: 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 3b 0a  aCount[eEvent];.
44f0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
4500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 63  **********.** Tc
4590: 6c 20 69 6e 74 65 72 66 61 63 65 20 73 74 61 72  l interface star
45a0: 74 73 20 68 65 72 65 2e 0a 2a 2f 0a 0a 23 69 6e  ts here..*/..#in
45b0: 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 73  clude <tcl.h>..s
45c0: 74 72 75 63 74 20 49 6e 73 74 56 66 73 43 61 6c  truct InstVfsCal
45d0: 6c 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  l {.  Tcl_Interp
45e0: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
45f0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 7d 3b  Obj *pScript;.};
4600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4610: 49 6e 73 74 56 66 73 43 61 6c 6c 20 49 6e 73 74  InstVfsCall Inst
4620: 56 66 73 43 61 6c 6c 3b 0a 0a 73 74 61 74 69 63  VfsCall;..static
4630: 20 76 6f 69 64 20 74 65 73 74 5f 69 6e 73 74 76   void test_instv
4640: 66 73 5f 78 63 61 6c 6c 28 0a 20 20 76 6f 69 64  fs_xcall(.  void
4650: 20 2a 70 2c 0a 20 20 69 6e 74 20 65 45 76 65 6e   *p,.  int eEven
4660: 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
4670: 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20 63 6f 6e  64 nClick,.  con
4680: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
4690: 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a 20 20 73    int nByte,.  s
46a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
46b0: 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  fset.){.  int rc
46c0: 3b 0a 20 20 49 6e 73 74 56 66 73 43 61 6c 6c 20  ;.  InstVfsCall 
46d0: 2a 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56 66  *pCall = (InstVf
46e0: 73 43 61 6c 6c 20 2a 29 70 3b 0a 20 20 54 63 6c  sCall *)p;.  Tcl
46f0: 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20 54 63 6c  _Obj *pObj = Tcl
4700: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 20 70  _DuplicateObj( p
4710: 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Call->pScript);.
4720: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
4730: 76 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  vent = sqlite3_i
4740: 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65 45 76 65  nstvfs_name(eEve
4750: 6e 74 29 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72  nt);..  Tcl_Incr
4760: 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a 29 3b 0a  RefCount(pObj);.
4770: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4780: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4f  endElement(0, pO
4790: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
47a0: 67 4f 62 6a 28 7a 45 76 65 6e 74 2c 20 2d 31 29  gObj(zEvent, -1)
47b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
47c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
47d0: 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69   pObj, Tcl_NewWi
47e0: 64 65 49 6e 74 4f 62 6a 28 6e 43 6c 69 63 6b 29  deIntObj(nClick)
47f0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4800: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4810: 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74   pObj, Tcl_NewSt
4820: 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d  ringObj(zName, -
4830: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
4840: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4850: 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  0, pObj, Tcl_New
4860: 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b 0a  IntObj(nByte));.
4870: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4880: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4f  endElement(0, pO
4890: 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  bj, Tcl_NewWideI
48a0: 6e 74 4f 62 6a 28 69 4f 66 66 73 65 74 29 29 3b  ntObj(iOffset));
48b0: 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ..  rc = Tcl_Eva
48c0: 6c 4f 62 6a 45 78 28 70 43 61 6c 6c 2d 3e 69 6e  lObjEx(pCall->in
48d0: 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54 43 4c 5f  terp, pObj, TCL_
48e0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
48f0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4900: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
4910: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
4920: 72 28 70 43 61 6c 6c 2d 3e 69 6e 74 65 72 70 29  r(pCall->interp)
4930: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72  ;.  }.  Tcl_Decr
4940: 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a 29 3b 0a  RefCount(pObj);.
4950: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
4960: 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 64 65 6c  est_instvfs_xdel
4970: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 49 6e 73  (void *p){.  Ins
4980: 74 56 66 73 43 61 6c 6c 20 2a 70 43 61 6c 6c 20  tVfsCall *pCall 
4990: 3d 20 28 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a  = (InstVfsCall *
49a0: 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  )p;.  Tcl_DecrRe
49b0: 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d 3e 70 53  fCount(pCall->pS
49c0: 63 72 69 70 74 29 3b 0a 20 20 73 71 6c 69 74 65  cript);.  sqlite
49d0: 33 5f 66 72 65 65 28 70 43 61 6c 6c 29 3b 0a 7d  3_free(pCall);.}
49e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
49f0: 74 5f 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66  t_sqlite3_instvf
4a00: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
4a10: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
4a20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
4a30: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
4a40: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
4a50: 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ].){.  static co
4a60: 6e 73 74 20 63 68 61 72 20 2a 49 56 5f 73 74 72  nst char *IV_str
4a70: 73 5b 5d 20 3d 20 0a 20 20 20 20 20 20 20 20 20  s[] = .         
4a80: 20 20 20 20 20 20 7b 20 22 63 72 65 61 74 65 22        { "create"
4a90: 2c 20 20 22 64 65 73 74 72 6f 79 22 2c 20 20 22  ,  "destroy",  "
4aa0: 72 65 73 65 74 22 2c 20 20 22 72 65 70 6f 72 74  reset",  "report
4ab0: 22 2c 20 22 63 6f 6e 66 69 67 75 72 65 22 2c 20  ", "configure", 
4ac0: 30 20 7d 3b 0a 20 20 65 6e 75 6d 20 49 56 5f 65  0 };.  enum IV_e
4ad0: 6e 75 6d 20 7b 20 49 56 5f 43 52 45 41 54 45 2c  num { IV_CREATE,
4ae0: 20 49 56 5f 44 45 53 54 52 4f 59 2c 20 49 56 5f   IV_DESTROY, IV_
4af0: 52 45 53 45 54 2c 20 49 56 5f 52 45 50 4f 52 54  RESET, IV_REPORT
4b00: 2c 20 49 56 5f 43 4f 4e 46 49 47 55 52 45 20 7d  , IV_CONFIGURE }
4b10: 3b 0a 20 20 69 6e 74 20 69 53 75 62 3b 0a 0a 20  ;.  int iSub;.. 
4b20: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
4b30: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
4b40: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
4b50: 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e  bjv, "SUB-COMMAN
4b60: 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a 20 20 69  D ...");.  }.  i
4b70: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
4b80: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
4b90: 62 6a 76 5b 31 5d 2c 20 49 56 5f 73 74 72 73 2c  bjv[1], IV_strs,
4ba0: 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20   "sub-command", 
4bb0: 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20 20  0, &iSub) ){.   
4bc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4bd0: 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  R;.  }..  switch
4be0: 28 20 28 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 29  ( (enum IV_enum)
4bf0: 69 53 75 62 20 29 7b 0a 20 20 20 20 63 61 73 65  iSub ){.    case
4c00: 20 49 56 5f 43 52 45 41 54 45 3a 20 7b 0a 20 20   IV_CREATE: {.  
4c10: 20 20 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e      char *zParen
4c20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
4c30: 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 20  ite3_vfs *p;.   
4c40: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26     if( objc!=4 &
4c50: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
4c60: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
4c70: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
4c80: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 3f 50 41   objv, "NAME ?PA
4c90: 52 45 4e 54 2d 56 46 53 3f 22 29 3b 0a 20 20 20  RENT-VFS?");.   
4ca0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
4cb0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
4cc0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34       if( objc==4
4cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 61 72   ){.        zPar
4ce0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ent = Tcl_GetStr
4cf0: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
4d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20      }.      p = 
4d10: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
4d20: 63 72 65 61 74 65 28 54 63 6c 5f 47 65 74 53 74  create(Tcl_GetSt
4d30: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 7a  ring(objv[2]), z
4d40: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  Parent);.      i
4d50: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20  f( !p ){.       
4d60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4d70: 74 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  t(interp, "error
4d80: 20 63 72 65 61 74 69 6e 67 20 76 66 73 20 22 2c   creating vfs ",
4d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
4da0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
4dc0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
4dd0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 29 3b 0a  terp, objv[2]);.
4de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4df0: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 49 56 5f   }..    case IV_
4e00: 43 4f 4e 46 49 47 55 52 45 3a 20 7b 0a 20 20 20  CONFIGURE: {.   
4e10: 20 20 20 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a     InstVfsCall *
4e20: 70 43 61 6c 6c 3b 0a 0a 20 20 20 20 20 20 73 71  pCall;..      sq
4e30: 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20  lite3_vfs *p;.  
4e40: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
4e50: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
4e60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
4e70: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
4e80: 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  ME SCRIPT");.   
4e90: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
4ea0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
4eb0: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
4ec0: 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c 5f 47 65  _vfs_find(Tcl_Ge
4ed0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
4ee0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 20  );.      if( !p 
4ef0: 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73  || p->xOpen!=ins
4f00: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  tOpen ){.       
4f10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4f20: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
4f30: 63 68 20 76 66 73 3a 20 22 2c 20 54 63 6c 5f 47  ch vfs: ", Tcl_G
4f40: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
4f50: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ), 0);.        r
4f60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4f70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4f80: 69 66 28 20 73 74 72 6c 65 6e 28 54 63 6c 5f 47  if( strlen(Tcl_G
4f90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
4fa0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  )) ){.        pC
4fb0: 61 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73 43 61  all = (InstVfsCa
4fc0: 6c 6c 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ll *)sqlite3_mal
4fd0: 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 73 74 56  loc(sizeof(InstV
4fe0: 66 73 43 61 6c 6c 29 29 3b 0a 20 20 20 20 20 20  fsCall));.      
4ff0: 20 20 70 43 61 6c 6c 2d 3e 69 6e 74 65 72 70 20    pCall->interp 
5000: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
5010: 20 20 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74    pCall->pScript
5020: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
5030: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  Obj(objv[3]);.  
5040: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
5050: 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d 3e 70 53  fCount(pCall->pS
5060: 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 20 20  cript);.        
5070: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
5080: 63 6f 6e 66 69 67 75 72 65 28 70 2c 20 0a 20 20  configure(p, .  
5090: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
50a0: 6e 73 74 76 66 73 5f 78 63 61 6c 6c 2c 20 28 76  nstvfs_xcall, (v
50b0: 6f 69 64 20 2a 29 70 43 61 6c 6c 2c 20 74 65 73  oid *)pCall, tes
50c0: 74 5f 69 6e 73 74 76 66 73 5f 78 64 65 6c 0a 20  t_instvfs_xdel. 
50d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
50e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
50f0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63  qlite3_instvfs_c
5100: 6f 6e 66 69 67 75 72 65 28 70 2c 20 30 2c 20 30  onfigure(p, 0, 0
5110: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5130: 0a 0a 20 20 20 20 63 61 73 65 20 49 56 5f 52 45  ..    case IV_RE
5140: 50 4f 52 54 3a 0a 20 20 20 20 63 61 73 65 20 49  PORT:.    case I
5150: 56 5f 44 45 53 54 52 4f 59 3a 0a 20 20 20 20 63  V_DESTROY:.    c
5160: 61 73 65 20 49 56 5f 52 45 53 45 54 3a 20 7b 0a  ase IV_RESET: {.
5170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
5180: 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 66 28 20  s *p;.      if( 
5190: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
51a0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
51b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
51c0: 62 6a 76 2c 20 22 4e 41 4d 45 22 29 3b 0a 20 20  bjv, "NAME");.  
51d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
51e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
51f0: 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
5200: 33 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c 5f 47  3_vfs_find(Tcl_G
5210: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
5220: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
5230: 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d 69 6e   || p->xOpen!=in
5240: 73 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  stOpen ){.      
5250: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5260: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73  lt(interp, "no s
5270: 75 63 68 20 76 66 73 3a 20 22 2c 20 54 63 6c 5f  uch vfs: ", Tcl_
5280: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
5290: 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ]), 0);.        
52a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
52b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
52c0: 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56 5f 65   if( ((enum IV_e
52d0: 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f 44 45  num)iSub)==IV_DE
52e0: 53 54 52 4f 59 20 29 7b 0a 20 20 20 20 20 20 20  STROY ){.       
52f0: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
5300: 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  _destroy(p);.   
5310: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5320: 28 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53  (enum IV_enum)iS
5330: 75 62 29 3d 3d 49 56 5f 52 45 53 45 54 20 29 7b  ub)==IV_RESET ){
5340: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5350: 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28 70  _instvfs_reset(p
5360: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5370: 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56 5f 65   if( ((enum IV_e
5380: 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f 52 45  num)iSub)==IV_RE
5390: 50 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 20 20  PORT ){.        
53a0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
53b0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
53c0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 0a 20  Tcl_NewObj();.. 
53d0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
53e0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  r *zName = (char
53f0: 20 2a 29 31 3b 0a 20 20 20 20 20 20 20 20 69 36   *)1;.        i6
5400: 34 20 6e 43 6c 69 63 6b 3b 0a 20 20 20 20 20 20  4 nClick;.      
5410: 20 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20 20 20    int nCall;.   
5420: 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 7a       for(ii=1; z
5430: 4e 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Name; ii++){.   
5440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
5450: 6e 73 74 76 66 73 5f 67 65 74 28 70 2c 20 69 69  nstvfs_get(p, ii
5460: 2c 20 26 7a 4e 61 6d 65 2c 20 26 6e 43 6c 69 63  , &zName, &nClic
5470: 6b 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20 20 20 20  k, &nCall);.    
5480: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
5490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  ){.            T
54a0: 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20 3d 20  cl_Obj *pElem = 
54b0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
54c0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
54d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
54e0: 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c  nt(0, pElem, Tcl
54f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
5500: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  ame, -1));.     
5510: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
5520: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5530: 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65  0, pElem, Tcl_Ne
5540: 77 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c 29 29 3b  wIntObj(nCall));
5550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
5560: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5570: 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20  ement(0, pElem, 
5580: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
5590: 6a 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20 20 20  j(nClick));.    
55a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
55b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
55c0: 28 30 2c 20 70 52 65 74 2c 20 70 45 6c 65 6d 29  (0, pRet, pElem)
55d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
55e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
55f0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
5600: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
5610: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5630: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
5640: 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65  K;.}..int Sqlite
5650: 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
5660: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5670: 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
5680: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
5690: 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 69 6e 73  rp, "sqlite3_ins
56a0: 74 76 66 73 22 2c 20 74 65 73 74 5f 73 71 6c 69  tvfs", test_sqli
56b0: 74 65 33 5f 69 6e 73 74 76 66 73 2c 20 30 2c 20  te3_instvfs, 0, 
56c0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
56d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a     _OK;.}..#endif.