SQLite
Hex Artifact Content
Not logged in

Artifact e5225bc22e79dde6b28380f3a068ddf600683a33:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 39 2d 30 37  /*.** 2016-09-07
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
0190: 72 65 61 64 2d 6f 6e 6c 79 20 56 46 53 20 69 6d  read-only VFS im
01a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
01b0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 2a  he application.*
01c0: 2a 20 73 75 70 70 6c 69 65 73 20 61 20 62 6c 6f  * supplies a blo
01d0: 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 77 68 69  ck of memory whi
01e0: 63 68 20 69 73 20 74 68 65 20 64 61 74 61 62 61  ch is the databa
01f0: 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 69  se file, and thi
0200: 73 20 56 46 53 0a 2a 2a 20 75 73 65 73 20 74 68  s VFS.** uses th
0210: 61 74 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  at block of memo
0220: 72 79 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73  ry..**.** Becaus
0230: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6c  e there is no pl
0240: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 6a 6f 75  ace to store jou
0250: 72 6e 61 6c 73 20 61 6e 64 20 6e 6f 20 67 6f 6f  rnals and no goo
0260: 64 20 77 61 79 20 74 6f 20 6c 6f 63 6b 0a 2a 2a  d way to lock.**
0270: 20 74 68 65 20 22 66 69 6c 65 22 2c 20 74 68 69   the "file", thi
0280: 73 20 56 46 53 20 69 73 20 72 65 61 64 2d 6f 6e  s VFS is read-on
0290: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a  ly..**.** USAGE:
02a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
02b0: 33 5f 6f 70 65 6e 5f 76 32 28 22 66 69 6c 65 3a  3_open_v2("file:
02c0: 2f 77 68 61 74 65 76 65 72 3f 70 74 72 3d 30 78  /whatever?ptr=0x
02d0: 66 30 35 35 33 38 26 73 7a 3d 31 34 33 33 36 22  f05538&sz=14336"
02e0: 2c 20 26 64 62 2c 0a 2a 2a 20 20 20 20 20 20 20  , &db,.**       
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
0300: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
0310: 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
0320: 55 52 49 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  URI,.**         
0330: 20 20 20 20 20 20 20 20 20 20 20 22 6d 65 6d 76             "memv
0340: 66 73 22 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fs");.**.** The 
0350: 70 74 72 3d 20 61 6e 64 20 73 7a 3d 20 71 75 65  ptr= and sz= que
0360: 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ry parameters ar
0370: 65 20 72 65 71 75 69 72 65 64 20 6f 72 20 74 68  e required or th
0380: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
0390: 2e 0a 2a 2a 20 54 68 65 20 70 74 72 3d 20 70 61  ..** The ptr= pa
03a0: 72 61 6d 65 74 65 72 20 67 69 76 65 73 20 74 68  rameter gives th
03b0: 65 20 6d 65 6d 6f 72 79 20 61 64 64 72 65 73 73  e memory address
03c0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 68   of the buffer h
03d0: 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  olding the.** re
03e0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
03f0: 20 61 6e 64 20 73 7a 3d 20 67 69 76 65 73 20 74   and sz= gives t
0400: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
0410: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 70 61  atabase.  The pa
0420: 72 61 6d 65 74 65 72 0a 2a 2a 20 76 61 6c 75 65  rameter.** value
0430: 73 20 6d 61 79 20 62 65 20 69 6e 20 68 65 78 61  s may be in hexa
0440: 64 65 63 69 6d 61 6c 20 6f 72 20 64 65 63 69 6d  decimal or decim
0450: 61 6c 2e 20 20 54 68 65 20 66 69 6c 65 6e 61 6d  al.  The filenam
0460: 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  e is ignored..*/
0470: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74  .#include <sqlit
0480: 65 33 65 78 74 2e 68 3e 0a 53 51 4c 49 54 45 5f  e3ext.h>.SQLITE_
0490: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
04a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
04b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
04c0: 73 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20  sert.h>.../*.** 
04d0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
04e0: 69 6f 6e 20 6f 66 20 6f 62 6a 65 63 74 73 20 75  ion of objects u
04f0: 73 65 64 20 62 79 20 74 68 69 73 20 75 74 69 6c  sed by this util
0500: 69 74 79 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ity.*/.typedef s
0510: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 76 66  truct sqlite3_vf
0520: 73 20 4d 65 6d 56 66 73 3b 0a 74 79 70 65 64 65  s MemVfs;.typede
0530: 66 20 73 74 72 75 63 74 20 4d 65 6d 46 69 6c 65  f struct MemFile
0540: 20 4d 65 6d 46 69 6c 65 3b 0a 0a 2f 2a 20 41 63   MemFile;../* Ac
0550: 63 65 73 73 20 74 6f 20 61 20 6c 6f 77 65 72 2d  cess to a lower-
0560: 6c 65 76 65 6c 20 56 46 53 20 74 68 61 74 20 28  level VFS that (
0570: 6d 69 67 68 74 29 20 69 6d 70 6c 65 6d 65 6e 74  might) implement
0580: 20 64 79 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67   dynamic loading
0590: 2c 0a 2a 2a 20 61 63 63 65 73 73 20 74 6f 20 72  ,.** access to r
05a0: 61 6e 64 6f 6d 6e 65 73 73 2c 20 65 74 63 2e 0a  andomness, etc..
05b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 52 49 47 56  */.#define ORIGV
05c0: 46 53 28 70 29 20 28 28 73 71 6c 69 74 65 33 5f  FS(p) ((sqlite3_
05d0: 76 66 73 2a 29 28 28 70 29 2d 3e 70 41 70 70 44  vfs*)((p)->pAppD
05e0: 61 74 61 29 29 0a 0a 2f 2a 20 41 6e 20 6f 70 65  ata))../* An ope
05f0: 6e 20 66 69 6c 65 20 2a 2f 0a 73 74 72 75 63 74  n file */.struct
0600: 20 4d 65 6d 46 69 6c 65 20 7b 0a 20 20 73 71 6c   MemFile {.  sql
0610: 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b 20  ite3_file base; 
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0630: 49 4f 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20  IO methods */.  
0640: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
0650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0660: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
0670: 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ile */.  unsigne
0680: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20  d char *aData;  
0690: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
06a0: 65 6e 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ent of the file 
06b0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74  */.};../*.** Met
06c0: 68 6f 64 73 20 66 6f 72 20 4d 65 6d 46 69 6c 65  hods for MemFile
06d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
06e0: 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  emClose(sqlite3_
06f0: 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
0700: 6e 74 20 6d 65 6d 52 65 61 64 28 73 71 6c 69 74  nt memRead(sqlit
0710: 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c  e3_file*, void*,
0720: 20 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74   int iAmt, sqlit
0730: 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b  e3_int64 iOfst);
0740: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 57  .static int memW
0750: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  rite(sqlite3_fil
0760: 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  e*,const void*,i
0770: 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33  nt iAmt, sqlite3
0780: 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73  _int64 iOfst);.s
0790: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 54 72 75  tatic int memTru
07a0: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
07b0: 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  le*, sqlite3_int
07c0: 36 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69 63  64 size);.static
07d0: 20 69 6e 74 20 6d 65 6d 53 79 6e 63 28 73 71 6c   int memSync(sql
07e0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
07f0: 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69  flags);.static i
0800: 6e 74 20 6d 65 6d 46 69 6c 65 53 69 7a 65 28 73  nt memFileSize(s
0810: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71  qlite3_file*, sq
0820: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
0830: 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ze);.static int 
0840: 6d 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  memLock(sqlite3_
0850: 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
0860: 74 69 63 20 69 6e 74 20 6d 65 6d 55 6e 6c 6f 63  tic int memUnloc
0870: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
0880: 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
0890: 74 20 6d 65 6d 43 68 65 63 6b 52 65 73 65 72 76  t memCheckReserv
08a0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
08b0: 69 6c 65 2a 2c 20 69 6e 74 20 2a 70 52 65 73 4f  ile*, int *pResO
08c0: 75 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ut);.static int 
08d0: 6d 65 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  memFileControl(s
08e0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
08f0: 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
0900: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  );.static int me
0910: 6d 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  mSectorSize(sqli
0920: 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
0930: 69 63 20 69 6e 74 20 6d 65 6d 44 65 76 69 63 65  ic int memDevice
0940: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
0950: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
0960: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 68  static int memSh
0970: 6d 4d 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c  mMap(sqlite3_fil
0980: 65 2a 2c 20 69 6e 74 20 69 50 67 2c 20 69 6e 74  e*, int iPg, int
0990: 20 70 67 73 7a 2c 20 69 6e 74 2c 20 76 6f 69 64   pgsz, int, void
09a0: 20 76 6f 6c 61 74 69 6c 65 2a 2a 29 3b 0a 73 74   volatile**);.st
09b0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 68 6d 4c  atic int memShmL
09c0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
09d0: 2a 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69  *, int offset, i
09e0: 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29  nt n, int flags)
09f0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  ;.static void me
0a00: 6d 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69  mShmBarrier(sqli
0a10: 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
0a20: 69 63 20 69 6e 74 20 6d 65 6d 53 68 6d 55 6e 6d  ic int memShmUnm
0a30: 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ap(sqlite3_file*
0a40: 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
0a50: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  );.static int me
0a60: 6d 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  mFetch(sqlite3_f
0a70: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
0a80: 74 36 34 20 69 4f 66 73 74 2c 20 69 6e 74 20 69  t64 iOfst, int i
0a90: 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 3b  Amt, void **pp);
0aa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 55  .static int memU
0ab0: 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
0ac0: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
0ad0: 74 36 34 20 69 4f 66 73 74 2c 20 76 6f 69 64 20  t64 iOfst, void 
0ae0: 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68  *p);../*.** Meth
0af0: 6f 64 73 20 66 6f 72 20 4d 65 6d 56 66 73 0a 2a  ods for MemVfs.*
0b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
0b10: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
0b20: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
0b30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20   sqlite3_file*, 
0b40: 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74  int , int *);.st
0b50: 61 74 69 63 20 69 6e 74 20 6d 65 6d 44 65 6c 65  atic int memDele
0b60: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  te(sqlite3_vfs*,
0b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0b80: 6d 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29  me, int syncDir)
0b90: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  ;.static int mem
0ba0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76  Access(sqlite3_v
0bb0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
0bc0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
0bd0: 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69  s, int *);.stati
0be0: 63 20 69 6e 74 20 6d 65 6d 46 75 6c 6c 50 61 74  c int memFullPat
0bf0: 68 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  hname(sqlite3_vf
0c00: 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  s*, const char *
0c10: 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20 63 68 61 72  zName, int, char
0c20: 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20   *zOut);.static 
0c30: 76 6f 69 64 20 2a 6d 65 6d 44 6c 4f 70 65 6e 28  void *memDlOpen(
0c40: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
0c50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0c60: 61 6d 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ame);.static voi
0c70: 64 20 6d 65 6d 44 6c 45 72 72 6f 72 28 73 71 6c  d memDlError(sql
0c80: 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e  ite3_vfs*, int n
0c90: 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72  Byte, char *zErr
0ca0: 4d 73 67 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  Msg);.static voi
0cb0: 64 20 28 2a 6d 65 6d 44 6c 53 79 6d 28 73 71 6c  d (*memDlSym(sql
0cc0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
0cd0: 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
0ce0: 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  har*zSym))(void)
0cf0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  ;.static void me
0d00: 6d 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  mDlClose(sqlite3
0d10: 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73  _vfs*, void*);.s
0d20: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 52 61 6e  tatic int memRan
0d30: 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
0d40: 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c  vfs*, int nByte,
0d50: 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74   char *zOut);.st
0d60: 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 6c 65 65  atic int memSlee
0d70: 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  p(sqlite3_vfs*, 
0d80: 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
0d90: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  );.static int me
0da0: 6d 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  mCurrentTime(sql
0db0: 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75 62 6c  ite3_vfs*, doubl
0dc0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
0dd0: 6d 65 6d 47 65 74 4c 61 73 74 45 72 72 6f 72 28  memGetLastError(
0de0: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e  sqlite3_vfs*, in
0df0: 74 2c 20 63 68 61 72 20 2a 29 3b 0a 73 74 61 74  t, char *);.stat
0e00: 69 63 20 69 6e 74 20 6d 65 6d 43 75 72 72 65 6e  ic int memCurren
0e10: 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
0e20: 65 33 5f 76 66 73 2a 2c 20 73 71 6c 69 74 65 33  e3_vfs*, sqlite3
0e30: 5f 69 6e 74 36 34 2a 29 3b 0a 0a 73 74 61 74 69  _int64*);..stati
0e40: 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  c sqlite3_vfs me
0e50: 6d 5f 76 66 73 20 3d 20 7b 0a 20 20 32 2c 20 20  m_vfs = {.  2,  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
0e80: 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
0eb0: 6c 65 20 28 73 65 74 20 77 68 65 6e 20 72 65 67  le (set when reg
0ec0: 69 73 74 65 72 65 64 29 20 2a 2f 0a 20 20 31 30  istered) */.  10
0ed0: 32 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  24,             
0ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78             /* mx
0ef0: 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c  Pathname */.  0,
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
0f20: 65 78 74 20 2a 2f 0a 20 20 22 6d 65 6d 76 66 73  ext */.  "memvfs
0f30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
0f40: 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
0f50: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 20 2f 2a 20 70 41 70 70 44 61 74 61 20 28 73 65   /* pAppData (se
0f80: 74 20 77 68 65 6e 20 72 65 67 69 73 74 65 72 65  t when registere
0f90: 64 29 20 2a 2f 20 0a 20 20 6d 65 6d 4f 70 65 6e  d) */ .  memOpen
0fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0fb0: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
0fc0: 2f 0a 20 20 6d 65 6d 44 65 6c 65 74 65 2c 20 20  /.  memDelete,  
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
0ff0: 20 6d 65 6d 41 63 63 65 73 73 2c 20 20 20 20 20   memAccess,     
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1010: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 6d 65   xAccess */.  me
1020: 6d 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  mFullPathname,  
1030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1040: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
1050: 20 6d 65 6d 44 6c 4f 70 65 6e 2c 20 20 20 20 20   memDlOpen,     
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1070: 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 6d 65   xDlOpen */.  me
1080: 6d 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  mDlError,       
1090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
10a0: 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 6d 65 6d 44  lError */.  memD
10b0: 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
10c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
10d0: 79 6d 20 2a 2f 0a 20 20 6d 65 6d 44 6c 43 6c 6f  ym */.  memDlClo
10e0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
10f0: 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
1100: 20 2a 2f 0a 20 20 6d 65 6d 52 61 6e 64 6f 6d 6e   */.  memRandomn
1110: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
1120: 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
1130: 73 20 2a 2f 0a 20 20 6d 65 6d 53 6c 65 65 70 2c  s */.  memSleep,
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
1160: 0a 20 20 6d 65 6d 43 75 72 72 65 6e 74 54 69 6d  .  memCurrentTim
1170: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1180: 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
1190: 2a 2f 0a 20 20 6d 65 6d 47 65 74 4c 61 73 74 45  */.  memGetLastE
11a0: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
11b0: 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
11c0: 6f 72 20 2a 2f 0a 20 20 6d 65 6d 43 75 72 72 65  or */.  memCurre
11d0: 6e 74 54 69 6d 65 49 6e 74 36 34 20 20 20 20 20  ntTimeInt64     
11e0: 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
11f0: 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 7d 3b 0a  TimeInt64 */.};.
1200: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1210: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1220: 20 6d 65 6d 5f 69 6f 5f 6d 65 74 68 6f 64 73 20   mem_io_methods 
1230: 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20  = {.  3,        
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1260: 6e 20 2a 2f 0a 20 20 6d 65 6d 43 6c 6f 73 65 2c  n */.  memClose,
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1290: 2a 2f 0a 20 20 6d 65 6d 52 65 61 64 2c 20 20 20  */.  memRead,   
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
12c0: 20 20 6d 65 6d 57 72 69 74 65 2c 20 20 20 20 20    memWrite,     
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
12f0: 6d 65 6d 54 72 75 6e 63 61 74 65 2c 20 20 20 20  memTruncate,    
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1310: 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
1320: 20 6d 65 6d 53 79 6e 63 2c 20 20 20 20 20 20 20   memSync,       
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 6d 65  /* xSync */.  me
1350: 6d 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  mFileSize,      
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1370: 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 6d  xFileSize */.  m
1380: 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a0: 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 55   xLock */.  memU
13b0: 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
13c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
13d0: 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 43 68  nlock */.  memCh
13e0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
13f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
1400: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1410: 2a 2f 0a 20 20 6d 65 6d 46 69 6c 65 43 6f 6e 74  */.  memFileCont
1420: 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
1430: 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1440: 72 6f 6c 20 2a 2f 0a 20 20 6d 65 6d 53 65 63 74  rol */.  memSect
1450: 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
1460: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
1470: 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 6d 65 6d 44  orSize */.  memD
1480: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1490: 74 69 63 73 2c 20 20 20 20 20 20 2f 2a 20 78 44  tics,      /* xD
14a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
14b0: 74 69 63 73 20 2a 2f 0a 20 20 6d 65 6d 53 68 6d  tics */.  memShm
14c0: 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
14d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
14e0: 4d 61 70 20 2a 2f 0a 20 20 6d 65 6d 53 68 6d 4c  Map */.  memShmL
14f0: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1500: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
1510: 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 53 68 6d 42  ock */.  memShmB
1520: 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
1530: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1540: 61 72 72 69 65 72 20 2a 2f 0a 20 20 6d 65 6d 53  arrier */.  memS
1550: 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
1560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1570: 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 6d 65 6d  hmUnmap */.  mem
1580: 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
1590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15a0: 46 65 74 63 68 20 2a 2f 0a 20 20 6d 65 6d 55 6e  Fetch */.  memUn
15b0: 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20  fetch           
15c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
15d0: 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 0a 0a 2f  fetch */.};..../
15e0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6d 65  *.** Close an me
15f0: 6d 2d 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  m-file..**.** Th
1600: 65 20 70 44 61 74 61 20 70 6f 69 6e 74 65 72 20  e pData pointer 
1610: 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
1620: 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 73 6f 20  application, so 
1630: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
1640: 0a 2a 2a 20 74 6f 20 66 72 65 65 2e 0a 2a 2f 0a  .** to free..*/.
1650: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 43 6c  static int memCl
1660: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
1670: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65 74 75   *pFile){.  retu
1680: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1690: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
16a0: 20 66 72 6f 6d 20 61 6e 20 6d 65 6d 2d 66 69 6c   from an mem-fil
16b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16c0: 20 6d 65 6d 52 65 61 64 28 0a 20 20 73 71 6c 69   memRead(.  sqli
16d0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
16e0: 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20   .  void *zBuf, 
16f0: 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20  .  int iAmt, .  
1700: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
1710: 73 74 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20  st.){.  MemFile 
1720: 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29  *p = (MemFile *)
1730: 70 46 69 6c 65 3b 0a 20 20 6d 65 6d 63 70 79 28  pFile;.  memcpy(
1740: 7a 42 75 66 2c 20 70 2d 3e 61 44 61 74 61 2b 69  zBuf, p->aData+i
1750: 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 72  Ofst, iAmt);.  r
1760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1780: 64 61 74 61 20 74 6f 20 61 6e 20 6d 65 6d 2d 66  data to an mem-f
1790: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
17a0: 6e 74 20 6d 65 6d 57 72 69 74 65 28 0a 20 20 73  nt memWrite(.  s
17b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
17c0: 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  le,.  const void
17d0: 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c   *z,.  int iAmt,
17e0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
17f0: 69 4f 66 73 74 0a 29 7b 0a 20 20 72 65 74 75 72  iOfst.){.  retur
1800: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1810: 59 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  Y;.}../*.** Trun
1820: 63 61 74 65 20 61 6e 20 6d 65 6d 2d 66 69 6c 65  cate an mem-file
1830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1840: 6d 65 6d 54 72 75 6e 63 61 74 65 28 73 71 6c 69  memTruncate(sqli
1850: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1860: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
1870: 7a 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  ze){.  return SQ
1880: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 7d  LITE_READONLY;.}
1890: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20  ../*.** Sync an 
18a0: 6d 65 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  mem-file..*/.sta
18b0: 74 69 63 20 69 6e 74 20 6d 65 6d 53 79 6e 63 28  tic int memSync(
18c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
18d0: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ile, int flags){
18e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18f0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 0a 2f 2a  _READONLY;.}../*
1900: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1910: 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65  urrent file-size
1920: 20 6f 66 20 61 6e 20 6d 65 6d 2d 66 69 6c 65 2e   of an mem-file.
1930: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1940: 65 6d 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  emFileSize(sqlit
1950: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1960: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53  sqlite_int64 *pS
1970: 69 7a 65 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20  ize){.  MemFile 
1980: 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29  *p = (MemFile *)
1990: 70 46 69 6c 65 3b 0a 20 20 2a 70 53 69 7a 65 20  pFile;.  *pSize 
19a0: 3d 20 70 2d 3e 73 7a 3b 0a 20 20 72 65 74 75 72  = p->sz;.  retur
19b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19c0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 6d 65  /*.** Lock an me
19d0: 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  m-file..*/.stati
19e0: 63 20 69 6e 74 20 6d 65 6d 4c 6f 63 6b 28 73 71  c int memLock(sq
19f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a00: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
1a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1a20: 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 0a 2f 2a 0a 2a  EADONLY;.}../*.*
1a30: 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 6d 65 6d 2d  * Unlock an mem-
1a40: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1a50: 69 6e 74 20 6d 65 6d 55 6e 6c 6f 63 6b 28 73 71  int memUnlock(sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a70: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
1a80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  K;.}../*.** Chec
1aa0: 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
1ab0: 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
1ac0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1ad0: 6e 20 61 6e 20 6d 65 6d 2d 66 69 6c 65 2e 0a 2a  n an mem-file..*
1ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
1af0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1b00: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1b10: 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73  pFile, int *pRes
1b20: 4f 75 74 29 7b 0a 20 20 2a 70 52 65 73 4f 75 74  Out){.  *pResOut
1b30: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1b40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b50: 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20  ** File control 
1b60: 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74  method. For cust
1b70: 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  om operations on
1b80: 20 61 6e 20 6d 65 6d 2d 66 69 6c 65 2e 0a 2a 2f   an mem-file..*/
1b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 46  .static int memF
1ba0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1bb0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1bc0: 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1bd0: 72 67 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a  rg){.  MemFile *
1be0: 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70  p = (MemFile *)p
1bf0: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
1c00: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1c10: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
1c20: 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
1c30: 20 29 7b 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a   ){.    *(char**
1c40: 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
1c50: 6d 70 72 69 6e 74 66 28 22 6d 65 6d 28 25 70 2c  mprintf("mem(%p,
1c60: 25 6c 6c 64 29 22 2c 20 70 2d 3e 61 44 61 74 61  %lld)", p->aData
1c70: 2c 20 70 2d 3e 73 7a 29 3b 0a 20 20 20 20 72 63  , p->sz);.    rc
1c80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ca0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cb0: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
1cc0: 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 6d  n bytes for an m
1cd0: 65 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  em-file..*/.stat
1ce0: 69 63 20 69 6e 74 20 6d 65 6d 53 65 63 74 6f 72  ic int memSector
1cf0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1d00: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65 74  e *pFile){.  ret
1d10: 75 72 6e 20 31 30 32 34 3b 0a 7d 0a 0a 2f 2a 0a  urn 1024;.}../*.
1d20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1d30: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1d40: 74 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72  tic flags suppor
1d50: 74 65 64 20 62 79 20 61 6e 20 6d 65 6d 2d 66 69  ted by an mem-fi
1d60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1d70: 74 20 6d 65 6d 44 65 76 69 63 65 43 68 61 72 61  t memDeviceChara
1d80: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1d90: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1da0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1db0: 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45  _IOCAP_IMMUTABLE
1dc0: 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61  ;.}../* Create a
1dd0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66   shared memory f
1de0: 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 73  ile mapping */.s
1df0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 68 6d  tatic int memShm
1e00: 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
1e10: 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e  ile *pFile,.  in
1e20: 74 20 69 50 67 2c 0a 20 20 69 6e 74 20 70 67 73  t iPg,.  int pgs
1e30: 7a 2c 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  z,.  int bExtend
1e40: 2c 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  ,.  void volatil
1e50: 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 72 65 74 75  e **pp.){.  retu
1e60: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1e70: 4c 59 3b 0a 7d 0a 0a 2f 2a 20 50 65 72 66 6f 72  LY;.}../* Perfor
1e80: 6d 20 6c 6f 63 6b 69 6e 67 20 6f 6e 20 61 20 73  m locking on a s
1e90: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1ea0: 6d 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 69  ment */.static i
1eb0: 6e 74 20 6d 65 6d 53 68 6d 4c 6f 63 6b 28 73 71  nt memShmLock(sq
1ec0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1ed0: 65 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69  e, int offset, i
1ee0: 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29  nt n, int flags)
1ef0: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
1f00: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 0a 2f  E_READONLY;.}../
1f10: 2a 20 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  * Memory barrier
1f20: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 73 68   operation on sh
1f30: 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 73  ared memory */.s
1f40: 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 53 68  tatic void memSh
1f50: 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74 65 33  mBarrier(sqlite3
1f60: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1f70: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 55   return;.}../* U
1f80: 6e 6d 61 70 20 61 20 73 68 61 72 65 64 20 6d 65  nmap a shared me
1f90: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
1fa0: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 68  static int memSh
1fb0: 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66  mUnmap(sqlite3_f
1fc0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
1fd0: 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 72  deleteFlag){.  r
1fe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ff0: 0a 7d 0a 0a 2f 2a 20 46 65 74 63 68 20 61 20 70  .}../* Fetch a p
2000: 61 67 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 2d  age of a memory-
2010: 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 73  mapped file */.s
2020: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 46 65 74  tatic int memFet
2030: 63 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ch(.  sqlite3_fi
2040: 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 73 71 6c  le *pFile,.  sql
2050: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
2060: 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20  ,.  int iAmt,.  
2070: 76 6f 69 64 20 2a 2a 70 70 0a 29 7b 0a 20 20 4d  void **pp.){.  M
2080: 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d  emFile *p = (Mem
2090: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
20a0: 2a 70 70 20 3d 20 28 76 6f 69 64 2a 29 28 70 2d  *pp = (void*)(p-
20b0: 3e 61 44 61 74 61 20 2b 20 69 4f 66 73 74 29 3b  >aData + iOfst);
20c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 6c 65 61  _OK;.}../* Relea
20e0: 73 65 20 61 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  se a memory-mapp
20f0: 65 64 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69  ed page */.stati
2100: 63 20 69 6e 74 20 6d 65 6d 55 6e 66 65 74 63 68  c int memUnfetch
2110: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2120: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
2130: 74 36 34 20 69 4f 66 73 74 2c 20 76 6f 69 64 20  t64 iOfst, void 
2140: 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
2150: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2160: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 6d 65  /*.** Open an me
2170: 6d 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  m file handle..*
2180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
2190: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
21a0: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
21b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
21c0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21d0: 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61  pFile,.  int fla
21e0: 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46  gs,.  int *pOutF
21f0: 6c 61 67 73 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c  lags.){.  MemFil
2200: 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 2a  e *p = (MemFile*
2210: 29 70 46 69 6c 65 3b 0a 20 20 6d 65 6d 73 65 74  )pFile;.  memset
2220: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
2230: 29 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73  ));.  if( (flags
2240: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
2250: 41 49 4e 5f 44 42 29 3d 3d 30 20 29 20 72 65 74  AIN_DB)==0 ) ret
2260: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2270: 50 45 4e 3b 0a 20 20 70 2d 3e 61 44 61 74 61 20  PEN;.  p->aData 
2280: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2290: 2a 29 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  *)sqlite3_uri_in
22a0: 74 36 34 28 7a 4e 61 6d 65 2c 22 70 74 72 22 2c  t64(zName,"ptr",
22b0: 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 44 61  0);.  if( p->aDa
22c0: 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ta==0 ) return S
22d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
22e0: 20 20 70 2d 3e 73 7a 20 3d 20 73 71 6c 69 74 65    p->sz = sqlite
22f0: 33 5f 75 72 69 5f 69 6e 74 36 34 28 7a 4e 61 6d  3_uri_int64(zNam
2300: 65 2c 22 73 7a 22 2c 30 29 3b 0a 20 20 69 66 28  e,"sz",0);.  if(
2310: 20 70 2d 3e 73 7a 3c 30 20 29 20 72 65 74 75 72   p->sz<0 ) retur
2320: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
2330: 4e 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  N;.  pFile->pMet
2340: 68 6f 64 73 20 3d 20 26 6d 65 6d 5f 69 6f 5f 6d  hods = &mem_io_m
2350: 65 74 68 6f 64 73 3b 0a 20 20 72 65 74 75 72 6e  ethods;.  return
2360: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2370: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2380: 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20  file located at 
2390: 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
23a0: 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
23b0: 73 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72  s true,.** ensur
23c0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
23d0: 6d 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  m modifications 
23e0: 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69  are synced to di
23f0: 73 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  sk before.** ret
2400: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
2410: 63 20 69 6e 74 20 6d 65 6d 44 65 6c 65 74 65 28  c int memDelete(
2420: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2430: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
2440: 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e  Path, int dirSyn
2450: 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  c){.  return SQL
2460: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 7d 0a  ITE_READONLY;.}.
2470: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
2480: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
2490: 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
24a0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
24b0: 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
24c0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
24d0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
24e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
24f0: 65 6d 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  emAccess(.  sqli
2500: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
2510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2520: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67  ath, .  int flag
2530: 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f  s, .  int *pResO
2540: 75 74 0a 29 7b 0a 20 20 2f 2a 20 54 68 65 20 73  ut.){.  /* The s
2550: 70 65 63 20 73 61 79 73 20 74 68 65 72 65 20 61  pec says there a
2560: 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c  re three possibl
2570: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66 6c 61  e values for fla
2580: 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20 20  gs.  But only.  
2590: 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d 20 61  ** two of them a
25a0: 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  re actually used
25b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c   */.  assert( fl
25c0: 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
25d0: 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66 6c 61  SS_EXISTS || fla
25e0: 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
25f0: 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b 0a 20  S_READWRITE );. 
2600: 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
2610: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
2620: 49 54 45 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ITE ){.    *pRes
2630: 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Out = 0;.  }else
2640: 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
2650: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2670: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75  *.** Populate bu
2680: 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74  ffer zOut with t
2690: 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61  he full canonica
26a0: 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65  l pathname corre
26b0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74  sponding.** to t
26c0: 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a  he pathname in z
26d0: 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75  Path. zOut is gu
26e0: 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e  aranteed to poin
26f0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a  t to a buffer.**
2700: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 49 4e   of at least (IN
2710: 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  ST_MAX_PATHNAME+
2720: 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  1) bytes..*/.sta
2730: 74 69 63 20 69 6e 74 20 6d 65 6d 46 75 6c 6c 50  tic int memFullP
2740: 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
2750: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
2760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2770: 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  th, .  int nOut,
2780: 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29   .  char *zOut.)
2790: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
27a0: 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
27b0: 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
27c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
27e0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
27f0: 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20  rary located at 
2800: 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e  zPath and return
2810: 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74   a handle..*/.st
2820: 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 44 6c  atic void *memDl
2830: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
2840: 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
2850: 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65  ar *zPath){.  re
2860: 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66  turn ORIGVFS(pVf
2870: 73 29 2d 3e 78 44 6c 4f 70 65 6e 28 4f 52 49 47  s)->xDlOpen(ORIG
2880: 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68  VFS(pVfs), zPath
2890: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  );.}../*.** Popu
28a0: 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
28b0: 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42  zErrMsg (size nB
28c0: 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68 20  yte bytes) with 
28d0: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
28e0: 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67  .** utf-8 string
28f0: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
2900: 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
2910: 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73  r encountered as
2920: 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
2930: 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  h dynamic librar
2940: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
2950: 6f 69 64 20 6d 65 6d 44 6c 45 72 72 6f 72 28 73  oid memDlError(s
2960: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2970: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
2980: 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 4f  r *zErrMsg){.  O
2990: 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 44  RIGVFS(pVfs)->xD
29a0: 6c 45 72 72 6f 72 28 4f 52 49 47 56 46 53 28 70  lError(ORIGVFS(p
29b0: 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45 72  Vfs), nByte, zEr
29c0: 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rMsg);.}../*.** 
29d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
29e0: 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a   to the symbol z
29f0: 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79  Symbol in the dy
2a00: 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48  namic library pH
2a10: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
2a20: 20 76 6f 69 64 20 28 2a 6d 65 6d 44 6c 53 79 6d   void (*memDlSym
2a30: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2a40: 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  fs, void *p, con
2a50: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28  st char *zSym))(
2a60: 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
2a70: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
2a80: 44 6c 53 79 6d 28 4f 52 49 47 56 46 53 28 70 56  DlSym(ORIGVFS(pV
2a90: 66 73 29 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d  fs), p, zSym);.}
2aa0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
2ab0: 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
2ac0: 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65  y handle pHandle
2ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ae0: 20 6d 65 6d 44 6c 43 6c 6f 73 65 28 73 71 6c 69   memDlClose(sqli
2af0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
2b00: 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
2b10: 20 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e   ORIGVFS(pVfs)->
2b20: 78 44 6c 43 6c 6f 73 65 28 4f 52 49 47 56 46 53  xDlClose(ORIGVFS
2b30: 28 70 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 29  (pVfs), pHandle)
2b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
2b50: 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70  ate the buffer p
2b60: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75  ointed to by zBu
2b70: 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20  fOut with nByte 
2b80: 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e  bytes of .** ran
2b90: 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  dom data..*/.sta
2ba0: 74 69 63 20 69 6e 74 20 6d 65 6d 52 61 6e 64 6f  tic int memRando
2bb0: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
2bc0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
2bd0: 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
2be0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49  t){.  return ORI
2bf0: 47 56 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e  GVFS(pVfs)->xRan
2c00: 64 6f 6d 6e 65 73 73 28 4f 52 49 47 56 46 53 28  domness(ORIGVFS(
2c10: 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42  pVfs), nByte, zB
2c20: 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
2c30: 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
2c40: 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
2c50: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2c60: 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
2c70: 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
2c80: 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
2c90: 69 6e 74 20 6d 65 6d 53 6c 65 65 70 28 73 71 6c  int memSleep(sql
2ca0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2cb0: 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72  int nMicro){.  r
2cc0: 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
2cd0: 66 73 29 2d 3e 78 53 6c 65 65 70 28 4f 52 49 47  fs)->xSleep(ORIG
2ce0: 56 46 53 28 70 56 66 73 29 2c 20 6e 4d 69 63 72  VFS(pVfs), nMicr
2cf0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  o);.}../*.** Ret
2d00: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2d10: 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  time as a Julian
2d20: 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a   Day number in *
2d30: 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61  pTimeOut..*/.sta
2d40: 74 69 63 20 69 6e 74 20 6d 65 6d 43 75 72 72 65  tic int memCurre
2d50: 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2d60: 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
2d70: 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72   *pTimeOut){.  r
2d80: 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
2d90: 66 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  fs)->xCurrentTim
2da0: 65 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c  e(ORIGVFS(pVfs),
2db0: 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 73   pTimeOut);.}..s
2dc0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 47 65 74  tatic int memGet
2dd0: 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
2de0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2df0: 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a 20 20   a, char *b){.  
2e00: 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70  return ORIGVFS(p
2e10: 56 66 73 29 2d 3e 78 47 65 74 4c 61 73 74 45 72  Vfs)->xGetLastEr
2e20: 72 6f 72 28 4f 52 49 47 56 46 53 28 70 56 66 73  ror(ORIGVFS(pVfs
2e30: 29 2c 20 61 2c 20 62 29 3b 0a 7d 0a 73 74 61 74  ), a, b);.}.stat
2e40: 69 63 20 69 6e 74 20 6d 65 6d 43 75 72 72 65 6e  ic int memCurren
2e50: 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2e60: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
2e70: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 29 7b  lite3_int64 *p){
2e80: 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46  .  return ORIGVF
2e90: 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65 6e  S(pVfs)->xCurren
2ea0: 74 54 69 6d 65 49 6e 74 36 34 28 4f 52 49 47 56  tTimeInt64(ORIGV
2eb0: 46 53 28 70 56 66 73 29 2c 20 70 29 3b 0a 7d 0a  FS(pVfs), p);.}.
2ec0: 0a 23 69 66 64 65 66 20 4d 45 4d 56 46 53 5f 54  .#ifdef MEMVFS_T
2ed0: 45 53 54 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 20  EST./*.**       
2ee0: 6d 65 6d 6c 6f 61 64 28 46 49 4c 45 4e 41 4d 45  memload(FILENAME
2ef0: 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6e 20  ).**.** This an 
2f00: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  SQL function use
2f10: 64 20 74 6f 20 68 65 6c 70 20 69 6e 20 74 65 73  d to help in tes
2f20: 74 69 6e 67 20 74 68 65 20 6d 65 6d 76 66 73 20  ting the memvfs 
2f30: 56 46 53 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e  VFS.  The.** fun
2f40: 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
2f50: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c  content of a fil
2f60: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 61 6e  e into memory an
2f70: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 73 0a 2a  d then returns.*
2f80: 2a 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  * a string that 
2f90: 67 69 76 65 73 20 74 68 65 20 6c 6f 63 61 74 65  gives the locate
2fa0: 20 61 6e 64 20 73 69 7a 65 20 6f 66 20 74 68 65   and size of the
2fb0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 62 75 66 66 65   in-memory buffe
2fc0: 72 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  r..*/.#include <
2fd0: 73 74 64 69 6f 2e 68 3e 0a 73 74 61 74 69 63 20  stdio.h>.static 
2fe0: 76 6f 69 64 20 6d 65 6d 76 66 73 4d 65 6d 6c 6f  void memvfsMemlo
2ff0: 61 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  adFunc(.  sqlite
3000: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3010: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
3020: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3030: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69  **argv.){.  unsi
3040: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
3050: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
3060: 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  ;.  FILE *in;.  
3070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
3080: 65 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  ename = (const c
3090: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
30a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
30b0: 3b 0a 20 20 63 68 61 72 20 7a 52 65 74 75 72 6e  ;.  char zReturn
30c0: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 46  [100];..  if( zF
30d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ilename==0 ) ret
30e0: 75 72 6e 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65  urn;.  in = fope
30f0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72 62  n(zFilename, "rb
3100: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
3110: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 73 65 65  ) return;.  fsee
3120: 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
3130: 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c  D);.  sz = ftell
3140: 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
3150: 6e 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  n);.  p = sqlite
3160: 33 5f 6d 61 6c 6c 6f 63 28 20 73 7a 20 29 3b 0a  3_malloc( sz );.
3170: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
3180: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
3190: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31a0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
31b0: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
31c0: 6e 3b 0a 20 20 7d 0a 20 20 66 72 65 61 64 28 70  n;.  }.  fread(p
31d0: 2c 20 73 7a 2c 20 31 2c 20 69 6e 29 3b 0a 20 20  , sz, 1, in);.  
31e0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 73 71  fclose(in);.  sq
31f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3200: 69 7a 65 6f 66 28 7a 52 65 74 75 72 6e 29 2c 7a  izeof(zReturn),z
3210: 52 65 74 75 72 6e 2c 22 70 74 72 3d 25 6c 6c 64  Return,"ptr=%lld
3220: 26 73 7a 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20  &sz=%lld",.     
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
3240: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 2c 20  qlite3_int64)p, 
3250: 73 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  sz);.  sqlite3_r
3260: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
3270: 78 74 2c 20 7a 52 65 74 75 72 6e 2c 20 2d 31 2c  xt, zReturn, -1,
3280: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
3290: 54 29 3b 0a 7d 0a 2f 2a 20 43 61 6c 6c 65 64 20  T);.}./* Called 
32a0: 66 6f 72 20 65 61 63 68 20 6e 65 77 20 64 61 74  for each new dat
32b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
32c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
32d0: 65 6d 76 66 73 52 65 67 69 73 74 65 72 28 0a 20  emvfsRegister(. 
32e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
32f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
3300: 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73  rrMsg,.  const s
3310: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70  truct sqlite3_ap
3320: 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 54 68 75  i_routines *pThu
3330: 6e 6b 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  nk.){.  return s
3340: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3350: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 65 6d 6c  nction(db, "meml
3360: 6f 61 64 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  oad", 1, SQLITE_
3370: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 76 66 73            memvfs
33a0: 4d 65 6d 6c 6f 61 64 46 75 6e 63 2c 20 30 2c 20  MemloadFunc, 0, 
33b0: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
33c0: 4d 45 4d 56 46 53 5f 54 45 53 54 20 2a 2f 0a 0a  MEMVFS_TEST */..
33d0: 20 20 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32    .#ifdef _WIN32
33e0: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
33f0: 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 2f 2a  xport).#endif./*
3400: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
3410: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
3420: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69   the extension i
3430: 73 20 6c 6f 61 64 65 64 2e 0a 2a 2a 20 52 65 67  s loaded..** Reg
3440: 69 73 74 65 72 20 74 68 65 20 6e 65 77 20 56 46  ister the new VF
3450: 53 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  S..*/.int sqlite
3460: 33 5f 6d 65 6d 76 66 73 5f 69 6e 69 74 28 0a 20  3_memvfs_init(. 
3470: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
3480: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
3490: 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
34a0: 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
34b0: 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72  *pApi.){.  int r
34c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34d0: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
34e0: 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20  N_INIT2(pApi);. 
34f0: 20 6d 65 6d 5f 76 66 73 2e 70 41 70 70 44 61 74   mem_vfs.pAppDat
3500: 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  a = sqlite3_vfs_
3510: 66 69 6e 64 28 30 29 3b 0a 20 20 6d 65 6d 5f 76  find(0);.  mem_v
3520: 66 73 2e 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69  fs.szOsFile = si
3530: 7a 65 6f 66 28 4d 65 6d 46 69 6c 65 29 3b 0a 20  zeof(MemFile);. 
3540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66   rc = sqlite3_vf
3550: 73 5f 72 65 67 69 73 74 65 72 28 26 6d 65 6d 5f  s_register(&mem_
3560: 76 66 73 2c 20 31 29 3b 0a 23 69 66 64 65 66 20  vfs, 1);.#ifdef 
3570: 4d 45 4d 56 46 53 5f 54 45 53 54 0a 20 20 69 66  MEMVFS_TEST.  if
3580: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3590: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
35a0: 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69  te3_auto_extensi
35b0: 6f 6e 28 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  on((void(*)(void
35c0: 29 29 6d 65 6d 76 66 73 52 65 67 69 73 74 65 72  ))memvfsRegister
35d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
35e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35f0: 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
3600: 4f 4b 5f 4c 4f 41 44 5f 50 45 52 4d 41 4e 45 4e  OK_LOAD_PERMANEN
3610: 54 4c 59 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  TLY;.  return rc
3620: 3b 0a 7d 0a                                      ;.}.