/ Hex Artifact Content
Login

Artifact 6e828b42e1b50ce923f9bde890f84f78f8cc8b74:


0000: 2f 2a 0a 2a 2a 20 32 30 31 30 20 4d 61 79 20 30  /*.** 2010 May 0
0010: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  5.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 0a 2a 2a 0a 2a 2f 0a 23 69 66 20  *****.**.*/.#if 
0180: 53 51 4c 49 54 45 5f 54 45 53 54 20 20 20 20 20  SQLITE_TEST     
0190: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c       /* This fil
01a0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
01b0: 73 74 69 6e 67 20 6f 6e 6c 79 20 2a 2f 0a 0a 23  sting only */..#
01c0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
01d0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h".#include "sq
01e0: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 20  liteInt.h"..#if 
01f0: 30 20 20 2f 2a 20 46 49 58 20 54 48 49 53 20 4c  0  /* FIX THIS L
0200: 41 54 45 52 20 2a 2f 0a 0a 74 79 70 65 64 65 66  ATER */..typedef
0210: 20 73 74 72 75 63 74 20 54 65 73 74 76 66 73 20   struct Testvfs 
0220: 54 65 73 74 76 66 73 3b 0a 74 79 70 65 64 65 66  Testvfs;.typedef
0230: 20 73 74 72 75 63 74 20 54 65 73 74 76 66 73 53   struct TestvfsS
0240: 68 6d 20 54 65 73 74 76 66 73 53 68 6d 3b 0a 74  hm TestvfsShm;.t
0250: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 65  ypedef struct Te
0260: 73 74 76 66 73 42 75 66 66 65 72 20 54 65 73 74  stvfsBuffer Test
0270: 76 66 73 42 75 66 66 65 72 3b 0a 74 79 70 65 64  vfsBuffer;.typed
0280: 65 66 20 73 74 72 75 63 74 20 74 76 66 73 5f 66  ef struct tvfs_f
0290: 69 6c 65 20 74 76 66 73 5f 66 69 6c 65 3b 0a 73  ile tvfs_file;.s
02a0: 74 72 75 63 74 20 74 76 66 73 5f 66 69 6c 65 20  truct tvfs_file 
02b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
02c0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a   base;        /*
02d0: 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75   Base class.  Mu
02e0: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
02f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0300: 66 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 74 68  fs;        /* th
0310: 65 20 56 46 53 20 2a 2f 0a 20 20 54 65 73 74 76  e VFS */.  Testv
0320: 66 73 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  fsShm *pShm;    
0330: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
0340: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
0350: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0360: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20  Filename;    /* 
0370: 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 73 71  Filename */.  sq
0380: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
0390: 6c 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  l;      /* The r
03a0: 65 61 6c 2c 20 75 6e 64 65 72 6c 79 69 6e 67 20  eal, underlying 
03b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
03c0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  */.};.../*.** An
03d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
03e0: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  s structure is a
03f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
0400: 68 20 56 46 53 20 63 72 65 61 74 65 64 2e 20 54  h VFS created. T
0410: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
0420: 73 2e 70 41 70 70 44 61 74 61 20 66 69 65 6c 64  s.pAppData field
0430: 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 72 75   of the VFS stru
0440: 63 74 75 72 65 20 72 65 67 69 73 74 65 72 65 64  cture registered
0450: 20 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2a 20   with SQLite.** 
0460: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
0470: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
0480: 20 54 65 73 74 76 66 73 20 7b 0a 20 20 63 68 61   Testvfs {.  cha
0490: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
04b0: 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 56 46 53  Name of this VFS
04c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
04d0: 73 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  s *pParent;     
04e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
04f0: 20 74 6f 20 75 73 65 20 66 6f 72 20 66 69 6c 65   to use for file
0500: 20 49 4f 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   IO */.  sqlite3
0510: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
0520: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0530: 74 65 73 74 76 66 73 20 72 65 67 69 73 74 65 72  testvfs register
0540: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 2a  ed with SQLite *
0550: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0560: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 20  interp;         
0570: 20 20 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74      /* Interpret
0580: 65 72 20 74 6f 20 72 75 6e 20 73 63 72 69 70 74  er to run script
0590: 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 63   in */.  int nSc
05a0: 72 69 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  ript;           
05b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
05c0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
05d0: 6e 20 61 72 72 61 79 20 61 70 53 63 72 69 70 74  n array apScript
05e0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a   */.  Tcl_Obj **
05f0: 61 70 53 63 72 69 70 74 3b 20 20 20 20 20 20 20  apScript;       
0600: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
0610: 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20  to execute */.  
0620: 54 65 73 74 76 66 73 42 75 66 66 65 72 20 2a 70  TestvfsBuffer *p
0630: 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20 20  Buffer;         
0640: 2f 2a 20 4c 69 73 74 20 6f 66 20 73 68 61 72 65  /* List of share
0650: 64 20 62 75 66 66 65 72 73 20 2a 2f 0a 7d 3b 0a  d buffers */.};.
0660: 0a 2f 2a 0a 2a 2a 20 41 20 73 68 61 72 65 64 2d  ./*.** A shared-
0670: 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 0a 2a  memory buffer..*
0680: 2f 0a 73 74 72 75 63 74 20 54 65 73 74 76 66 73  /.struct Testvfs
0690: 42 75 66 66 65 72 20 7b 0a 20 20 63 68 61 72 20  Buffer {.  char 
06a0: 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
06b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
06c0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 6e 61  sociated file na
06d0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  me */.  int n;  
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
0700: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  of allocated buf
0710: 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
0720: 20 20 75 38 20 2a 61 3b 20 20 20 20 20 20 20 20    u8 *a;        
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 2f 2a 20 42 75 66 66 65 72 20 61 6c 6c 6f    /* Buffer allo
0750: 63 61 74 65 64 20 75 73 69 6e 67 20 63 6b 61 6c  cated using ckal
0760: 6c 6f 63 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  loc() */.  int n
0770: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
0780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0790: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
07a0: 65 73 20 74 6f 20 74 68 69 73 20 6f 62 6a 65 63  es to this objec
07b0: 74 20 2a 2f 0a 20 20 54 65 73 74 76 66 73 42 75  t */.  TestvfsBu
07c0: 66 66 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  ffer *pNext;    
07d0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
07e0: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  n linked list of
07f0: 20 61 6c 6c 20 62 75 66 66 65 72 73 20 2a 2f 0a   all buffers */.
0800: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 68 61 72  };../*.** A shar
0810: 65 64 2d 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed-memory handle
0820: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 76 66   returned by tvf
0830: 73 53 68 6d 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 73  sShmOpen()..*/.s
0840: 74 72 75 63 74 20 54 65 73 74 76 66 73 53 68 6d  truct TestvfsShm
0850: 20 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 69 64   {.  Tcl_Obj *id
0860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0870: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0880: 74 68 69 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  this handle */. 
0890: 20 54 65 73 74 76 66 73 42 75 66 66 65 72 20 2a   TestvfsBuffer *
08a0: 70 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20  pBuffer;        
08b0: 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20 62   /* Underlying b
08c0: 75 66 66 65 72 20 2a 2f 0a 7d 3b 0a 0a 0a 23 64  uffer */.};...#d
08d0: 65 66 69 6e 65 20 50 41 52 45 4e 54 56 46 53 28  efine PARENTVFS(
08e0: 78 29 20 28 28 28 54 65 73 74 76 66 73 20 2a 29  x) (((Testvfs *)
08f0: 28 28 78 29 2d 3e 70 41 70 70 44 61 74 61 29 29  ((x)->pAppData))
0900: 2d 3e 70 50 61 72 65 6e 74 29 0a 0a 0a 2f 2a 0a  ->pParent).../*.
0910: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72  ** Method declar
0920: 61 74 69 6f 6e 73 20 66 6f 72 20 74 76 66 73 5f  ations for tvfs_
0930: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
0940: 69 6e 74 20 74 76 66 73 43 6c 6f 73 65 28 73 71  int tvfsClose(sq
0950: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
0960: 61 74 69 63 20 69 6e 74 20 74 76 66 73 52 65 61  atic int tvfsRea
0970: 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  d(sqlite3_file*,
0980: 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74   void*, int iAmt
0990: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
09a0: 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69  iOfst);.static i
09b0: 6e 74 20 74 76 66 73 57 72 69 74 65 28 73 71 6c  nt tvfsWrite(sql
09c0: 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74  ite3_file*,const
09d0: 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c   void*,int iAmt,
09e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
09f0: 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  Ofst);.static in
0a00: 74 20 74 76 66 73 54 72 75 6e 63 61 74 65 28 73  t tvfsTruncate(s
0a10: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71  qlite3_file*, sq
0a20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65  lite3_int64 size
0a30: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76  );.static int tv
0a40: 66 73 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  fsSync(sqlite3_f
0a50: 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29  ile*, int flags)
0a60: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66  ;.static int tvf
0a70: 73 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  sFileSize(sqlite
0a80: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  3_file*, sqlite3
0a90: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a  _int64 *pSize);.
0aa0: 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73 4c  static int tvfsL
0ab0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
0ac0: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
0ad0: 69 6e 74 20 74 76 66 73 55 6e 6c 6f 63 6b 28 73  int tvfsUnlock(s
0ae0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
0af0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  t);.static int t
0b00: 76 66 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  vfsCheckReserved
0b10: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
0b20: 65 2a 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  e*, int *);.stat
0b30: 69 63 20 69 6e 74 20 74 76 66 73 46 69 6c 65 43  ic int tvfsFileC
0b40: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
0b50: 69 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  ile*, int op, vo
0b60: 69 64 20 2a 70 41 72 67 29 3b 0a 73 74 61 74 69  id *pArg);.stati
0b70: 63 20 69 6e 74 20 74 76 66 73 53 65 63 74 6f 72  c int tvfsSector
0b80: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
0b90: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
0ba0: 74 76 66 73 44 65 76 69 63 65 43 68 61 72 61 63  tvfsDeviceCharac
0bb0: 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
0bc0: 33 5f 66 69 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  3_file*);../*.**
0bd0: 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 61 74   Method declarat
0be0: 69 6f 6e 73 20 66 6f 72 20 74 76 66 73 5f 76 66  ions for tvfs_vf
0bf0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
0c00: 20 74 76 66 73 4f 70 65 6e 28 73 71 6c 69 74 65   tvfsOpen(sqlite
0c10: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
0c20: 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69  ar *, sqlite3_fi
0c30: 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a  le*, int , int *
0c40: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76  );.static int tv
0c50: 66 73 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  fsDelete(sqlite3
0c60: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
0c70: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73 79  r *zName, int sy
0c80: 6e 63 44 69 72 29 3b 0a 73 74 61 74 69 63 20 69  ncDir);.static i
0c90: 6e 74 20 74 76 66 73 41 63 63 65 73 73 28 73 71  nt tvfsAccess(sq
0ca0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
0cb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
0cc0: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 2a 29  nt flags, int *)
0cd0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66  ;.static int tvf
0ce0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 73 71  sFullPathname(sq
0cf0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
0d00: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
0d10: 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b  nt, char *zOut);
0d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0d30: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0d40: 49 4f 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ION.static void 
0d50: 2a 74 76 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69  *tvfsDlOpen(sqli
0d60: 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
0d70: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
0d80: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 76  ;.static void tv
0d90: 66 73 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  fsDlError(sqlite
0da0: 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
0db0: 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
0dc0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  );.static void (
0dd0: 2a 74 76 66 73 44 6c 53 79 6d 28 73 71 6c 69 74  *tvfsDlSym(sqlit
0de0: 65 33 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63  e3_vfs*,void*, c
0df0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62  onst char *zSymb
0e00: 6f 6c 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74  ol))(void);.stat
0e10: 69 63 20 76 6f 69 64 20 74 76 66 73 44 6c 43 6c  ic void tvfsDlCl
0e20: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ose(sqlite3_vfs*
0e30: 2c 20 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  , void*);.#endif
0e40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
0e50: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a  LOAD_EXTENSION *
0e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66  /.static int tvf
0e70: 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  sRandomness(sqli
0e80: 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42  te3_vfs*, int nB
0e90: 79 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29  yte, char *zOut)
0ea0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66  ;.static int tvf
0eb0: 73 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  sSleep(sqlite3_v
0ec0: 66 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  fs*, int microse
0ed0: 63 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69  conds);.static i
0ee0: 6e 74 20 74 76 66 73 43 75 72 72 65 6e 74 54 69  nt tvfsCurrentTi
0ef0: 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  me(sqlite3_vfs*,
0f00: 20 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74   double*);..stat
0f10: 69 63 20 69 6e 74 20 74 76 66 73 53 68 6d 4f 70  ic int tvfsShmOp
0f20: 65 6e 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  en(sqlite3_file*
0f30: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76  );.static int tv
0f40: 66 73 53 68 6d 53 69 7a 65 28 73 71 6c 69 74 65  fsShmSize(sqlite
0f50: 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69  3_file*, int , i
0f60: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
0f70: 74 20 74 76 66 73 53 68 6d 47 65 74 28 73 71 6c  t tvfsShmGet(sql
0f80: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
0f90: 2c 20 69 6e 74 20 2a 2c 20 76 6f 69 64 20 2a 2a  , int *, void **
0fa0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76  );.static int tv
0fb0: 66 73 53 68 6d 52 65 6c 65 61 73 65 28 73 71 6c  fsShmRelease(sql
0fc0: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
0fd0: 74 69 63 20 69 6e 74 20 74 76 66 73 53 68 6d 4c  tic int tvfsShmL
0fe0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
0ff0: 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b  *, int , int *);
1000: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73  .static int tvfs
1010: 53 68 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ShmClose(sqlite3
1020: 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 0a 73  _file*, int);..s
1030: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f  tatic sqlite3_io
1040: 5f 6d 65 74 68 6f 64 73 20 74 76 66 73 5f 69 6f  _methods tvfs_io
1050: 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 32  _methods = {.  2
1060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1080: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 74 76  iVersion */.  tv
1090: 66 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fsClose,        
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b0: 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 74 76 66   xClose */.  tvf
10c0: 73 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  sRead,          
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e0: 78 52 65 61 64 20 2a 2f 0a 20 20 74 76 66 73 57  xRead */.  tvfsW
10f0: 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1110: 72 69 74 65 20 2a 2f 0a 20 20 74 76 66 73 54 72  rite */.  tvfsTr
1120: 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1140: 75 6e 63 61 74 65 20 2a 2f 0a 20 20 74 76 66 73  uncate */.  tvfs
1150: 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
1160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1170: 53 79 6e 63 20 2a 2f 0a 20 20 74 76 66 73 46 69  Sync */.  tvfsFi
1180: 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
11a0: 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 74 76 66 73  leSize */.  tvfs
11b0: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11d0: 4c 6f 63 6b 20 2a 2f 0a 20 20 74 76 66 73 55 6e  Lock */.  tvfsUn
11e0: 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
11f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1200: 6c 6f 63 6b 20 2a 2f 0a 20 20 74 76 66 73 43 68  lock */.  tvfsCh
1210: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
1220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
1230: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1240: 2a 2f 0a 20 20 74 76 66 73 46 69 6c 65 43 6f 6e  */.  tvfsFileCon
1250: 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
1260: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1270: 74 72 6f 6c 20 2a 2f 0a 20 20 74 76 66 73 53 65  trol */.  tvfsSe
1280: 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
1290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
12a0: 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 74 76  ctorSize */.  tv
12b0: 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  fsDeviceCharacte
12c0: 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 2f 2a  ristics,      /*
12d0: 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
12e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 74 76 66  ristics */.  tvf
12f0: 73 53 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20  sShmOpen,       
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1310: 78 53 68 6d 4f 70 65 6e 20 2a 2f 0a 20 20 74 76  xShmOpen */.  tv
1320: 66 73 53 68 6d 53 69 7a 65 2c 20 20 20 20 20 20  fsShmSize,      
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1340: 20 78 53 68 6d 53 69 7a 65 20 2a 2f 0a 20 20 74   xShmSize */.  t
1350: 76 66 73 53 68 6d 47 65 74 2c 20 20 20 20 20 20  vfsShmGet,      
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1370: 2a 20 78 53 68 6d 47 65 74 20 2a 2f 0a 20 20 74  * xShmGet */.  t
1380: 76 66 73 53 68 6d 52 65 6c 65 61 73 65 2c 20 20  vfsShmRelease,  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a0: 2a 20 78 53 68 6d 52 65 6c 65 61 73 65 20 2a 2f  * xShmRelease */
13b0: 0a 20 20 74 76 66 73 53 68 6d 4c 6f 63 6b 2c 20  .  tvfsShmLock, 
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
13e0: 2f 0a 20 20 74 76 66 73 53 68 6d 43 6c 6f 73 65  /.  tvfsShmClose
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65      /* xShmClose
1410: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c   */.};../*.** Cl
1420: 6f 73 65 20 61 6e 20 74 76 66 73 2d 66 69 6c 65  ose an tvfs-file
1430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1440: 74 76 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65  tvfsClose(sqlite
1450: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1460: 20 20 74 76 66 73 5f 66 69 6c 65 20 2a 70 20 3d    tvfs_file *p =
1470: 20 28 74 76 66 73 5f 66 69 6c 65 20 2a 29 70 46   (tvfs_file *)pF
1480: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ile;.  return sq
1490: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 2d 3e  lite3OsClose(p->
14a0: 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
14b0: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
14c0: 61 6e 20 74 76 66 73 2d 66 69 6c 65 2e 0a 2a 2f  an tvfs-file..*/
14d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73  .static int tvfs
14e0: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
14f0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  file *pFile, .  
1500: 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69  void *zBuf, .  i
1510: 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69  nt iAmt, .  sqli
1520: 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29  te_int64 iOfst.)
1530: 7b 0a 20 20 74 76 66 73 5f 66 69 6c 65 20 2a 70  {.  tvfs_file *p
1540: 20 3d 20 28 74 76 66 73 5f 66 69 6c 65 20 2a 29   = (tvfs_file *)
1550: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1560: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2d  sqlite3OsRead(p-
1570: 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41  >pReal, zBuf, iA
1580: 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 7d 0a 0a 2f  mt, iOfst);.}../
1590: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
15a0: 74 6f 20 61 6e 20 74 76 66 73 2d 66 69 6c 65 2e  to an tvfs-file.
15b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15c0: 76 66 73 57 72 69 74 65 28 0a 20 20 73 71 6c 69  vfsWrite(.  sqli
15d0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
15e0: 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
15f0: 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d  zBuf, .  int iAm
1600: 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  t, .  sqlite_int
1610: 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 74 76  64 iOfst.){.  tv
1620: 66 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 74 76  fs_file *p = (tv
1630: 66 73 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  fs_file *)pFile;
1640: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1650: 33 4f 73 57 72 69 74 65 28 70 2d 3e 70 52 65 61  3OsWrite(p->pRea
1660: 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69  l, zBuf, iAmt, i
1670: 4f 66 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ofst);.}../*.** 
1680: 54 72 75 6e 63 61 74 65 20 61 6e 20 74 76 66 73  Truncate an tvfs
1690: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
16a0: 20 69 6e 74 20 74 76 66 73 54 72 75 6e 63 61 74   int tvfsTruncat
16b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
16c0: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
16d0: 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 74 76 66  t64 size){.  tvf
16e0: 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 74 76 66  s_file *p = (tvf
16f0: 73 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  s_file *)pFile;.
1700: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1710: 4f 73 54 72 75 6e 63 61 74 65 28 70 2d 3e 70 52  OsTruncate(p->pR
1720: 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f  eal, size);.}../
1730: 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 74 76 66  *.** Sync an tvf
1740: 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
1750: 63 20 69 6e 74 20 74 76 66 73 53 79 6e 63 28 73  c int tvfsSync(s
1760: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1770: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
1780: 20 20 74 76 66 73 5f 66 69 6c 65 20 2a 70 20 3d    tvfs_file *p =
1790: 20 28 74 76 66 73 5f 66 69 6c 65 20 2a 29 70 46   (tvfs_file *)pF
17a0: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ile;.  return sq
17b0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 2d 3e 70  lite3OsSync(p->p
17c0: 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Real, flags);.}.
17d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17e0: 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d 73  e current file-s
17f0: 69 7a 65 20 6f 66 20 61 6e 20 74 76 66 73 2d 66  ize of an tvfs-f
1800: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1810: 6e 74 20 74 76 66 73 46 69 6c 65 53 69 7a 65 28  nt tvfsFileSize(
1820: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1830: 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
1840: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 74 76 66  4 *pSize){.  tvf
1850: 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 74 76 66  s_file *p = (tvf
1860: 73 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  s_file *)pFile;.
1870: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1880: 4f 73 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52  OsFileSize(p->pR
1890: 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 7d 0a 0a  eal, pSize);.}..
18a0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 74 76  /*.** Lock an tv
18b0: 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
18c0: 69 63 20 69 6e 74 20 74 76 66 73 4c 6f 63 6b 28  ic int tvfsLock(
18d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
18e0: 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
18f0: 0a 20 20 74 76 66 73 5f 66 69 6c 65 20 2a 70 20  .  tvfs_file *p 
1900: 3d 20 28 74 76 66 73 5f 66 69 6c 65 20 2a 29 70  = (tvfs_file *)p
1910: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73  File;.  return s
1920: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 2d 3e  qlite3OsLock(p->
1930: 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d  pReal, eLock);.}
1940: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  ../*.** Unlock a
1950: 6e 20 74 76 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  n tvfs-file..*/.
1960: 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73 55  static int tvfsU
1970: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1980: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
1990: 4c 6f 63 6b 29 7b 0a 20 20 74 76 66 73 5f 66 69  Lock){.  tvfs_fi
19a0: 6c 65 20 2a 70 20 3d 20 28 74 76 66 73 5f 66 69  le *p = (tvfs_fi
19b0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
19c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
19d0: 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  lock(p->pReal, e
19e0: 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
19f0: 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
1a00: 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
1a10: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
1a20: 63 6b 20 6f 6e 20 61 6e 20 74 76 66 73 2d 66 69  ck on an tvfs-fi
1a30: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1a40: 74 20 74 76 66 73 43 68 65 63 6b 52 65 73 65 72  t tvfsCheckReser
1a50: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1a60: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1a70: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 74 76   *pResOut){.  tv
1a80: 66 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 74 76  fs_file *p = (tv
1a90: 66 73 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  fs_file *)pFile;
1aa0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ab0: 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
1ac0: 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70  Lock(p->pReal, p
1ad0: 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ResOut);.}../*.*
1ae0: 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d  * File control m
1af0: 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f  ethod. For custo
1b00: 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  m operations on 
1b10: 61 6e 20 74 76 66 73 2d 66 69 6c 65 2e 0a 2a 2f  an tvfs-file..*/
1b20: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73  .static int tvfs
1b30: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1b40: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1b50: 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1b60: 41 72 67 29 7b 0a 20 20 74 76 66 73 5f 66 69 6c  Arg){.  tvfs_fil
1b70: 65 20 2a 70 20 3d 20 28 74 76 66 73 5f 66 69 6c  e *p = (tvfs_fil
1b80: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
1b90: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  urn sqlite3OsFil
1ba0: 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  eControl(p->pRea
1bb0: 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 7d 0a  l, op, pArg);.}.
1bc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1bd0: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
1be0: 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 74 76   bytes for an tv
1bf0: 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
1c00: 69 63 20 69 6e 74 20 74 76 66 73 53 65 63 74 6f  ic int tvfsSecto
1c10: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1c20: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 74 76  le *pFile){.  tv
1c30: 66 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 74 76  fs_file *p = (tv
1c40: 66 73 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  fs_file *)pFile;
1c50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c60: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 2d  3OsSectorSize(p-
1c70: 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pReal);.}../*.*
1c80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
1c90: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1ca0: 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
1cb0: 65 64 20 62 79 20 61 6e 20 74 76 66 73 2d 66 69  ed by an tvfs-fi
1cc0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1cd0: 74 20 74 76 66 73 44 65 76 69 63 65 43 68 61 72  t tvfsDeviceChar
1ce0: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
1cf0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
1d00: 7b 0a 20 20 74 76 66 73 5f 66 69 6c 65 20 2a 70  {.  tvfs_file *p
1d10: 20 3d 20 28 74 76 66 73 5f 66 69 6c 65 20 2a 29   = (tvfs_file *)
1d20: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1d30: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1d40: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1d50: 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
1d60: 2a 2a 20 4f 70 65 6e 20 61 6e 20 74 76 66 73 20  ** Open an tvfs 
1d70: 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
1d80: 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73 4f  static int tvfsO
1d90: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
1da0: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
1db0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
1dc0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1dd0: 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  File,.  int flag
1de0: 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
1df0: 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ags.){.  int rc;
1e00: 0a 20 20 74 76 66 73 5f 66 69 6c 65 20 2a 70 20  .  tvfs_file *p 
1e10: 3d 20 28 74 76 66 73 5f 66 69 6c 65 20 2a 29 70  = (tvfs_file *)p
1e20: 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 53 68 6d 20  File;.  p->pShm 
1e30: 3d 20 30 3b 0a 20 20 70 2d 3e 7a 46 69 6c 65 6e  = 0;.  p->zFilen
1e40: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
1e50: 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
1e60: 20 70 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c   p->pReal = (sql
1e70: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31  ite3_file *)&p[1
1e80: 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
1e90: 33 4f 73 4f 70 65 6e 28 50 41 52 45 4e 54 56 46  3OsOpen(PARENTVF
1ea0: 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c 20  S(pVfs), zName, 
1eb0: 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c  p->pReal, flags,
1ec0: 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 69   pOutFlags);.  i
1ed0: 66 28 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  f( p->pReal->pMe
1ee0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 70 46 69  thods ){.    pFi
1ef0: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26  le->pMethods = &
1f00: 74 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b  tvfs_io_methods;
1f10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1f30: 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74  e the file locat
1f40: 65 64 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  ed at zPath. If 
1f50: 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
1f60: 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a 2a  ment is true,.**
1f70: 20 65 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   ensure the file
1f80: 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66 69 63 61  -system modifica
1f90: 74 69 6f 6e 73 20 61 72 65 20 73 79 6e 63 65 64  tions are synced
1fa0: 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 0a   to disk before.
1fb0: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  ** returning..*/
1fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 66 73  .static int tvfs
1fd0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
1fe0: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
1ff0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2000: 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 72 65 74   dirSync){.  ret
2010: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  urn sqlite3OsDel
2020: 65 74 65 28 50 41 52 45 4e 54 56 46 53 28 70 56  ete(PARENTVFS(pV
2030: 66 73 29 2c 20 7a 50 61 74 68 2c 20 64 69 72 53  fs), zPath, dirS
2040: 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ync);.}../*.** T
2050: 65 73 74 20 66 6f 72 20 61 63 63 65 73 73 20 70  est for access p
2060: 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75  ermissions. Retu
2070: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
2080: 65 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 73  equested permiss
2090: 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ion.** is availa
20a0: 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ble, or false ot
20b0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
20c0: 69 63 20 69 6e 74 20 74 76 66 73 41 63 63 65 73  ic int tvfsAcces
20d0: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
20e0: 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
20f0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
2100: 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
2110: 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
2120: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
2130: 73 41 63 63 65 73 73 28 50 41 52 45 4e 54 56 46  sAccess(PARENTVF
2140: 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20  S(pVfs), zPath, 
2150: 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b  flags, pResOut);
2160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
2170: 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77  te buffer zOut w
2180: 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e  ith the full can
2190: 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20  onical pathname 
21a0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
21b0: 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65   to the pathname
21c0: 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20   in zPath. zOut 
21d0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
21e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
21f0: 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73  er.** of at leas
2200: 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41  t (DEVSYM_MAX_PA
2210: 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e  THNAME+1) bytes.
2220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2230: 76 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  vfsFullPathname(
2240: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2250: 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
2260: 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
2270: 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72  nt nOut, .  char
2280: 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 72 65 74 75   *zOut.){.  retu
2290: 72 6e 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c  rn sqlite3OsFull
22a0: 50 61 74 68 6e 61 6d 65 28 50 41 52 45 4e 54 56  Pathname(PARENTV
22b0: 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c  FS(pVfs), zPath,
22c0: 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a   nOut, zOut);.}.
22d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22e0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
22f0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ION./*.** Open t
2300: 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  he dynamic libra
2310: 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  ry located at zP
2320: 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ath and return a
2330: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
2340: 69 63 20 76 6f 69 64 20 2a 74 76 66 73 44 6c 4f  ic void *tvfsDlO
2350: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
2360: 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
2370: 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74  r *zPath){.  ret
2380: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 6c 4f  urn sqlite3OsDlO
2390: 70 65 6e 28 50 41 52 45 4e 54 56 46 53 28 70 56  pen(PARENTVFS(pV
23a0: 66 73 29 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a  fs), zPath);.}..
23b0: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
23c0: 68 65 20 62 75 66 66 65 72 20 7a 45 72 72 4d 73  he buffer zErrMs
23d0: 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20 62 79  g (size nByte by
23e0: 74 65 73 29 20 77 69 74 68 20 61 20 68 75 6d 61  tes) with a huma
23f0: 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74  n readable.** ut
2400: 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73 63 72  f-8 string descr
2410: 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 72  ibing the most r
2420: 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f  ecent error enco
2430: 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69 61 74  untered associat
2440: 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61  ed .** with dyna
2450: 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a  mic libraries..*
2460: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 76  /.static void tv
2470: 66 73 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  fsDlError(sqlite
2480: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2490: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
24a0: 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65  rrMsg){.  sqlite
24b0: 33 4f 73 44 6c 45 72 72 6f 72 28 50 41 52 45 4e  3OsDlError(PAREN
24c0: 54 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74  TVFS(pVfs), nByt
24d0: 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a  e, zErrMsg);.}..
24e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
24f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 79  ointer to the sy
2500: 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20  mbol zSymbol in 
2510: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
2520: 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a  ary pHandle..*/.
2530: 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 74 76  static void (*tv
2540: 66 73 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  fsDlSym(sqlite3_
2550: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
2560: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
2570: 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
2580: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
2590: 44 6c 53 79 6d 28 50 41 52 45 4e 54 56 46 53 28  DlSym(PARENTVFS(
25a0: 70 56 66 73 29 2c 20 70 2c 20 7a 53 79 6d 29 3b  pVfs), p, zSym);
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
25c0: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
25d0: 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64  ary handle pHand
25e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
25f0: 69 64 20 74 76 66 73 44 6c 43 6c 6f 73 65 28 73  id tvfsDlClose(s
2600: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2610: 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
2620: 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 6c 43  {.  sqlite3OsDlC
2630: 6c 6f 73 65 28 50 41 52 45 4e 54 56 46 53 28 70  lose(PARENTVFS(p
2640: 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 29 3b 0a  Vfs), pHandle);.
2650: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2660: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2670: 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ENSION */../*.**
2680: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75   Populate the bu
2690: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
26a0: 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20  by zBufOut with 
26b0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a  nByte bytes of .
26c0: 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a  ** random data..
26d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76  */.static int tv
26e0: 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  fsRandomness(sql
26f0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2700: 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
2710: 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 72 65 74  *zBufOut){.  ret
2720: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 52 61 6e  urn sqlite3OsRan
2730: 64 6f 6d 6e 65 73 73 28 50 41 52 45 4e 54 56 46  domness(PARENTVF
2740: 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20  S(pVfs), nByte, 
2750: 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  zBufOut);.}../*.
2760: 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69  ** Sleep for nMi
2770: 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  cro microseconds
2780: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
2790: 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
27a0: 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79  nds .** actually
27b0: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
27c0: 63 20 69 6e 74 20 74 76 66 73 53 6c 65 65 70 28  c int tvfsSleep(
27d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27e0: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
27f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2800: 4f 73 53 6c 65 65 70 28 50 41 52 45 4e 54 56 46  OsSleep(PARENTVF
2810: 53 28 70 56 66 73 29 2c 20 6e 4d 69 63 72 6f 29  S(pVfs), nMicro)
2820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2830: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
2840: 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  me as a Julian D
2850: 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54  ay number in *pT
2860: 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  imeOut..*/.stati
2870: 63 20 69 6e 74 20 74 76 66 73 43 75 72 72 65 6e  c int tvfsCurren
2880: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
2890: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
28a0: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65  *pTimeOut){.  re
28b0: 74 75 72 6e 20 50 41 52 45 4e 54 56 46 53 28 70  turn PARENTVFS(p
28c0: 56 66 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69  Vfs)->xCurrentTi
28d0: 6d 65 28 50 41 52 45 4e 54 56 46 53 28 70 56 66  me(PARENTVFS(pVf
28e0: 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d  s), pTimeOut);.}
28f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 76  ..static void tv
2900: 66 73 47 72 6f 77 42 75 66 66 65 72 28 54 65 73  fsGrowBuffer(Tes
2910: 74 76 66 73 53 68 6d 20 2a 70 53 68 6d 2c 20 69  tvfsShm *pShm, i
2920: 6e 74 20 72 65 71 53 69 7a 65 2c 20 69 6e 74 20  nt reqSize, int 
2930: 2a 70 4e 65 77 53 69 7a 65 29 7b 0a 20 20 54 65  *pNewSize){.  Te
2940: 73 74 76 66 73 42 75 66 66 65 72 20 2a 70 42 75  stvfsBuffer *pBu
2950: 66 66 65 72 20 3d 20 70 53 68 6d 2d 3e 70 42 75  ffer = pShm->pBu
2960: 66 66 65 72 3b 0a 20 20 69 66 28 20 72 65 71 53  ffer;.  if( reqS
2970: 69 7a 65 3e 70 42 75 66 66 65 72 2d 3e 6e 20 29  ize>pBuffer->n )
2980: 7b 0a 20 20 20 20 70 42 75 66 66 65 72 2d 3e 61  {.    pBuffer->a
2990: 20 3d 20 28 75 38 20 2a 29 63 6b 72 65 61 6c 6c   = (u8 *)ckreall
29a0: 6f 63 28 28 63 68 61 72 20 2a 29 70 42 75 66 66  oc((char *)pBuff
29b0: 65 72 2d 3e 61 2c 20 72 65 71 53 69 7a 65 29 3b  er->a, reqSize);
29c0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 75  .    memset(&pBu
29d0: 66 66 65 72 2d 3e 61 5b 70 42 75 66 66 65 72 2d  ffer->a[pBuffer-
29e0: 3e 6e 5d 2c 20 30 78 35 35 2c 20 72 65 71 53 69  >n], 0x55, reqSi
29f0: 7a 65 2d 70 42 75 66 66 65 72 2d 3e 6e 29 3b 0a  ze-pBuffer->n);.
2a00: 20 20 20 20 70 42 75 66 66 65 72 2d 3e 6e 20 3d      pBuffer->n =
2a10: 20 72 65 71 53 69 7a 65 3b 0a 20 20 7d 0a 20 20   reqSize;.  }.  
2a20: 2a 70 4e 65 77 53 69 7a 65 20 3d 20 70 42 75 66  *pNewSize = pBuf
2a30: 66 65 72 2d 3e 6e 3b 0a 7d 0a 0a 73 74 61 74 69  fer->n;.}..stati
2a40: 63 20 76 6f 69 64 20 74 76 66 73 45 78 65 63 54  c void tvfsExecT
2a50: 63 6c 28 0a 20 20 54 65 73 74 76 66 73 20 2a 70  cl(.  Testvfs *p
2a60: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2a70: 2a 7a 4d 65 74 68 6f 64 2c 0a 20 20 54 63 6c 5f  *zMethod,.  Tcl_
2a80: 4f 62 6a 20 2a 61 72 67 31 2c 0a 20 20 54 63 6c  Obj *arg1,.  Tcl
2a90: 5f 4f 62 6a 20 2a 61 72 67 32 2c 0a 20 20 54 63  _Obj *arg2,.  Tc
2aa0: 6c 5f 4f 62 6a 20 2a 61 72 67 33 0a 29 7b 0a 20  l_Obj *arg3.){. 
2ab0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2ae0: 66 72 6f 6d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  from Tcl_EvalObj
2af0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  () */.  int nArg
2b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b10: 20 20 20 20 20 20 20 20 2f 2a 20 45 6c 65 6d 65          /* Eleme
2b20: 6e 74 73 20 69 6e 20 65 76 61 6c 27 64 20 6c 69  nts in eval'd li
2b30: 73 74 20 2a 2f 0a 0a 20 20 70 2d 3e 61 70 53 63  st */..  p->apSc
2b40: 72 69 70 74 5b 70 2d 3e 6e 53 63 72 69 70 74 5d  ript[p->nScript]
2b50: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
2b60: 4f 62 6a 28 7a 4d 65 74 68 6f 64 2c 20 2d 31 29  Obj(zMethod, -1)
2b70: 3b 0a 20 20 70 2d 3e 61 70 53 63 72 69 70 74 5b  ;.  p->apScript[
2b80: 70 2d 3e 6e 53 63 72 69 70 74 2b 31 5d 20 3d 20  p->nScript+1] = 
2b90: 61 72 67 31 3b 0a 20 20 70 2d 3e 61 70 53 63 72  arg1;.  p->apScr
2ba0: 69 70 74 5b 70 2d 3e 6e 53 63 72 69 70 74 2b 32  ipt[p->nScript+2
2bb0: 5d 20 3d 20 61 72 67 32 3b 0a 20 20 70 2d 3e 61  ] = arg2;.  p->a
2bc0: 70 53 63 72 69 70 74 5b 70 2d 3e 6e 53 63 72 69  pScript[p->nScri
2bd0: 70 74 2b 33 5d 20 3d 20 61 72 67 33 3b 0a 0a 20  pt+3] = arg3;.. 
2be0: 20 66 6f 72 28 6e 41 72 67 3d 70 2d 3e 6e 53 63   for(nArg=p->nSc
2bf0: 72 69 70 74 3b 20 70 2d 3e 61 70 53 63 72 69 70  ript; p->apScrip
2c00: 74 5b 6e 41 72 67 5d 3b 20 6e 41 72 67 2b 2b 29  t[nArg]; nArg++)
2c10: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  {.    Tcl_IncrRe
2c20: 66 43 6f 75 6e 74 28 70 2d 3e 61 70 53 63 72 69  fCount(p->apScri
2c30: 70 74 5b 6e 41 72 67 5d 29 3b 0a 20 20 7d 0a 0a  pt[nArg]);.  }..
2c40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
2c50: 62 6a 76 28 70 2d 3e 69 6e 74 65 72 70 2c 20 6e  bjv(p->interp, n
2c60: 41 72 67 2c 20 70 2d 3e 61 70 53 63 72 69 70 74  Arg, p->apScript
2c70: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
2c80: 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  L);.  if( rc!=TC
2c90: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  L_OK ){.    Tcl_
2ca0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
2cb0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  p->interp);.    
2cc0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2cd0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
2ce0: 0a 20 20 66 6f 72 28 6e 41 72 67 3d 70 2d 3e 6e  .  for(nArg=p->n
2cf0: 53 63 72 69 70 74 3b 20 70 2d 3e 61 70 53 63 72  Script; p->apScr
2d00: 69 70 74 5b 6e 41 72 67 5d 3b 20 6e 41 72 67 2b  ipt[nArg]; nArg+
2d10: 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  +){.    Tcl_Decr
2d20: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 53 63  RefCount(p->apSc
2d30: 72 69 70 74 5b 6e 41 72 67 5d 29 3b 0a 20 20 20  ript[nArg]);.   
2d40: 20 70 2d 3e 61 70 53 63 72 69 70 74 5b 6e 41 72   p->apScript[nAr
2d50: 67 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73  g] = 0;.  }.}..s
2d60: 74 61 74 69 63 20 69 6e 74 20 74 76 66 73 52 65  tatic int tvfsRe
2d70: 73 75 6c 74 43 6f 64 65 28 54 65 73 74 76 66 73  sultCode(Testvfs
2d80: 20 2a 70 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a   *p, int *pRc){.
2d90: 20 20 73 74 72 75 63 74 20 65 72 72 63 6f 64 65    struct errcode
2da0: 20 7b 0a 20 20 20 20 69 6e 74 20 65 43 6f 64 65   {.    int eCode
2db0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2dc0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 7d 20 61 43 6f   *zCode;.  } aCo
2dd0: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 53  de[] = {.    { S
2de0: 51 4c 49 54 45 5f 4f 4b 2c 20 20 20 20 20 22 53  QLITE_OK,     "S
2df0: 51 4c 49 54 45 5f 4f 4b 22 20 20 20 20 20 7d 2c  QLITE_OK"     },
2e00: 0a 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 45 52  .    { SQLITE_ER
2e10: 52 4f 52 2c 20 20 22 53 51 4c 49 54 45 5f 45 52  ROR,  "SQLITE_ER
2e20: 52 4f 52 22 20 20 7d 2c 0a 20 20 20 20 7b 20 53  ROR"  },.    { S
2e30: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 20 22 53  QLITE_IOERR,  "S
2e40: 51 4c 49 54 45 5f 49 4f 45 52 52 22 20 20 7d 2c  QLITE_IOERR"  },
2e50: 0a 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 4c 4f  .    { SQLITE_LO
2e60: 43 4b 45 44 2c 20 22 53 51 4c 49 54 45 5f 4c 4f  CKED, "SQLITE_LO
2e70: 43 4b 45 44 22 20 7d 2c 0a 20 20 20 20 7b 20 53  CKED" },.    { S
2e80: 51 4c 49 54 45 5f 42 55 53 59 2c 20 20 20 22 53  QLITE_BUSY,   "S
2e90: 51 4c 49 54 45 5f 42 55 53 59 22 20 20 20 7d 2c  QLITE_BUSY"   },
2ea0: 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  .  };..  const c
2eb0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  har *z;.  int i;
2ec0: 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ..  z = Tcl_GetS
2ed0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
2ee0: 6e 74 65 72 70 29 3b 0a 20 20 66 6f 72 28 69 3d  nterp);.  for(i=
2ef0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
2f00: 43 6f 64 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Code); i++){.   
2f10: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
2f20: 2c 20 61 43 6f 64 65 5b 69 5d 2e 7a 43 6f 64 65  , aCode[i].zCode
2f30: 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  ) ){.      *pRc 
2f40: 3d 20 61 43 6f 64 65 5b 69 5d 2e 65 43 6f 64 65  = aCode[i].eCode
2f50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2f70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
2f80: 69 63 20 69 6e 74 20 74 76 66 73 53 68 6d 4f 70  ic int tvfsShmOp
2f90: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  en(.  sqlite3_fi
2fa0: 6c 65 20 2a 70 46 69 6c 65 44 65 73 0a 29 7b 0a  le *pFileDes.){.
2fb0: 20 20 54 65 73 74 76 66 73 20 2a 70 20 3d 20 28    Testvfs *p = (
2fc0: 54 65 73 74 76 66 73 20 2a 29 28 70 56 66 73 2d  Testvfs *)(pVfs-
2fd0: 3e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 69 6e  >pAppData);.  in
2fe0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3000: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
3010: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 49 64 20 3d    Tcl_Obj *pId =
3020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
3030: 20 20 2f 2a 20 49 64 20 66 6f 72 20 74 68 69 73    /* Id for this
3040: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
3050: 20 54 65 73 74 76 66 73 42 75 66 66 65 72 20 2a   TestvfsBuffer *
3060: 70 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20  pBuffer;        
3070: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 6f 70   /* Buffer to op
3080: 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  en connection to
3090: 20 2a 2f 0a 20 20 54 65 73 74 76 66 73 53 68 6d   */.  TestvfsShm
30a0: 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20   *pShm;         
30b0: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 73 68 6d        /* New shm
30c0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 74 76 66   handle */.  tvf
30d0: 73 5f 66 69 6c 65 20 2a 70 46 64 3b 20 20 20 20  s_file *pFd;    
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30f0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
3100: 74 6f 72 20 2a 2f 0a 0a 20 20 70 46 64 20 3d 20  tor */..  pFd = 
3110: 28 74 76 66 73 5f 66 69 6c 65 2a 29 70 46 69 6c  (tvfs_file*)pFil
3120: 65 44 65 73 3b 0a 0a 20 20 2f 2a 20 45 76 61 6c  eDes;..  /* Eval
3130: 75 61 74 65 20 74 68 65 20 54 63 6c 20 73 63 72  uate the Tcl scr
3140: 69 70 74 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ipt: .  **.  ** 
3150: 20 20 53 43 52 49 50 54 20 78 53 68 6d 4f 70 65    SCRIPT xShmOpe
3160: 6e 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  n FILENAME.  **.
3170: 20 20 2a 2a 20 49 66 20 74 68 65 20 73 63 72 69    ** If the scri
3180: 70 74 20 72 65 74 75 72 6e 73 20 61 6e 20 53 51  pt returns an SQ
3190: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
31a0: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
31b0: 45 5f 4f 4b 2c 20 61 6e 0a 20 20 2a 2a 20 65 72  E_OK, an.  ** er
31c0: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
31d0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49  to the caller. I
31e0: 66 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  f it returns SQL
31f0: 49 54 45 5f 4f 4b 2c 20 74 68 65 20 6e 65 77 0a  ITE_OK, the new.
3200: 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
3210: 69 73 20 6e 61 6d 65 64 20 22 61 6e 6f 6e 22 2e  is named "anon".
3220: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
3230: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
3240: 79 20 74 68 65 0a 20 20 2a 2a 20 73 63 72 69 70  y the.  ** scrip
3250: 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
3260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 61 6d 65   connection name
3270: 2e 0a 20 20 2a 2f 0a 20 20 74 76 66 73 45 78 65  ..  */.  tvfsExe
3280: 63 54 63 6c 28 70 2c 20 22 78 53 68 6d 4f 70 65  cTcl(p, "xShmOpe
3290: 6e 22 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  n", Tcl_NewStrin
32a0: 67 4f 62 6a 28 70 46 64 2d 3e 7a 46 69 6c 65 6e  gObj(pFd->zFilen
32b0: 61 6d 65 2c 20 2d 31 29 2c 20 30 2c 20 30 29 3b  ame, -1), 0, 0);
32c0: 0a 20 20 69 66 28 20 74 76 66 73 52 65 73 75 6c  .  if( tvfsResul
32d0: 74 43 6f 64 65 28 70 2c 20 26 72 63 29 20 29 7b  tCode(p, &rc) ){
32e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32f0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
3300: 72 63 3b 0a 20 20 20 20 70 49 64 20 3d 20 54 63  rc;.    pId = Tc
3310: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3320: 61 6e 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  anon", -1);.  }e
3330: 6c 73 65 7b 0a 20 20 20 20 70 49 64 20 3d 20 54  lse{.    pId = T
3340: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3350: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
3360: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
3370: 6e 74 28 70 49 64 29 3b 0a 0a 20 20 2f 2a 20 41  nt(pId);..  /* A
3380: 6c 6c 6f 63 61 74 65 20 74 68 65 20 54 65 73 74  llocate the Test
3390: 76 66 73 53 68 6d 20 68 61 6e 64 6c 65 2e 20 2a  vfsShm handle. *
33a0: 2f 0a 20 20 70 53 68 6d 20 3d 20 28 54 65 73 74  /.  pShm = (Test
33b0: 76 66 73 53 68 6d 20 2a 29 63 6b 61 6c 6c 6f 63  vfsShm *)ckalloc
33c0: 28 73 69 7a 65 6f 66 28 54 65 73 74 76 66 73 53  (sizeof(TestvfsS
33d0: 68 6d 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  hm));.  memset(p
33e0: 53 68 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 54  Shm, 0, sizeof(T
33f0: 65 73 74 76 66 73 53 68 6d 29 29 3b 0a 20 20 70  estvfsShm));.  p
3400: 53 68 6d 2d 3e 69 64 20 3d 20 70 49 64 3b 0a 0a  Shm->id = pId;..
3410: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
3420: 61 20 54 65 73 74 76 66 73 42 75 66 66 65 72 2e  a TestvfsBuffer.
3430: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
3440: 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
3450: 2f 0a 20 20 66 6f 72 28 70 42 75 66 66 65 72 3d  /.  for(pBuffer=
3460: 70 2d 3e 70 42 75 66 66 65 72 3b 20 70 42 75 66  p->pBuffer; pBuf
3470: 66 65 72 3b 20 70 42 75 66 66 65 72 3d 70 42 75  fer; pBuffer=pBu
3480: 66 66 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ffer->pNext){.  
3490: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
34a0: 7a 4e 61 6d 65 2c 20 70 42 75 66 66 65 72 2d 3e  zName, pBuffer->
34b0: 7a 46 69 6c 65 29 20 29 20 62 72 65 61 6b 3b 0a  zFile) ) break;.
34c0: 20 20 7d 0a 20 20 69 66 28 20 21 70 42 75 66 66    }.  if( !pBuff
34d0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  er ){.    int nB
34e0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 54 65 73  yte = sizeof(Tes
34f0: 74 76 66 73 42 75 66 66 65 72 29 20 2b 20 73 74  tvfsBuffer) + st
3500: 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 3b  rlen(zName) + 1;
3510: 0a 20 20 20 20 70 42 75 66 66 65 72 20 3d 20 28  .    pBuffer = (
3520: 54 65 73 74 76 66 73 42 75 66 66 65 72 20 2a 29  TestvfsBuffer *)
3530: 63 6b 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  ckalloc(nByte);.
3540: 20 20 20 20 6d 65 6d 73 65 74 28 70 42 75 66 66      memset(pBuff
3550: 65 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  er, 0, nByte);. 
3560: 20 20 20 70 42 75 66 66 65 72 2d 3e 7a 46 69 6c     pBuffer->zFil
3570: 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 42 75  e = (char *)&pBu
3580: 66 66 65 72 5b 31 5d 3b 0a 20 20 20 20 73 74 72  ffer[1];.    str
3590: 63 70 79 28 70 42 75 66 66 65 72 2d 3e 7a 46 69  cpy(pBuffer->zFi
35a0: 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le, zName);.    
35b0: 70 42 75 66 66 65 72 2d 3e 70 4e 65 78 74 20 3d  pBuffer->pNext =
35c0: 20 70 2d 3e 70 42 75 66 66 65 72 3b 0a 20 20 20   p->pBuffer;.   
35d0: 20 70 2d 3e 70 42 75 66 66 65 72 20 3d 20 70 42   p->pBuffer = pB
35e0: 75 66 66 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  uffer;.  }..  /*
35f0: 20 43 6f 6e 6e 65 63 74 20 74 68 65 20 54 65 73   Connect the Tes
3600: 74 76 66 73 42 75 66 66 65 72 20 74 6f 20 74 68  tvfsBuffer to th
3610: 65 20 6e 65 77 20 54 65 73 74 76 66 73 53 68 6d  e new TestvfsShm
3620: 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 74 75   handle and retu
3630: 72 6e 2e 20 2a 2f 0a 20 20 70 42 75 66 66 65 72  rn. */.  pBuffer
3640: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 53 68 6d  ->nRef++;.  pShm
3650: 2d 3e 70 42 75 66 66 65 72 20 3d 20 70 42 75 66  ->pBuffer = pBuf
3660: 66 65 72 3b 0a 20 20 2a 70 70 20 3d 20 28 73 71  fer;.  *pp = (sq
3670: 6c 69 74 65 33 5f 73 68 6d 20 2a 29 70 53 68 6d  lite3_shm *)pShm
3680: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3690: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
36a0: 69 6e 74 20 74 76 66 73 53 68 6d 53 69 7a 65 28  int tvfsShmSize(
36b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
36c0: 70 56 66 73 2c 0a 20 20 73 71 6c 69 74 65 33 5f  pVfs,.  sqlite3_
36d0: 73 68 6d 20 2a 70 53 68 6d 48 61 6e 64 6c 65 2c  shm *pShmHandle,
36e0: 0a 20 20 69 6e 74 20 72 65 71 53 69 7a 65 2c 0a  .  int reqSize,.
36f0: 20 20 69 6e 74 20 2a 70 4e 65 77 53 69 7a 65 0a    int *pNewSize.
3700: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3710: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 65 73 74 76  LITE_OK;.  Testv
3720: 66 73 20 2a 70 20 3d 20 28 54 65 73 74 76 66 73  fs *p = (Testvfs
3730: 20 2a 29 28 70 56 66 73 2d 3e 70 41 70 70 44 61   *)(pVfs->pAppDa
3740: 74 61 29 3b 0a 20 20 54 65 73 74 76 66 73 53 68  ta);.  TestvfsSh
3750: 6d 20 2a 70 53 68 6d 20 3d 20 28 54 65 73 74 76  m *pShm = (Testv
3760: 66 73 53 68 6d 20 2a 29 70 53 68 6d 48 61 6e 64  fsShm *)pShmHand
3770: 6c 65 3b 0a 0a 20 20 74 76 66 73 45 78 65 63 54  le;..  tvfsExecT
3780: 63 6c 28 70 2c 20 22 78 53 68 6d 53 69 7a 65 22  cl(p, "xShmSize"
3790: 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
37a0: 53 74 72 69 6e 67 4f 62 6a 28 70 53 68 6d 2d 3e  StringObj(pShm->
37b0: 70 42 75 66 66 65 72 2d 3e 7a 46 69 6c 65 2c 20  pBuffer->zFile, 
37c0: 2d 31 29 2c 20 70 53 68 6d 2d 3e 69 64 2c 20 30  -1), pShm->id, 0
37d0: 0a 20 20 29 3b 0a 20 20 74 76 66 73 52 65 73 75  .  );.  tvfsResu
37e0: 6c 74 43 6f 64 65 28 70 2c 20 26 72 63 29 3b 0a  ltCode(p, &rc);.
37f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3800: 5f 4f 4b 20 29 7b 0a 20 20 20 20 74 76 66 73 47  _OK ){.    tvfsG
3810: 72 6f 77 42 75 66 66 65 72 28 70 53 68 6d 2c 20  rowBuffer(pShm, 
3820: 72 65 71 53 69 7a 65 2c 20 70 4e 65 77 53 69 7a  reqSize, pNewSiz
3830: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
3840: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
3850: 6e 74 20 74 76 66 73 53 68 6d 47 65 74 28 0a 20  nt tvfsShmGet(. 
3860: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
3870: 66 73 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 68  fs,.  sqlite3_sh
3880: 6d 20 2a 70 53 68 6d 48 61 6e 64 6c 65 2c 20 0a  m *pShmHandle, .
3890: 20 20 69 6e 74 20 72 65 71 4d 61 70 53 69 7a 65    int reqMapSize
38a0: 2c 20 0a 20 20 69 6e 74 20 2a 70 4d 61 70 53 69  , .  int *pMapSi
38b0: 7a 65 2c 20 0a 20 20 76 6f 69 64 20 2a 2a 70 70  ze, .  void **pp
38c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
38d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 65 73 74  QLITE_OK;.  Test
38e0: 76 66 73 20 2a 70 20 3d 20 28 54 65 73 74 76 66  vfs *p = (Testvf
38f0: 73 20 2a 29 28 70 56 66 73 2d 3e 70 41 70 70 44  s *)(pVfs->pAppD
3900: 61 74 61 29 3b 0a 20 20 54 65 73 74 76 66 73 53  ata);.  TestvfsS
3910: 68 6d 20 2a 70 53 68 6d 20 3d 20 28 54 65 73 74  hm *pShm = (Test
3920: 76 66 73 53 68 6d 20 2a 29 70 53 68 6d 48 61 6e  vfsShm *)pShmHan
3930: 64 6c 65 3b 0a 0a 20 20 74 76 66 73 45 78 65 63  dle;..  tvfsExec
3940: 54 63 6c 28 70 2c 20 22 78 53 68 6d 47 65 74 22  Tcl(p, "xShmGet"
3950: 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
3960: 53 74 72 69 6e 67 4f 62 6a 28 70 53 68 6d 2d 3e  StringObj(pShm->
3970: 70 42 75 66 66 65 72 2d 3e 7a 46 69 6c 65 2c 20  pBuffer->zFile, 
3980: 2d 31 29 2c 20 70 53 68 6d 2d 3e 69 64 2c 20 30  -1), pShm->id, 0
3990: 0a 20 20 29 3b 0a 20 20 74 76 66 73 52 65 73 75  .  );.  tvfsResu
39a0: 6c 74 43 6f 64 65 28 70 2c 20 26 72 63 29 3b 0a  ltCode(p, &rc);.
39b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
39c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 74 76 66 73 47  _OK ){.    tvfsG
39d0: 72 6f 77 42 75 66 66 65 72 28 70 53 68 6d 2c 20  rowBuffer(pShm, 
39e0: 72 65 71 4d 61 70 53 69 7a 65 2c 20 70 4d 61 70  reqMapSize, pMap
39f0: 53 69 7a 65 29 3b 0a 20 20 20 20 2a 70 70 20 3d  Size);.    *pp =
3a00: 20 70 53 68 6d 2d 3e 70 42 75 66 66 65 72 2d 3e   pShm->pBuffer->
3a10: 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
3a20: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
3a30: 74 20 74 76 66 73 53 68 6d 52 65 6c 65 61 73 65  t tvfsShmRelease
3a40: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
3a50: 66 73 2c 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  fs, sqlite3_shm 
3a60: 2a 70 53 68 6d 48 61 6e 64 6c 65 29 7b 0a 20 20  *pShmHandle){.  
3a70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3a80: 4f 4b 3b 0a 20 20 54 65 73 74 76 66 73 20 2a 70  OK;.  Testvfs *p
3a90: 20 3d 20 28 54 65 73 74 76 66 73 20 2a 29 28 70   = (Testvfs *)(p
3aa0: 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 3b 0a  Vfs->pAppData);.
3ab0: 20 20 54 65 73 74 76 66 73 53 68 6d 20 2a 70 53    TestvfsShm *pS
3ac0: 68 6d 20 3d 20 28 54 65 73 74 76 66 73 53 68 6d  hm = (TestvfsShm
3ad0: 20 2a 29 70 53 68 6d 48 61 6e 64 6c 65 3b 0a 0a   *)pShmHandle;..
3ae0: 20 20 74 76 66 73 45 78 65 63 54 63 6c 28 70 2c    tvfsExecTcl(p,
3af0: 20 22 78 53 68 6d 52 65 6c 65 61 73 65 22 2c 20   "xShmRelease", 
3b00: 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
3b10: 72 69 6e 67 4f 62 6a 28 70 53 68 6d 2d 3e 70 42  ringObj(pShm->pB
3b20: 75 66 66 65 72 2d 3e 7a 46 69 6c 65 2c 20 2d 31  uffer->zFile, -1
3b30: 29 2c 20 70 53 68 6d 2d 3e 69 64 2c 20 30 0a 20  ), pShm->id, 0. 
3b40: 20 29 3b 0a 20 20 74 76 66 73 52 65 73 75 6c 74   );.  tvfsResult
3b50: 43 6f 64 65 28 70 2c 20 26 72 63 29 3b 0a 0a 20  Code(p, &rc);.. 
3b60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
3b70: 74 61 74 69 63 20 69 6e 74 20 74 76 66 73 53 68  tatic int tvfsSh
3b80: 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
3b90: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 73 71  _vfs *pVfs,.  sq
3ba0: 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68 6d 48  lite3_shm *pShmH
3bb0: 61 6e 64 6c 65 2c 0a 20 20 69 6e 74 20 64 65 73  andle,.  int des
3bc0: 69 72 65 64 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20  iredLock,.  int 
3bd0: 2a 67 6f 74 4c 6f 63 6b 0a 29 7b 0a 20 20 69 6e  *gotLock.){.  in
3be0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3bf0: 3b 0a 20 20 54 65 73 74 76 66 73 20 2a 70 20 3d  ;.  Testvfs *p =
3c00: 20 28 54 65 73 74 76 66 73 20 2a 29 28 70 56 66   (Testvfs *)(pVf
3c10: 73 2d 3e 70 41 70 70 44 61 74 61 29 3b 0a 20 20  s->pAppData);.  
3c20: 54 65 73 74 76 66 73 53 68 6d 20 2a 70 53 68 6d  TestvfsShm *pShm
3c30: 20 3d 20 28 54 65 73 74 76 66 73 53 68 6d 20 2a   = (TestvfsShm *
3c40: 29 70 53 68 6d 48 61 6e 64 6c 65 3b 0a 20 20 63  )pShmHandle;.  c
3c50: 68 61 72 20 2a 7a 4c 6f 63 6b 20 3d 20 22 22 3b  har *zLock = "";
3c60: 0a 0a 20 20 73 77 69 74 63 68 28 20 64 65 73 69  ..  switch( desi
3c70: 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  redLock ){.    c
3c80: 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52  ase SQLITE_SHM_R
3c90: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4c 6f  EAD:         zLo
3ca0: 63 6b 20 3d 20 22 52 45 41 44 22 3b 20 20 20 20  ck = "READ";    
3cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3cc0: 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52  se SQLITE_SHM_WR
3cd0: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4c 6f 63  ITE:        zLoc
3ce0: 6b 20 3d 20 22 57 52 49 54 45 22 3b 20 20 20 20  k = "WRITE";    
3cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
3d00: 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45  e SQLITE_SHM_CHE
3d10: 43 4b 50 4f 49 4e 54 3a 20 20 20 7a 4c 6f 63 6b  CKPOINT:   zLock
3d20: 20 3d 20 22 43 48 45 43 4b 50 4f 49 4e 54 22 3b   = "CHECKPOINT";
3d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3d40: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f   SQLITE_SHM_RECO
3d50: 56 45 52 3a 20 20 20 20 20 20 7a 4c 6f 63 6b 20  VER:      zLock 
3d60: 3d 20 22 52 45 43 4f 56 45 52 22 3b 20 20 20 20  = "RECOVER";    
3d70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3d80: 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49  SQLITE_SHM_PENDI
3d90: 4e 47 3a 20 20 20 20 20 20 7a 4c 6f 63 6b 20 3d  NG:      zLock =
3da0: 20 22 50 45 4e 44 49 4e 47 22 3b 20 20 20 20 62   "PENDING";    b
3db0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3dc0: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
3dd0: 3a 20 20 20 20 20 20 20 7a 4c 6f 63 6b 20 3d 20  :       zLock = 
3de0: 22 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  "UNLOCK";     br
3df0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 74 76 66 73 45  eak;.  }.  tvfsE
3e00: 78 65 63 54 63 6c 28 70 2c 20 22 78 53 68 6d 4c  xecTcl(p, "xShmL
3e10: 6f 63 6b 22 2c 20 0a 20 20 20 20 20 20 54 63 6c  ock", .      Tcl
3e20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 53  _NewStringObj(pS
3e30: 68 6d 2d 3e 70 42 75 66 66 65 72 2d 3e 7a 46 69  hm->pBuffer->zFi
3e40: 6c 65 2c 20 2d 31 29 2c 20 70 53 68 6d 2d 3e 69  le, -1), pShm->i
3e50: 64 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  d,.      Tcl_New
3e60: 53 74 72 69 6e 67 4f 62 6a 28 7a 4c 6f 63 6b 2c  StringObj(zLock,
3e70: 20 2d 31 29 0a 20 20 29 3b 0a 20 20 74 76 66 73   -1).  );.  tvfs
3e80: 52 65 73 75 6c 74 43 6f 64 65 28 70 2c 20 26 72  ResultCode(p, &r
3e90: 63 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  c);.  if( rc==SQ
3ea0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
3eb0: 67 6f 74 4c 6f 63 6b 20 3d 20 64 65 73 69 72 65  gotLock = desire
3ec0: 64 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  dLock;.  }..  re
3ed0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
3ee0: 69 63 20 69 6e 74 20 74 76 66 73 53 68 6d 43 6c  ic int tvfsShmCl
3ef0: 6f 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ose(.  sqlite3_v
3f00: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 73 71 6c  fs *pVfs, .  sql
3f10: 69 74 65 33 5f 73 68 6d 20 2a 70 53 68 6d 48 61  ite3_shm *pShmHa
3f20: 6e 64 6c 65 2c 20 0a 20 20 69 6e 74 20 64 65 6c  ndle, .  int del
3f30: 65 74 65 46 6c 61 67 0a 29 7b 0a 20 20 69 6e 74  eteFlag.){.  int
3f40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3f50: 0a 20 20 54 65 73 74 76 66 73 20 2a 70 20 3d 20  .  Testvfs *p = 
3f60: 28 54 65 73 74 76 66 73 20 2a 29 28 70 56 66 73  (Testvfs *)(pVfs
3f70: 2d 3e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 54  ->pAppData);.  T
3f80: 65 73 74 76 66 73 53 68 6d 20 2a 70 53 68 6d 20  estvfsShm *pShm 
3f90: 3d 20 28 54 65 73 74 76 66 73 53 68 6d 20 2a 29  = (TestvfsShm *)
3fa0: 70 53 68 6d 48 61 6e 64 6c 65 3b 0a 20 20 54 65  pShmHandle;.  Te
3fb0: 73 74 76 66 73 42 75 66 66 65 72 20 2a 70 42 75  stvfsBuffer *pBu
3fc0: 66 66 65 72 20 3d 20 70 53 68 6d 2d 3e 70 42 75  ffer = pShm->pBu
3fd0: 66 66 65 72 3b 0a 0a 23 69 66 20 30 0a 20 20 61  ffer;..#if 0.  a
3fe0: 73 73 65 72 74 28 20 28 64 65 6c 65 74 65 46 6c  ssert( (deleteFl
3ff0: 61 67 21 3d 30 29 3d 3d 28 70 42 75 66 66 65 72  ag!=0)==(pBuffer
4000: 2d 3e 6e 52 65 66 3d 3d 31 29 20 29 3b 0a 23 65  ->nRef==1) );.#e
4010: 6e 64 69 66 0a 0a 20 20 74 76 66 73 45 78 65 63  ndif..  tvfsExec
4020: 54 63 6c 28 70 2c 20 22 78 53 68 6d 43 6c 6f 73  Tcl(p, "xShmClos
4030: 65 22 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  e", .      Tcl_N
4040: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 53 68 6d  ewStringObj(pShm
4050: 2d 3e 70 42 75 66 66 65 72 2d 3e 7a 46 69 6c 65  ->pBuffer->zFile
4060: 2c 20 2d 31 29 2c 20 70 53 68 6d 2d 3e 69 64 2c  , -1), pShm->id,
4070: 20 30 0a 20 20 29 3b 0a 20 20 74 76 66 73 52 65   0.  );.  tvfsRe
4080: 73 75 6c 74 43 6f 64 65 28 70 2c 20 26 72 63 29  sultCode(p, &rc)
4090: 3b 0a 0a 20 20 70 42 75 66 66 65 72 2d 3e 6e 52  ;..  pBuffer->nR
40a0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 75 66  ef--;.  if( pBuf
40b0: 66 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  fer->nRef==0 ){.
40c0: 20 20 20 20 54 65 73 74 76 66 73 42 75 66 66 65      TestvfsBuffe
40d0: 72 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  r **pp;.    for(
40e0: 70 70 3d 26 70 2d 3e 70 42 75 66 66 65 72 3b 20  pp=&p->pBuffer; 
40f0: 2a 70 70 21 3d 70 42 75 66 66 65 72 3b 20 70 70  *pp!=pBuffer; pp
4100: 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
4110: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 2a 70  );.    *pp = (*p
4120: 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 63  p)->pNext;.    c
4130: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 70 42  kfree((char *)pB
4140: 75 66 66 65 72 2d 3e 61 29 3b 0a 20 20 20 20 63  uffer->a);.    c
4150: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 70 42  kfree((char *)pB
4160: 75 66 66 65 72 29 3b 0a 20 20 7d 0a 20 20 54 63  uffer);.  }.  Tc
4170: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4180: 53 68 6d 2d 3e 69 64 29 3b 0a 20 20 63 6b 66 72  Shm->id);.  ckfr
4190: 65 65 28 28 63 68 61 72 20 2a 29 70 53 68 6d 29  ee((char *)pShm)
41a0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
41b0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
41c0: 73 74 76 66 73 5f 6f 62 6a 5f 63 6d 64 28 0a 20  stvfs_obj_cmd(. 
41d0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a   ClientData cd,.
41e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
41f0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
4200: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
4210: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
4220: 65 73 74 76 66 73 20 2a 70 20 3d 20 28 54 65 73  estvfs *p = (Tes
4230: 74 76 66 73 20 2a 29 63 64 3b 0a 0a 20 20 73 74  tvfs *)cd;..  st
4240: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4250: 2a 43 4d 44 5f 73 74 72 73 5b 5d 20 3d 20 7b 20  *CMD_strs[] = { 
4260: 22 73 68 6d 22 2c 20 22 64 65 6c 65 74 65 22 2c  "shm", "delete",
4270: 20 30 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f   0 };.  enum DB_
4280: 65 6e 75 6d 20 7b 20 43 4d 44 5f 53 48 4d 2c 20  enum { CMD_SHM, 
4290: 43 4d 44 5f 44 45 4c 45 54 45 20 7d 3b 0a 20 20  CMD_DELETE };.  
42a0: 69 6e 74 20 69 3b 0a 20 20 0a 20 20 69 66 28 20  int i;.  .  if( 
42b0: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
42c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
42d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
42e0: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
42f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4300: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4310: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
4320: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
4330: 62 6a 76 5b 31 5d 2c 20 43 4d 44 5f 73 74 72 73  bjv[1], CMD_strs
4340: 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 22 2c 20  , "subcommand", 
4350: 30 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 72 65  0, &i) ){.    re
4360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4370: 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52    }.  Tcl_ResetR
4380: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 0a  esult(interp);..
4390: 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
43a0: 44 42 5f 65 6e 75 6d 29 69 20 29 7b 0a 20 20 20  DB_enum)i ){.   
43b0: 20 63 61 73 65 20 43 4d 44 5f 53 48 4d 3a 20 7b   case CMD_SHM: {
43c0: 0a 20 20 20 20 20 20 54 65 73 74 76 66 73 42 75  .      TestvfsBu
43d0: 66 66 65 72 20 2a 70 42 75 66 66 65 72 3b 0a 20  ffer *pBuffer;. 
43e0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
43f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
4400: 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
4410: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
4420: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
4430: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 46 49 4c  p, 2, objv, "FIL
4440: 45 20 3f 56 41 4c 55 45 3f 22 29 3b 0a 20 20 20  E ?VALUE?");.   
4450: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
4460: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
4470: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c       zName = Tcl
4480: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
4490: 32 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  2]);.      for(p
44a0: 42 75 66 66 65 72 3d 70 2d 3e 70 42 75 66 66 65  Buffer=p->pBuffe
44b0: 72 3b 20 70 42 75 66 66 65 72 3b 20 70 42 75 66  r; pBuffer; pBuf
44c0: 66 65 72 3d 70 42 75 66 66 65 72 2d 3e 70 4e 65  fer=pBuffer->pNe
44d0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
44e0: 20 30 3d 3d 73 74 72 63 6d 70 28 70 42 75 66 66   0==strcmp(pBuff
44f0: 65 72 2d 3e 7a 46 69 6c 65 2c 20 7a 4e 61 6d 65  er->zFile, zName
4500: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
4510: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 42   }.      if( !pB
4520: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
4530: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4540: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
4550: 63 68 20 66 69 6c 65 3a 20 22 2c 20 7a 4e 61 6d  ch file: ", zNam
4560: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  e, 0);.        r
4570: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4590: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
45a0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
45b0: 20 20 20 20 20 75 38 20 2a 61 20 3d 20 54 63 6c       u8 *a = Tcl
45c0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
45d0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
45e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 66  );.        pBuff
45f0: 65 72 2d 3e 61 20 3d 20 28 75 38 20 2a 29 63 6b  er->a = (u8 *)ck
4600: 72 65 61 6c 6c 6f 63 28 28 63 68 61 72 20 2a 29  realloc((char *)
4610: 70 42 75 66 66 65 72 2d 3e 61 2c 20 6e 29 3b 0a  pBuffer->a, n);.
4620: 20 20 20 20 20 20 20 20 70 42 75 66 66 65 72 2d          pBuffer-
4630: 3e 6e 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  >n = n;.        
4640: 6d 65 6d 63 70 79 28 70 42 75 66 66 65 72 2d 3e  memcpy(pBuffer->
4650: 61 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 20 20  a, a, n);.      
4660: 7d 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  }.      Tcl_SetO
4670: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
4680: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
4690: 79 4f 62 6a 28 70 42 75 66 66 65 72 2d 3e 61 2c  yObj(pBuffer->a,
46a0: 20 70 42 75 66 66 65 72 2d 3e 6e 29 29 3b 0a 20   pBuffer->n));. 
46b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
46c0: 7d 0a 20 20 20 20 63 61 73 65 20 43 4d 44 5f 44  }.    case CMD_D
46d0: 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20 20 54  ELETE: {.      T
46e0: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
46f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
4700: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 29  String(objv[0]))
4710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4720: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
4730: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
4740: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 76 66  atic void testvf
4750: 73 5f 6f 62 6a 5f 64 65 6c 28 43 6c 69 65 6e 74  s_obj_del(Client
4760: 44 61 74 61 20 63 64 29 7b 0a 20 20 69 6e 74 20  Data cd){.  int 
4770: 69 3b 0a 20 20 54 65 73 74 76 66 73 20 2a 70 20  i;.  Testvfs *p 
4780: 3d 20 28 54 65 73 74 76 66 73 20 2a 29 63 64 3b  = (Testvfs *)cd;
4790: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
47a0: 3e 6e 53 63 72 69 70 74 3b 20 69 2b 2b 29 7b 0a  >nScript; i++){.
47b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
47c0: 6f 75 6e 74 28 70 2d 3e 61 70 53 63 72 69 70 74  ount(p->apScript
47d0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
47e0: 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
47f0: 65 72 28 70 2d 3e 70 56 66 73 29 3b 0a 20 20 63  er(p->pVfs);.  c
4800: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 70 2d  kfree((char *)p-
4810: 3e 70 56 66 73 29 3b 0a 20 20 63 6b 66 72 65 65  >pVfs);.  ckfree
4820: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 7d 0a 0a  ((char *)p);.}..
4830: 23 64 65 66 69 6e 65 20 54 45 53 54 56 46 53 5f  #define TESTVFS_
4840: 4d 41 58 5f 41 52 47 53 20 31 32 0a 0a 2f 2a 0a  MAX_ARGS 12../*.
4850: 2a 2a 20 55 73 61 67 65 3a 20 20 74 65 73 74 76  ** Usage:  testv
4860: 66 73 20 3f 2d 6e 6f 73 68 6d 3f 20 56 46 53 4e  fs ?-noshm? VFSN
4870: 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a  AME SCRIPT.**.**
4880: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
4890: 65 61 74 65 73 20 74 77 6f 20 74 68 69 6e 67 73  eates two things
48a0: 20 77 68 65 6e 20 69 74 20 69 73 20 69 6e 76 6f   when it is invo
48b0: 6b 65 64 3a 20 61 6e 20 53 51 4c 69 74 65 20 56  ked: an SQLite V
48c0: 46 53 2c 20 61 6e 64 0a 2a 2a 20 61 20 54 63 6c  FS, and.** a Tcl
48d0: 20 63 6f 6d 6d 61 6e 64 2e 20 42 6f 74 68 20 61   command. Both a
48e0: 72 65 20 6e 61 6d 65 64 20 56 46 53 4e 41 4d 45  re named VFSNAME
48f0: 2e 20 54 68 65 20 56 46 53 20 69 73 20 69 6e 73  . The VFS is ins
4900: 74 61 6c 6c 65 64 2e 20 49 74 20 69 73 20 6e 6f  talled. It is no
4910: 74 0a 2a 2a 20 69 6e 73 74 61 6c 6c 65 64 20 61  t.** installed a
4920: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  s the default VF
4930: 53 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 46 53  S..**.** The VFS
4940: 20 70 61 73 73 65 73 20 61 6c 6c 20 66 69 6c 65   passes all file
4950: 20 49 2f 4f 20 63 61 6c 6c 73 20 74 68 72 6f 75   I/O calls throu
4960: 67 68 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  gh to the underl
4970: 79 69 6e 67 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  ying VFS..**.** 
4980: 57 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20  Whenever one of 
4990: 74 68 65 20 78 53 68 6d 53 69 7a 65 2c 20 78 53  the xShmSize, xS
49a0: 68 6d 47 65 74 20 6f 72 20 78 53 68 6d 52 65 6c  hmGet or xShmRel
49b0: 65 61 73 65 20 6d 65 74 68 6f 64 73 20 6f 66 20  ease methods of 
49c0: 74 68 65 20 56 46 53 0a 2a 2a 20 61 72 65 20 69  the VFS.** are i
49d0: 6e 76 6f 6b 65 64 2c 20 74 68 65 20 53 43 52 49  nvoked, the SCRI
49e0: 50 54 20 69 73 20 65 78 65 63 75 74 65 64 20 61  PT is executed a
49f0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4a00: 20 20 20 53 43 52 49 50 54 20 78 53 68 6d 53 69     SCRIPT xShmSi
4a10: 7a 65 20 20 20 20 46 49 4c 45 4e 41 4d 45 20 49  ze    FILENAME I
4a20: 44 0a 2a 2a 20 20 20 53 43 52 49 50 54 20 78 53  D.**   SCRIPT xS
4a30: 68 6d 47 65 74 20 20 20 20 20 46 49 4c 45 4e 41  hmGet     FILENA
4a40: 4d 45 20 49 44 0a 2a 2a 20 20 20 53 43 52 49 50  ME ID.**   SCRIP
4a50: 54 20 78 53 68 6d 52 65 6c 65 61 73 65 20 46 49  T xShmRelease FI
4a60: 4c 45 4e 41 4d 45 20 49 44 0a 2a 2a 0a 2a 2a 20  LENAME ID.**.** 
4a70: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4a80: 65 64 20 62 79 20 74 68 65 20 69 6e 76 6f 63 61  ed by the invoca
4a90: 74 69 6f 6e 20 6f 66 20 53 43 52 49 50 54 20 61  tion of SCRIPT a
4aa0: 62 6f 76 65 20 69 73 20 69 6e 74 65 72 70 72 65  bove is interpre
4ab0: 74 65 64 20 61 73 0a 2a 2a 20 61 6e 20 53 51 4c  ted as.** an SQL
4ac0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
4ad0: 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  nd returned to S
4ae0: 51 4c 69 74 65 2e 20 45 69 74 68 65 72 20 61 20  QLite. Either a 
4af0: 73 79 6d 62 6f 6c 69 63 20 0a 2a 2a 20 22 53 51  symbolic .** "SQ
4b00: 4c 49 54 45 5f 4f 4b 22 20 6f 72 20 6e 75 6d 65  LITE_OK" or nume
4b10: 72 69 63 20 22 30 22 20 76 61 6c 75 65 20 6d 61  ric "0" value ma
4b20: 79 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a  y be returned..*
4b30: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
4b40: 73 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  s of the shared-
4b50: 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20 61 73  memory buffer as
4b60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
4b70: 67 69 76 65 6e 20 66 69 6c 65 0a 2a 2a 20 6d 61  given file.** ma
4b80: 79 20 62 65 20 72 65 61 64 20 61 6e 64 20 73 65  y be read and se
4b90: 74 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  t using the foll
4ba0: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  owing command:.*
4bb0: 2a 0a 2a 2a 20 20 20 56 46 53 4e 41 4d 45 20 73  *.**   VFSNAME s
4bc0: 68 6d 20 46 49 4c 45 4e 41 4d 45 20 3f 4e 45 57  hm FILENAME ?NEW
4bd0: 56 41 4c 55 45 3f 0a 2a 2a 0a 2a 2a 20 57 68 65  VALUE?.**.** Whe
4be0: 6e 20 74 68 65 20 78 53 68 6d 4c 6f 63 6b 20 6d  n the xShmLock m
4bf0: 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64  ethod is invoked
4c00: 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20   by SQLite, the 
4c10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70 74  following script
4c20: 20 69 73 0a 2a 2a 20 72 75 6e 3a 0a 2a 2a 0a 2a   is.** run:.**.*
4c30: 2a 20 20 20 53 43 52 49 50 54 20 78 53 68 6d 4c  *   SCRIPT xShmL
4c40: 6f 63 6b 20 20 20 20 46 49 4c 45 4e 41 4d 45 20  ock    FILENAME 
4c50: 49 44 20 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 77 68  ID LOCK.**.** wh
4c60: 65 72 65 20 4c 4f 43 4b 20 69 73 20 6f 6e 65 20  ere LOCK is one 
4c70: 6f 66 20 22 55 4e 4c 4f 43 4b 22 2c 20 22 52 45  of "UNLOCK", "RE
4c80: 41 44 22 2c 20 22 52 45 41 44 5f 46 55 4c 4c 22  AD", "READ_FULL"
4c90: 2c 20 22 57 52 49 54 45 22 2c 20 22 50 45 4e 44  , "WRITE", "PEND
4ca0: 49 4e 47 22 2c 0a 2a 2a 20 22 43 48 45 43 4b 50  ING",.** "CHECKP
4cb0: 4f 49 4e 54 22 20 6f 72 20 22 52 45 43 4f 56 45  OINT" or "RECOVE
4cc0: 52 22 2e 20 54 68 65 20 73 63 72 69 70 74 20 73  R". The script s
4cd0: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 6e 20  hould return an 
4ce0: 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
4cf0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4d00: 69 6e 74 20 74 65 73 74 76 66 73 5f 63 6d 64 28  int testvfs_cmd(
4d10: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
4d20: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4d30: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
4d40: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
4d50: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a  ONST objv[].){..
4d60: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
4d70: 5f 76 66 73 20 74 76 66 73 5f 76 66 73 20 3d 20  _vfs tvfs_vfs = 
4d80: 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20  {.    2,        
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
4db0: 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 74 76  */.    sizeof(tv
4dc0: 66 73 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 20  fs_file),       
4dd0: 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
4de0: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
4e10: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
4e40: 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  t */.    0,     
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
4e70: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
4ea0: 20 2a 2f 0a 20 20 20 20 74 76 66 73 4f 70 65 6e   */.    tvfsOpen
4eb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ec0: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
4ed0: 2f 0a 20 20 20 20 74 76 66 73 44 65 6c 65 74 65  /.    tvfsDelete
4ee0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ef0: 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
4f00: 2f 0a 20 20 20 20 74 76 66 73 41 63 63 65 73 73  /.    tvfsAccess
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f20: 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
4f30: 2f 0a 20 20 20 20 74 76 66 73 46 75 6c 6c 50 61  /.    tvfsFullPa
4f40: 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  thname,         
4f50: 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
4f60: 6e 61 6d 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  name */.#ifndef 
4f70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
4f80: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 74  _EXTENSION.    t
4f90: 76 66 73 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  vfsDlOpen,      
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4fb0: 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 74  xDlOpen */.    t
4fc0: 76 66 73 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  vfsDlError,     
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4fe0: 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
4ff0: 74 76 66 73 44 6c 53 79 6d 2c 20 20 20 20 20 20  tvfsDlSym,      
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5010: 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 74   xDlSym */.    t
5020: 76 66 73 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  vfsDlClose,     
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5040: 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c 73  xDlClose */.#els
5050: 65 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  e.    0,        
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
5080: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
50b0: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
50e0: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
5110: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
5120: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
5130: 54 45 4e 53 49 4f 4e 20 2a 2f 0a 20 20 20 20 74  TENSION */.    t
5140: 76 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  vfsRandomness,  
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
5170: 20 20 20 74 76 66 73 53 6c 65 65 70 2c 20 20 20     tvfsSleep,   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
51a0: 20 20 74 76 66 73 43 75 72 72 65 6e 74 54 69 6d    tvfsCurrentTim
51b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
51c0: 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
51d0: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
5200: 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 0a  Error */.    0,.
5210: 20 20 20 20 30 2c 0a 20 20 7d 3b 0a 0a 20 20 54      0,.  };..  T
5220: 65 73 74 76 66 73 20 2a 70 3b 20 20 20 20 20 20  estvfs *p;      
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5240: 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
5250: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5260: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
5270: 20 20 2f 2a 20 4e 65 77 20 56 46 53 20 2a 2f 0a    /* New VFS */.
5280: 20 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20    char *zVfs;.  
5290: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
52a0: 3b 0a 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b  ;.  int nScript;
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
52d0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73   elements in lis
52e0: 74 20 70 53 63 72 69 70 74 20 2a 2f 0a 20 20 54  t pScript */.  T
52f0: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 53 63 72 69 70  cl_Obj **apScrip
5300: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
5310: 2a 20 41 72 72 61 79 20 6f 66 20 70 53 63 72 69  * Array of pScri
5320: 70 74 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  pt elements */. 
5330: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
5360: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ce to allocate a
5370: 74 20 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  t p */.  int i; 
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
53a0: 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
53b0: 20 20 69 6e 74 20 69 73 4e 6f 73 68 6d 20 3d 20    int isNoshm = 
53c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
53d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 6e 6f    /* True if -no
53e0: 73 68 6d 20 69 73 20 70 61 73 73 65 64 20 2a 2f  shm is passed */
53f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29  ..  if( objc<3 )
5400: 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
5410: 20 20 69 66 28 20 73 74 72 63 6d 70 28 54 63 6c    if( strcmp(Tcl
5420: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
5430: 31 5d 29 2c 20 22 2d 6e 6f 73 68 6d 22 29 3d 3d  1]), "-noshm")==
5440: 30 20 29 7b 0a 20 20 20 20 69 73 4e 6f 73 68 6d  0 ){.    isNoshm
5450: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
5460: 6f 62 6a 63 21 3d 33 2b 69 73 4e 6f 73 68 6d 20  objc!=3+isNoshm 
5470: 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
5480: 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65  .  zVfs = Tcl_Ge
5490: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 73 4e  tString(objv[isN
54a0: 6f 73 68 6d 2b 31 5d 29 3b 0a 20 20 70 53 63 72  oshm+1]);.  pScr
54b0: 69 70 74 20 3d 20 6f 62 6a 76 5b 69 73 4e 6f 73  ipt = objv[isNos
54c0: 68 6d 2b 32 5d 3b 0a 0a 20 20 69 66 28 20 54 43  hm+2];..  if( TC
54d0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f 62  L_OK!=Tcl_ListOb
54e0: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
54f0: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 26 6e  erp, pScript, &n
5500: 53 63 72 69 70 74 2c 20 26 61 70 53 63 72 69 70  Script, &apScrip
5510: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
5520: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5530: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
5540: 66 28 54 65 73 74 76 66 73 29 0a 20 20 20 20 20  f(Testvfs).     
5550: 20 20 20 2b 20 28 6e 53 63 72 69 70 74 2b 54 45     + (nScript+TE
5560: 53 54 56 46 53 5f 4d 41 58 5f 41 52 47 53 29 2a  STVFS_MAX_ARGS)*
5570: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a  sizeof(Tcl_Obj *
5580: 29 20 0a 20 20 20 20 20 20 20 20 2b 20 73 74 72  ) .        + str
5590: 6c 65 6e 28 7a 56 66 73 29 2b 31 3b 0a 20 20 70  len(zVfs)+1;.  p
55a0: 20 3d 20 28 54 65 73 74 76 66 73 20 2a 29 63 6b   = (Testvfs *)ck
55b0: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
55c0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79  memset(p, 0, nBy
55d0: 74 65 29 3b 0a 0a 20 20 70 2d 3e 70 50 61 72 65  te);..  p->pPare
55e0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  nt = sqlite3_vfs
55f0: 5f 66 69 6e 64 28 30 29 3b 0a 20 20 70 2d 3e 69  _find(0);.  p->i
5600: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
5610: 20 20 70 2d 3e 6e 53 63 72 69 70 74 20 3d 20 6e    p->nScript = n
5620: 53 63 72 69 70 74 3b 0a 20 20 70 2d 3e 61 70 53  Script;.  p->apS
5630: 63 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a  cript = (Tcl_Obj
5640: 20 2a 2a 29 26 70 5b 31 5d 3b 0a 20 20 66 6f 72   **)&p[1];.  for
5650: 28 69 3d 30 3b 20 69 3c 6e 53 63 72 69 70 74 3b  (i=0; i<nScript;
5660: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 70   i++){.    p->ap
5670: 53 63 72 69 70 74 5b 69 5d 20 3d 20 61 70 53 63  Script[i] = apSc
5680: 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 54 63 6c  ript[i];.    Tcl
5690: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
56a0: 3e 61 70 53 63 72 69 70 74 5b 69 5d 29 3b 0a 20  >apScript[i]);. 
56b0: 20 7d 0a 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20   }.  p->zName = 
56c0: 28 63 68 61 72 20 2a 29 26 70 2d 3e 61 70 53 63  (char *)&p->apSc
56d0: 72 69 70 74 5b 6e 53 63 72 69 70 74 2b 54 45 53  ript[nScript+TES
56e0: 54 56 46 53 5f 4d 41 58 5f 41 52 47 53 5d 3b 0a  TVFS_MAX_ARGS];.
56f0: 20 20 73 74 72 63 70 79 28 70 2d 3e 7a 4e 61 6d    strcpy(p->zNam
5700: 65 2c 20 7a 56 66 73 29 3b 0a 0a 20 20 70 56 66  e, zVfs);..  pVf
5710: 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 66 73  s = (sqlite3_vfs
5720: 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f   *)ckalloc(sizeo
5730: 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
5740: 0a 20 20 6d 65 6d 63 70 79 28 70 56 66 73 2c 20  .  memcpy(pVfs, 
5750: 26 74 76 66 73 5f 76 66 73 2c 20 73 69 7a 65 6f  &tvfs_vfs, sizeo
5760: 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
5770: 0a 20 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  .  pVfs->pAppDat
5780: 61 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20  a = (void *)p;. 
5790: 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 20 3d 20 70   pVfs->zName = p
57a0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 56 66 73 2d  ->zName;.  pVfs-
57b0: 3e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 70 2d  >mxPathname = p-
57c0: 3e 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68  >pParent->mxPath
57d0: 6e 61 6d 65 3b 0a 20 20 70 56 66 73 2d 3e 73 7a  name;.  pVfs->sz
57e0: 4f 73 46 69 6c 65 20 2b 3d 20 70 2d 3e 70 50 61  OsFile += p->pPa
57f0: 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a  rent->szOsFile;.
5800: 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 56 66 73    p->pVfs = pVfs
5810: 3b 0a 20 20 69 66 28 20 69 73 4e 6f 73 68 6d 20  ;.  if( isNoshm 
5820: 29 7b 0a 20 20 20 20 70 56 66 73 2d 3e 78 53 68  ){.    pVfs->xSh
5830: 6d 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 70  mOpen = 0;.    p
5840: 56 66 73 2d 3e 78 53 68 6d 47 65 74 20 3d 20 30  Vfs->xShmGet = 0
5850: 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78 53 68 6d  ;.    pVfs->xShm
5860: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 56  Size = 0;.    pV
5870: 66 73 2d 3e 78 53 68 6d 52 65 6c 65 61 73 65 20  fs->xShmRelease 
5880: 3d 20 30 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78  = 0;.    pVfs->x
5890: 53 68 6d 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20  ShmClose = 0;.  
58a0: 20 20 70 56 66 73 2d 3e 78 53 68 6d 4c 6f 63 6b    pVfs->xShmLock
58b0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c   = 0;.  }..  Tcl
58c0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
58d0: 64 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 2c 20  d(interp, zVfs, 
58e0: 74 65 73 74 76 66 73 5f 6f 62 6a 5f 63 6d 64 2c  testvfs_obj_cmd,
58f0: 20 70 2c 20 74 65 73 74 76 66 73 5f 6f 62 6a 5f   p, testvfs_obj_
5900: 64 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  del);.  sqlite3_
5910: 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 56 66  vfs_register(pVf
5920: 73 2c 20 30 29 3b 0a 0a 20 20 72 65 74 75 72 6e  s, 0);..  return
5930: 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 62 61 64 5f 61   TCL_OK;.. bad_a
5940: 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67  rgs:.  Tcl_Wrong
5950: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
5960: 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6e 6f 73 68  1, objv, "?-nosh
5970: 6d 3f 20 56 46 53 4e 41 4d 45 20 53 43 52 49 50  m? VFSNAME SCRIP
5980: 54 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  T");.  return TC
5990: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 23 65 6e 64 69  L_ERROR;.}.#endi
59a0: 66 20 2f 2a 20 30 20 2a 2f 0a 0a 69 6e 74 20 53  f /* 0 */..int S
59b0: 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
59c0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
59d0: 74 65 72 70 29 7b 0a 20 20 2f 2a 20 54 63 6c 5f  terp){.  /* Tcl_
59e0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
59f0: 28 69 6e 74 65 72 70 2c 20 22 74 65 73 74 76 66  (interp, "testvf
5a00: 73 22 2c 20 74 65 73 74 76 66 73 5f 63 6d 64 2c  s", testvfs_cmd,
5a10: 20 30 2c 20 30 29 3b 20 2a 2f 0a 20 20 72 65 74   0, 0); */.  ret
5a20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
5a30: 65 6e 64 69 66 0a                                endif.