/ Hex Artifact Content
Login

Artifact ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567:


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: 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
01a0: 6f 6e 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61  on.  The applica
01b0: 74 69 6f 6e 20 73 75 70 70 6c 69 65 73 0a 2a 2a  tion supplies.**
01c0: 20 61 20 63 68 75 6e 6b 20 6f 66 20 6d 65 6d 6f   a chunk of memo
01d0: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  ry to hold the d
01e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
01f0: 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 72  .** Because ther
0200: 65 20 69 73 20 70 6c 61 63 65 20 74 6f 20 73 74  e is place to st
0210: 6f 72 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ore a rollback o
0220: 72 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 2c 20 74  r wal journal, t
0230: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6d  he database.** m
0240: 75 73 74 20 75 73 65 20 6f 6e 65 20 6f 66 20 6a  ust use one of j
0250: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f  ournal_mode=MEMO
0260: 52 59 20 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RY or journal_mo
0270: 64 65 3d 4e 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 55  de=NONE..**.** U
0280: 53 41 47 45 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  SAGE:.**.**    s
0290: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 22  qlite3_open_v2("
02a0: 66 69 6c 65 3a 2f 77 68 61 74 65 76 65 72 3f 70  file:/whatever?p
02b0: 74 72 3d 30 78 66 30 35 35 33 38 26 73 7a 3d 31  tr=0xf05538&sz=1
02c0: 34 33 33 36 26 6d 61 78 3d 36 35 35 33 36 22 2c  4336&max=65536",
02d0: 20 26 64 62 2c 0a 2a 2a 20 20 20 20 20 20 20 20   &db,.**        
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
02f0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
0300: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
0310: 55 52 49 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  URI,.**         
0320: 20 20 20 20 20 20 20 20 20 20 20 22 6d 65 6d 76             "memv
0330: 66 73 22 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  fs");.**.** Thes
0340: 65 20 61 72 65 20 74 68 65 20 71 75 65 72 79 20  e are the query 
0350: 70 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  parameters:.**.*
0360: 2a 20 20 20 20 70 74 72 3d 20 20 20 20 20 20 20  *    ptr=       
0370: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
0380: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66  f the memory buf
0390: 66 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  fer that holds t
03a0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
03b0: 2a 2a 20 20 20 20 73 7a 3d 20 20 20 20 20 20 20  **    sz=       
03c0: 20 20 20 20 54 68 65 20 63 75 72 72 65 6e 74 20      The current 
03d0: 73 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  size the databas
03e0: 65 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 20 20 20  e file.**.**    
03f0: 6d 61 78 73 7a 3d 20 20 20 20 20 20 20 20 54 68  maxsz=        Th
0400: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
0410: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
0420: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
0430: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0440: 20 20 20 20 20 20 20 20 20 61 6d 6f 75 6e 74 20           amount 
0450: 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
0460: 65 64 20 66 6f 72 20 74 68 65 20 70 74 72 3d 20  ed for the ptr= 
0470: 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  buffer..**.**   
0480: 20 66 72 65 65 6f 6e 63 6c 6f 73 65 3d 20 20 49   freeonclose=  I
0490: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 73 71 6c  f true, then sql
04a0: 69 74 65 33 5f 66 72 65 65 28 29 20 69 73 20 63  ite3_free() is c
04b0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 74 72  alled on the ptr
04c0: 3d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  =.**            
04d0: 20 20 20 20 20 20 76 61 6c 75 65 20 77 68 65 6e        value when
04e0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
04f0: 63 6c 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  closes..**.** Th
0500: 65 20 70 74 72 3d 20 61 6e 64 20 73 7a 3d 20 71  e ptr= and sz= q
0510: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
0520: 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 20 49  are required.  I
0530: 66 20 6d 61 78 73 7a 3d 20 69 73 20 6f 6d 69 74  f maxsz= is omit
0540: 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ted,.** then it 
0550: 64 65 66 61 75 6c 74 73 20 74 6f 20 74 68 65 20  defaults to the 
0560: 73 7a 3d 20 76 61 6c 75 65 2e 20 20 50 61 72 61  sz= value.  Para
0570: 6d 65 74 65 72 20 76 61 6c 75 65 73 20 63 61 6e  meter values can
0580: 20 62 65 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a   be in either.**
0590: 20 64 65 63 69 6d 61 6c 20 6f 72 20 68 65 78 61   decimal or hexa
05a0: 64 65 63 69 6d 61 6c 2e 20 20 54 68 65 20 66 69  decimal.  The fi
05b0: 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 55 52  lename in the UR
05c0: 49 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  I is ignored..*/
05d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74  .#include <sqlit
05e0: 65 33 65 78 74 2e 68 3e 0a 53 51 4c 49 54 45 5f  e3ext.h>.SQLITE_
05f0: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
0600: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0610: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0620: 73 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20  sert.h>.../*.** 
0630: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
0640: 69 6f 6e 20 6f 66 20 6f 62 6a 65 63 74 73 20 75  ion of objects u
0650: 73 65 64 20 62 79 20 74 68 69 73 20 75 74 69 6c  sed by this util
0660: 69 74 79 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ity.*/.typedef s
0670: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 76 66  truct sqlite3_vf
0680: 73 20 4d 65 6d 56 66 73 3b 0a 74 79 70 65 64 65  s MemVfs;.typede
0690: 66 20 73 74 72 75 63 74 20 4d 65 6d 46 69 6c 65  f struct MemFile
06a0: 20 4d 65 6d 46 69 6c 65 3b 0a 0a 2f 2a 20 41 63   MemFile;../* Ac
06b0: 63 65 73 73 20 74 6f 20 61 20 6c 6f 77 65 72 2d  cess to a lower-
06c0: 6c 65 76 65 6c 20 56 46 53 20 74 68 61 74 20 28  level VFS that (
06d0: 6d 69 67 68 74 29 20 69 6d 70 6c 65 6d 65 6e 74  might) implement
06e0: 20 64 79 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67   dynamic loading
06f0: 2c 0a 2a 2a 20 61 63 63 65 73 73 20 74 6f 20 72  ,.** access to r
0700: 61 6e 64 6f 6d 6e 65 73 73 2c 20 65 74 63 2e 0a  andomness, etc..
0710: 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 52 49 47 56  */.#define ORIGV
0720: 46 53 28 70 29 20 28 28 73 71 6c 69 74 65 33 5f  FS(p) ((sqlite3_
0730: 76 66 73 2a 29 28 28 70 29 2d 3e 70 41 70 70 44  vfs*)((p)->pAppD
0740: 61 74 61 29 29 0a 0a 2f 2a 20 41 6e 20 6f 70 65  ata))../* An ope
0750: 6e 20 66 69 6c 65 20 2a 2f 0a 73 74 72 75 63 74  n file */.struct
0760: 20 4d 65 6d 46 69 6c 65 20 7b 0a 20 20 73 71 6c   MemFile {.  sql
0770: 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b 20  ite3_file base; 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0790: 49 4f 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20  IO methods */.  
07a0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
07b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
07c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
07d0: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
07e0: 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20 20 20  _int64 szMax;   
07f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
0800: 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61  e allocated to a
0810: 44 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  Data */.  unsign
0820: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  ed char *aData; 
0830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
0840: 74 65 6e 74 20 6f 66 20 74 68 65 20 66 69 6c 65  tent of the file
0850: 20 2a 2f 0a 20 20 69 6e 74 20 62 46 72 65 65 4f   */.  int bFreeO
0860: 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20  nClose;         
0870: 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
0880: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f  sqlite3_free() o
0890: 6e 20 61 44 61 74 61 20 61 74 20 63 6c 6f 73 65  n aData at close
08a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65   */.};../*.** Me
08b0: 74 68 6f 64 73 20 66 6f 72 20 4d 65 6d 46 69 6c  thods for MemFil
08c0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
08d0: 6d 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  memClose(sqlite3
08e0: 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
08f0: 69 6e 74 20 6d 65 6d 52 65 61 64 28 73 71 6c 69  int memRead(sqli
0900: 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69 64 2a  te3_file*, void*
0910: 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69  , int iAmt, sqli
0920: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29  te3_int64 iOfst)
0930: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  ;.static int mem
0940: 57 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66 69  Write(sqlite3_fi
0950: 6c 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  le*,const void*,
0960: 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65  int iAmt, sqlite
0970: 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a  3_int64 iOfst);.
0980: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 54 72  static int memTr
0990: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
09a0: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
09b0: 74 36 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69  t64 size);.stati
09c0: 63 20 69 6e 74 20 6d 65 6d 53 79 6e 63 28 73 71  c int memSync(sq
09d0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
09e0: 20 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63 20   flags);.static 
09f0: 69 6e 74 20 6d 65 6d 46 69 6c 65 53 69 7a 65 28  int memFileSize(
0a00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73  sqlite3_file*, s
0a10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
0a20: 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ize);.static int
0a30: 20 6d 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   memLock(sqlite3
0a40: 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
0a50: 61 74 69 63 20 69 6e 74 20 6d 65 6d 55 6e 6c 6f  atic int memUnlo
0a60: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
0a70: 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
0a80: 6e 74 20 6d 65 6d 43 68 65 63 6b 52 65 73 65 72  nt memCheckReser
0a90: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
0aa0: 66 69 6c 65 2a 2c 20 69 6e 74 20 2a 70 52 65 73  file*, int *pRes
0ab0: 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  Out);.static int
0ac0: 20 6d 65 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   memFileControl(
0ad0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
0ae0: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
0af0: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  g);.static int m
0b00: 65 6d 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  emSectorSize(sql
0b10: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
0b20: 74 69 63 20 69 6e 74 20 6d 65 6d 44 65 76 69 63  tic int memDevic
0b30: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
0b40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
0b50: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53  .static int memS
0b60: 68 6d 4d 61 70 28 73 71 6c 69 74 65 33 5f 66 69  hmMap(sqlite3_fi
0b70: 6c 65 2a 2c 20 69 6e 74 20 69 50 67 2c 20 69 6e  le*, int iPg, in
0b80: 74 20 70 67 73 7a 2c 20 69 6e 74 2c 20 76 6f 69  t pgsz, int, voi
0b90: 64 20 76 6f 6c 61 74 69 6c 65 2a 2a 29 3b 0a 73  d volatile**);.s
0ba0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 68 6d  tatic int memShm
0bb0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
0bc0: 65 2a 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  e*, int offset, 
0bd0: 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73  int n, int flags
0be0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  );.static void m
0bf0: 65 6d 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c  emShmBarrier(sql
0c00: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
0c10: 74 69 63 20 69 6e 74 20 6d 65 6d 53 68 6d 55 6e  tic int memShmUn
0c20: 6d 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  map(sqlite3_file
0c30: 2a 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  *, int deleteFla
0c40: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  g);.static int m
0c50: 65 6d 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  emFetch(sqlite3_
0c60: 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  file*, sqlite3_i
0c70: 6e 74 36 34 20 69 4f 66 73 74 2c 20 69 6e 74 20  nt64 iOfst, int 
0c80: 69 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  iAmt, void **pp)
0c90: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  ;.static int mem
0ca0: 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
0cb0: 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  file*, sqlite3_i
0cc0: 6e 74 36 34 20 69 4f 66 73 74 2c 20 76 6f 69 64  nt64 iOfst, void
0cd0: 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74   *p);../*.** Met
0ce0: 68 6f 64 73 20 66 6f 72 20 4d 65 6d 56 66 73 0a  hods for MemVfs.
0cf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
0d00: 6d 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  mOpen(sqlite3_vf
0d10: 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  s*, const char *
0d20: 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  , sqlite3_file*,
0d30: 20 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73   int , int *);.s
0d40: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 44 65 6c  tatic int memDel
0d50: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ete(sqlite3_vfs*
0d60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0d70: 61 6d 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72  ame, int syncDir
0d80: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  );.static int me
0d90: 6d 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f  mAccess(sqlite3_
0da0: 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
0db0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61   *zName, int fla
0dc0: 67 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  gs, int *);.stat
0dd0: 69 63 20 69 6e 74 20 6d 65 6d 46 75 6c 6c 50 61  ic int memFullPa
0de0: 74 68 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  thname(sqlite3_v
0df0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
0e00: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20 63 68 61  *zName, int, cha
0e10: 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63  r *zOut);.static
0e20: 20 76 6f 69 64 20 2a 6d 65 6d 44 6c 4f 70 65 6e   void *memDlOpen
0e30: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63  (sqlite3_vfs*, c
0e40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0e50: 6e 61 6d 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  name);.static vo
0e60: 69 64 20 6d 65 6d 44 6c 45 72 72 6f 72 28 73 71  id memDlError(sq
0e70: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
0e80: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72  nByte, char *zEr
0e90: 72 4d 73 67 29 3b 0a 73 74 61 74 69 63 20 76 6f  rMsg);.static vo
0ea0: 69 64 20 28 2a 6d 65 6d 44 6c 53 79 6d 28 73 71  id (*memDlSym(sq
0eb0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
0ec0: 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
0ed0: 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
0ee0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  );.static void m
0ef0: 65 6d 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  emDlClose(sqlite
0f00: 33 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b 0a  3_vfs*, void*);.
0f10: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 52 61  static int memRa
0f20: 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
0f30: 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65  _vfs*, int nByte
0f40: 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73  , char *zOut);.s
0f50: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 6c 65  tatic int memSle
0f60: 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ep(sqlite3_vfs*,
0f70: 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
0f80: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  s);.static int m
0f90: 65 6d 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  emCurrentTime(sq
0fa0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75 62  lite3_vfs*, doub
0fb0: 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
0fc0: 20 6d 65 6d 47 65 74 4c 61 73 74 45 72 72 6f 72   memGetLastError
0fd0: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69  (sqlite3_vfs*, i
0fe0: 6e 74 2c 20 63 68 61 72 20 2a 29 3b 0a 73 74 61  nt, char *);.sta
0ff0: 74 69 63 20 69 6e 74 20 6d 65 6d 43 75 72 72 65  tic int memCurre
1000: 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
1010: 74 65 33 5f 76 66 73 2a 2c 20 73 71 6c 69 74 65  te3_vfs*, sqlite
1020: 33 5f 69 6e 74 36 34 2a 29 3b 0a 0a 73 74 61 74  3_int64*);..stat
1030: 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ic sqlite3_vfs m
1040: 65 6d 5f 76 66 73 20 3d 20 7b 0a 20 20 32 2c 20  em_vfs = {.  2, 
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1070: 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  rsion */.  0,   
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46          /* szOsF
10a0: 69 6c 65 20 28 73 65 74 20 77 68 65 6e 20 72 65  ile (set when re
10b0: 67 69 73 74 65 72 65 64 29 20 2a 2f 0a 20 20 31  gistered) */.  1
10c0: 30 32 34 2c 20 20 20 20 20 20 20 20 20 20 20 20  024,            
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d              /* m
10e0: 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 30  xPathname */.  0
10f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1110: 4e 65 78 74 20 2a 2f 0a 20 20 22 6d 65 6d 76 66  Next */.  "memvf
1120: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
1130: 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
1140: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 28 73    /* pAppData (s
1170: 65 74 20 77 68 65 6e 20 72 65 67 69 73 74 65 72  et when register
1180: 65 64 29 20 2a 2f 20 0a 20 20 6d 65 6d 4f 70 65  ed) */ .  memOpe
1190: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
11a0: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
11b0: 2a 2f 0a 20 20 6d 65 6d 44 65 6c 65 74 65 2c 20  */.  memDelete, 
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
11e0: 20 20 6d 65 6d 41 63 63 65 73 73 2c 20 20 20 20    memAccess,    
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1200: 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 6d  * xAccess */.  m
1210: 65 6d 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  emFullPathname, 
1220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1230: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
1240: 20 20 6d 65 6d 44 6c 4f 70 65 6e 2c 20 20 20 20    memDlOpen,    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1260: 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 6d  * xDlOpen */.  m
1270: 65 6d 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  emDlError,      
1280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1290: 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 6d 65 6d  DlError */.  mem
12a0: 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
12b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
12c0: 53 79 6d 20 2a 2f 0a 20 20 6d 65 6d 44 6c 43 6c  Sym */.  memDlCl
12d0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
12e0: 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
12f0: 65 20 2a 2f 0a 20 20 6d 65 6d 52 61 6e 64 6f 6d  e */.  memRandom
1300: 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  ness,           
1310: 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
1320: 73 73 20 2a 2f 0a 20 20 6d 65 6d 53 6c 65 65 70  ss */.  memSleep
1330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1340: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
1350: 2f 0a 20 20 6d 65 6d 43 75 72 72 65 6e 74 54 69  /.  memCurrentTi
1360: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
1370: 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1380: 20 2a 2f 0a 20 20 6d 65 6d 47 65 74 4c 61 73 74   */.  memGetLast
1390: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
13a0: 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
13b0: 72 6f 72 20 2a 2f 0a 20 20 6d 65 6d 43 75 72 72  ror */.  memCurr
13c0: 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 20 20 20  entTimeInt64    
13d0: 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
13e0: 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 7d 3b  tTimeInt64 */.};
13f0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  ..static const s
1400: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1410: 73 20 6d 65 6d 5f 69 6f 5f 6d 65 74 68 6f 64 73  s mem_io_methods
1420: 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1450: 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 43 6c 6f 73 65  on */.  memClose
1460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1470: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1480: 20 2a 2f 0a 20 20 6d 65 6d 52 65 61 64 2c 20 20   */.  memRead,  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
14b0: 0a 20 20 6d 65 6d 57 72 69 74 65 2c 20 20 20 20  .  memWrite,    
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
14e0: 20 6d 65 6d 54 72 75 6e 63 61 74 65 2c 20 20 20   memTruncate,   
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
1510: 20 20 6d 65 6d 53 79 6e 63 2c 20 20 20 20 20 20    memSync,      
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 6d   /* xSync */.  m
1540: 65 6d 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  emFileSize,     
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1560: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
1570: 6d 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  memLock,        
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1590: 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d  * xLock */.  mem
15a0: 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15c0: 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 43  Unlock */.  memC
15d0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43  ,          /* xC
15f0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1600: 20 2a 2f 0a 20 20 6d 65 6d 46 69 6c 65 43 6f 6e   */.  memFileCon
1610: 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
1620: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1630: 74 72 6f 6c 20 2a 2f 0a 20 20 6d 65 6d 53 65 63  trol */.  memSec
1640: 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
1650: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1660: 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 6d 65 6d  torSize */.  mem
1670: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1680: 73 74 69 63 73 2c 20 20 20 20 20 20 2f 2a 20 78  stics,      /* x
1690: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
16a0: 73 74 69 63 73 20 2a 2f 0a 20 20 6d 65 6d 53 68  stics */.  memSh
16b0: 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
16d0: 6d 4d 61 70 20 2a 2f 0a 20 20 6d 65 6d 53 68 6d  mMap */.  memShm
16e0: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
16f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1700: 4c 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 53 68 6d  Lock */.  memShm
1710: 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
1720: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1730: 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 6d 65 6d  Barrier */.  mem
1740: 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1760: 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 6d 65  ShmUnmap */.  me
1770: 6d 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  mFetch,         
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1790: 78 46 65 74 63 68 20 2a 2f 0a 20 20 6d 65 6d 55  xFetch */.  memU
17a0: 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20  nfetch          
17b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
17c0: 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 0a 0a  nfetch */.};....
17d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6d  /*.** Close an m
17e0: 65 6d 2d 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  em-file..**.** T
17f0: 68 65 20 70 44 61 74 61 20 70 6f 69 6e 74 65 72  he pData pointer
1800: 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65   is owned by the
1810: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 73 6f   application, so
1820: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
1830: 67 0a 2a 2a 20 74 6f 20 66 72 65 65 2e 0a 2a 2f  g.** to free..*/
1840: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 43  .static int memC
1850: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
1860: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4d 65 6d  e *pFile){.  Mem
1870: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
1880: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66  le *)pFile;.  if
1890: 28 20 70 2d 3e 62 46 72 65 65 4f 6e 43 6c 6f 73  ( p->bFreeOnClos
18a0: 65 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  e ) sqlite3_free
18b0: 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 72 65  (p->aData);.  re
18c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
18e0: 74 61 20 66 72 6f 6d 20 61 6e 20 6d 65 6d 2d 66  ta from an mem-f
18f0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1900: 6e 74 20 6d 65 6d 52 65 61 64 28 0a 20 20 73 71  nt memRead(.  sq
1910: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1920: 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66  e, .  void *zBuf
1930: 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a  , .  int iAmt, .
1940: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
1950: 4f 66 73 74 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c  Ofst.){.  MemFil
1960: 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20  e *p = (MemFile 
1970: 2a 29 70 46 69 6c 65 3b 0a 20 20 6d 65 6d 63 70  *)pFile;.  memcp
1980: 79 28 7a 42 75 66 2c 20 70 2d 3e 61 44 61 74 61  y(zBuf, p->aData
1990: 2b 69 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20  +iOfst, iAmt);. 
19a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
19c0: 65 20 64 61 74 61 20 74 6f 20 61 6e 20 6d 65 6d  e data to an mem
19d0: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
19e0: 20 69 6e 74 20 6d 65 6d 57 72 69 74 65 28 0a 20   int memWrite(. 
19f0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1a00: 46 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  File,.  const vo
1a10: 69 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d  id *z,.  int iAm
1a20: 74 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  t,.  sqlite_int6
1a30: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4d 65 6d  4 iOfst.){.  Mem
1a40: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
1a50: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66  le *)pFile;.  if
1a60: 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70 2d 3e  ( iOfst+iAmt>p->
1a70: 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4f  sz ){.    if( iO
1a80: 66 73 74 2b 69 41 6d 74 3e 70 2d 3e 73 7a 4d 61  fst+iAmt>p->szMa
1a90: 78 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  x ) return SQLIT
1aa0: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
1ab0: 69 4f 66 73 74 3e 70 2d 3e 73 7a 20 29 20 6d 65  iOfst>p->sz ) me
1ac0: 6d 73 65 74 28 70 2d 3e 61 44 61 74 61 2b 70 2d  mset(p->aData+p-
1ad0: 3e 73 7a 2c 20 30 2c 20 69 4f 66 73 74 2d 70 2d  >sz, 0, iOfst-p-
1ae0: 3e 73 7a 29 3b 0a 20 20 20 20 70 2d 3e 73 7a 20  >sz);.    p->sz 
1af0: 3d 20 69 4f 66 73 74 2b 69 41 6d 74 3b 0a 20 20  = iOfst+iAmt;.  
1b00: 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44  }.  memcpy(p->aD
1b10: 61 74 61 2b 69 4f 66 73 74 2c 20 7a 2c 20 69 41  ata+iOfst, z, iA
1b20: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mt);.  return SQ
1b30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b40: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6d 65  * Truncate an me
1b50: 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  m-file..*/.stati
1b60: 63 20 69 6e 74 20 6d 65 6d 54 72 75 6e 63 61 74  c int memTruncat
1b70: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1b80: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
1b90: 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 4d 65 6d  t64 size){.  Mem
1ba0: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
1bb0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66  le *)pFile;.  if
1bc0: 28 20 73 69 7a 65 3e 70 2d 3e 73 7a 20 29 7b 0a  ( size>p->sz ){.
1bd0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 70 2d 3e      if( size>p->
1be0: 73 7a 4d 61 78 20 29 20 72 65 74 75 72 6e 20 53  szMax ) return S
1bf0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1c00: 6d 65 6d 73 65 74 28 70 2d 3e 61 44 61 74 61 2b  memset(p->aData+
1c10: 70 2d 3e 73 7a 2c 20 30 2c 20 73 69 7a 65 2d 70  p->sz, 0, size-p
1c20: 2d 3e 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->sz);.  }.  p->
1c30: 73 7a 20 3d 20 73 69 7a 65 3b 20 0a 20 20 72 65  sz = size; .  re
1c40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e  }../*.** Sync an
1c60: 20 6d 65 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74   mem-file..*/.st
1c70: 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 79 6e 63  atic int memSync
1c80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1c90: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  File, int flags)
1ca0: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
1cb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1cc0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1cd0: 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61  t file-size of a
1ce0: 6e 20 6d 65 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  n mem-file..*/.s
1cf0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 46 69 6c  tatic int memFil
1d00: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1d10: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
1d20: 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  e_int64 *pSize){
1d30: 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20  .  MemFile *p = 
1d40: 28 4d 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65  (MemFile *)pFile
1d50: 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 2d 3e  ;.  *pSize = p->
1d60: 73 7a 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  sz;.  return SQL
1d70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d80: 20 4c 6f 63 6b 20 61 6e 20 6d 65 6d 2d 66 69 6c   Lock an mem-fil
1d90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1da0: 20 6d 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   memLock(sqlite3
1db0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
1dc0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75  t eLock){.  retu
1dd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1de0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e  ./*.** Unlock an
1df0: 20 6d 65 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74   mem-file..*/.st
1e00: 61 74 69 63 20 69 6e 74 20 6d 65 6d 55 6e 6c 6f  atic int memUnlo
1e10: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1e20: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63  *pFile, int eLoc
1e30: 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  k){.  return SQL
1e40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e50: 20 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65   Check if anothe
1e60: 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f  r file-handle ho
1e70: 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
1e80: 6f 63 6b 20 6f 6e 20 61 6e 20 6d 65 6d 2d 66 69  ock on an mem-fi
1e90: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ea0: 74 20 6d 65 6d 43 68 65 63 6b 52 65 73 65 72 76  t memCheckReserv
1eb0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
1ec0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
1ed0: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 2a 70 52  *pResOut){.  *pR
1ee0: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e  ../*.** File con
1f10: 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72  trol method. For
1f20: 20 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f   custom operatio
1f30: 6e 73 20 6f 6e 20 61 6e 20 6d 65 6d 2d 66 69 6c  ns on an mem-fil
1f40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f50: 20 6d 65 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   memFileControl(
1f60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1f70: 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ile, int op, voi
1f80: 64 20 2a 70 41 72 67 29 7b 0a 20 20 4d 65 6d 46  d *pArg){.  MemF
1f90: 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c  ile *p = (MemFil
1fa0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
1fb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1fc0: 46 4f 55 4e 44 3b 0a 20 20 69 66 28 20 6f 70 3d  FOUND;.  if( op=
1fd0: 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46  =SQLITE_FCNTL_VF
1fe0: 53 4e 41 4d 45 20 29 7b 0a 20 20 20 20 2a 28 63  SNAME ){.    *(c
1ff0: 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
2000: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 65  ite3_mprintf("me
2010: 6d 28 25 70 2c 25 6c 6c 64 29 22 2c 20 70 2d 3e  m(%p,%lld)", p->
2020: 61 44 61 74 61 2c 20 70 2d 3e 73 7a 29 3b 0a 20  aData, p->sz);. 
2030: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2040: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2050: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2060: 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73  urn the sector-s
2070: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72  ize in bytes for
2080: 20 61 6e 20 6d 65 6d 2d 66 69 6c 65 2e 0a 2a 2f   an mem-file..*/
2090: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53  .static int memS
20a0: 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
20b0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
20c0: 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b 0a 7d    return 1024;.}
20d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20e0: 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
20f0: 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73  teristic flags s
2100: 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20 6d  upported by an m
2110: 65 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  em-file..*/.stat
2120: 69 63 20 69 6e 74 20 6d 65 6d 44 65 76 69 63 65  ic int memDevice
2130: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2140: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2150: 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  ile){.  return S
2160: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2170: 49 43 20 7c 20 0a 20 20 20 20 20 20 20 20 20 53  IC | .         S
2180: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
2190: 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
21a0: 7c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  |.         SQLIT
21b0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
21c0: 45 4e 44 20 7c 0a 20 20 20 20 20 20 20 20 20 53  END |.         S
21d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
21e0: 45 4e 54 49 41 4c 3b 0a 7d 0a 0a 2f 2a 20 43 72  ENTIAL;.}../* Cr
21f0: 65 61 74 65 20 61 20 73 68 61 72 65 64 20 6d 65  eate a shared me
2200: 6d 6f 72 79 20 66 69 6c 65 20 6d 61 70 70 69 6e  mory file mappin
2210: 67 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  g */.static int 
2220: 6d 65 6d 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  memShmMap(.  sql
2230: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2240: 2c 0a 20 20 69 6e 74 20 69 50 67 2c 0a 20 20 69  ,.  int iPg,.  i
2250: 6e 74 20 70 67 73 7a 2c 0a 20 20 69 6e 74 20 62  nt pgsz,.  int b
2260: 45 78 74 65 6e 64 2c 0a 20 20 76 6f 69 64 20 76  Extend,.  void v
2270: 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a  olatile **pp.){.
2280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2290: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3b 0a 7d 0a  IOERR_SHMMAP;.}.
22a0: 0a 2f 2a 20 50 65 72 66 6f 72 6d 20 6c 6f 63 6b  ./* Perform lock
22b0: 69 6e 67 20 6f 6e 20 61 20 73 68 61 72 65 64 2d  ing on a shared-
22c0: 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
22d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
22e0: 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ShmLock(sqlite3_
22f0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2300: 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 6e 2c 20   offset, int n, 
2310: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65  int flags){.  re
2320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2330: 52 5f 53 48 4d 4c 4f 43 4b 3b 0a 7d 0a 0a 2f 2a  R_SHMLOCK;.}../*
2340: 20 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   Memory barrier 
2350: 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 73 68 61  operation on sha
2360: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 73 74  red memory */.st
2370: 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 53 68 6d  atic void memShm
2380: 42 61 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f  Barrier(sqlite3_
2390: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
23a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 55 6e  return;.}../* Un
23b0: 6d 61 70 20 61 20 73 68 61 72 65 64 20 6d 65 6d  map a shared mem
23c0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 73  ory segment */.s
23d0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 53 68 6d  tatic int memShm
23e0: 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66 69  Unmap(sqlite3_fi
23f0: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64  le *pFile, int d
2400: 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 72 65  eleteFlag){.  re
2410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2420: 7d 0a 0a 2f 2a 20 46 65 74 63 68 20 61 20 70 61  }../* Fetch a pa
2430: 67 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 2d 6d  ge of a memory-m
2440: 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 73 74  apped file */.st
2450: 61 74 69 63 20 69 6e 74 20 6d 65 6d 46 65 74 63  atic int memFetc
2460: 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  h(.  sqlite3_fil
2470: 65 20 2a 70 46 69 6c 65 2c 0a 20 20 73 71 6c 69  e *pFile,.  sqli
2480: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c  te3_int64 iOfst,
2490: 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20 76  .  int iAmt,.  v
24a0: 6f 69 64 20 2a 2a 70 70 0a 29 7b 0a 20 20 4d 65  oid **pp.){.  Me
24b0: 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46  mFile *p = (MemF
24c0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 2a  ile *)pFile;.  *
24d0: 70 70 20 3d 20 28 76 6f 69 64 2a 29 28 70 2d 3e  pp = (void*)(p->
24e0: 61 44 61 74 61 20 2b 20 69 4f 66 73 74 29 3b 0a  aData + iOfst);.
24f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2500: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 6c 65 61 73  OK;.}../* Releas
2510: 65 20 61 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  e a memory-mappe
2520: 64 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69 63  d page */.static
2530: 20 69 6e 74 20 6d 65 6d 55 6e 66 65 74 63 68 28   int memUnfetch(
2540: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2550: 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ile, sqlite3_int
2560: 36 34 20 69 4f 66 73 74 2c 20 76 6f 69 64 20 2a  64 iOfst, void *
2570: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
2580: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2590: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 6d 65 6d  *.** Open an mem
25a0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
25b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 4f  .static int memO
25c0: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
25d0: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
25e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
25f0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2600: 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  File,.  int flag
2610: 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
2620: 61 67 73 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65  ags.){.  MemFile
2630: 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 2a 29   *p = (MemFile*)
2640: 70 46 69 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28  pFile;.  memset(
2650: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
2660: 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  );.  if( (flags 
2670: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
2680: 49 4e 5f 44 42 29 3d 3d 30 20 29 20 72 65 74 75  IN_DB)==0 ) retu
2690: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
26a0: 45 4e 3b 0a 20 20 70 2d 3e 61 44 61 74 61 20 3d  EN;.  p->aData =
26b0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
26c0: 29 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74  )sqlite3_uri_int
26d0: 36 34 28 7a 4e 61 6d 65 2c 22 70 74 72 22 2c 30  64(zName,"ptr",0
26e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 44 61 74  );.  if( p->aDat
26f0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
2700: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
2710: 20 70 2d 3e 73 7a 20 3d 20 73 71 6c 69 74 65 33   p->sz = sqlite3
2720: 5f 75 72 69 5f 69 6e 74 36 34 28 7a 4e 61 6d 65  _uri_int64(zName
2730: 2c 22 73 7a 22 2c 30 29 3b 0a 20 20 69 66 28 20  ,"sz",0);.  if( 
2740: 70 2d 3e 73 7a 3c 30 20 29 20 72 65 74 75 72 6e  p->sz<0 ) return
2750: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2760: 3b 0a 20 20 70 2d 3e 73 7a 4d 61 78 20 3d 20 73  ;.  p->szMax = s
2770: 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
2780: 28 7a 4e 61 6d 65 2c 22 6d 61 78 22 2c 70 2d 3e  (zName,"max",p->
2790: 73 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  sz);.  if( p->sz
27a0: 4d 61 78 3c 70 2d 3e 73 7a 20 29 20 72 65 74 75  Max<p->sz ) retu
27b0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
27c0: 45 4e 3b 0a 20 20 70 2d 3e 62 46 72 65 65 4f 6e  EN;.  p->bFreeOn
27d0: 43 6c 6f 73 65 20 3d 20 73 71 6c 69 74 65 33 5f  Close = sqlite3_
27e0: 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
27f0: 65 2c 22 66 72 65 65 6f 6e 63 6c 6f 73 65 22 2c  e,"freeonclose",
2800: 30 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  0);.  pFile->pMe
2810: 74 68 6f 64 73 20 3d 20 26 6d 65 6d 5f 69 6f 5f  thods = &mem_io_
2820: 6d 65 74 68 6f 64 73 3b 0a 20 20 72 65 74 75 72  methods;.  retur
2830: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2840: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2850: 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74   file located at
2860: 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
2870: 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
2880: 69 73 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75  is true,.** ensu
2890: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
28a0: 65 6d 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  em modifications
28b0: 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64   are synced to d
28c0: 69 73 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  isk before.** re
28d0: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
28e0: 69 63 20 69 6e 74 20 6d 65 6d 44 65 6c 65 74 65  ic int memDelete
28f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2900: 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
2910: 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
2920: 6e 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  nc){.  return SQ
2930: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2940: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  E;.}../*.** Test
2950: 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d   for access perm
2960: 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20  issions. Return 
2970: 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75  true if the requ
2980: 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  ested permission
2990: 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
29a0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
29b0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
29c0: 69 6e 74 20 6d 65 6d 41 63 63 65 73 73 28 0a 20  int memAccess(. 
29d0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
29e0: 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
29f0: 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
2a00: 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
2a10: 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 2a 70 52  pResOut.){.  *pR
2a20: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
2a30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a40: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
2a50: 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74   buffer zOut wit
2a60: 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e  h the full canon
2a70: 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f  ical pathname co
2a80: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
2a90: 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69  o the pathname i
2aa0: 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73  n zPath. zOut is
2ab0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
2ac0: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
2ad0: 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20  .** of at least 
2ae0: 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41  (INST_MAX_PATHNA
2af0: 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  ME+1) bytes..*/.
2b00: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 46 75  static int memFu
2b10: 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2b20: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2b30: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
2b40: 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f  zPath, .  int nO
2b50: 75 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ut, .  char *zOu
2b60: 74 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t.){.  sqlite3_s
2b70: 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
2b80: 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
2b90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2ba0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  E_OK;.}../*.** O
2bb0: 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20  pen the dynamic 
2bc0: 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20  library located 
2bd0: 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74  at zPath and ret
2be0: 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f  urn a handle..*/
2bf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65  .static void *me
2c00: 6d 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  mDlOpen(sqlite3_
2c10: 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
2c20: 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20   char *zPath){. 
2c30: 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28   return ORIGVFS(
2c40: 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28 4f  pVfs)->xDlOpen(O
2c50: 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 7a 50  RIGVFS(pVfs), zP
2c60: 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ath);.}../*.** P
2c70: 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66  opulate the buff
2c80: 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65  er zErrMsg (size
2c90: 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69   nByte bytes) wi
2ca0: 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61  th a human reada
2cb0: 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72  ble.** utf-8 str
2cc0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2cd0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
2ce0: 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
2cf0: 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
2d00: 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62  with dynamic lib
2d10: 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  raries..*/.stati
2d20: 63 20 76 6f 69 64 20 6d 65 6d 44 6c 45 72 72 6f  c void memDlErro
2d30: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2d40: 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
2d50: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
2d60: 20 20 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d    ORIGVFS(pVfs)-
2d70: 3e 78 44 6c 45 72 72 6f 72 28 4f 52 49 47 56 46  >xDlError(ORIGVF
2d80: 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20  S(pVfs), nByte, 
2d90: 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  zErrMsg);.}../*.
2da0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2db0: 74 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f  ter to the symbo
2dc0: 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65  l zSymbol in the
2dd0: 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
2de0: 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61   pHandle..*/.sta
2df0: 74 69 63 20 76 6f 69 64 20 28 2a 6d 65 6d 44 6c  tic void (*memDl
2e00: 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
2e10: 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20  *pVfs, void *p, 
2e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
2e30: 29 29 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ))(void){.  retu
2e40: 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73 29  rn ORIGVFS(pVfs)
2e50: 2d 3e 78 44 6c 53 79 6d 28 4f 52 49 47 56 46 53  ->xDlSym(ORIGVFS
2e60: 28 70 56 66 73 29 2c 20 70 2c 20 7a 53 79 6d 29  (pVfs), p, zSym)
2e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
2e80: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
2e90: 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e  rary handle pHan
2ea0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
2eb0: 6f 69 64 20 6d 65 6d 44 6c 43 6c 6f 73 65 28 73  oid memDlClose(s
2ec0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ed0: 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
2ee0: 7b 0a 20 20 4f 52 49 47 56 46 53 28 70 56 66 73  {.  ORIGVFS(pVfs
2ef0: 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 4f 52 49 47  )->xDlClose(ORIG
2f00: 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e 64  VFS(pVfs), pHand
2f10: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  le);.}../*.** Po
2f20: 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
2f30: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
2f40: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79  zBufOut with nBy
2f50: 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20  te bytes of .** 
2f60: 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a  random data..*/.
2f70: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 52 61  static int memRa
2f80: 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
2f90: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2fa0: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75  nByte, char *zBu
2fb0: 66 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  fOut){.  return 
2fc0: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
2fd0: 52 61 6e 64 6f 6d 6e 65 73 73 28 4f 52 49 47 56  Randomness(ORIGV
2fe0: 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65 2c  FS(pVfs), nByte,
2ff0: 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a   zBufOut);.}../*
3000: 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d  .** Sleep for nM
3010: 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64  icro microsecond
3020: 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  s. Return the nu
3030: 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
3040: 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c  onds .** actuall
3050: 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  y slept..*/.stat
3060: 69 63 20 69 6e 74 20 6d 65 6d 53 6c 65 65 70 28  ic int memSleep(
3070: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3080: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
3090: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
30a0: 28 70 56 66 73 29 2d 3e 78 53 6c 65 65 70 28 4f  (pVfs)->xSleep(O
30b0: 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 6e 4d  RIGVFS(pVfs), nM
30c0: 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
30d0: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
30e0: 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
30f0: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
3100: 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
3110: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 43 75  static int memCu
3120: 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
3130: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
3140: 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a  ble *pTimeOut){.
3150: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
3160: 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65 6e 74  (pVfs)->xCurrent
3170: 54 69 6d 65 28 4f 52 49 47 56 46 53 28 70 56 66  Time(ORIGVFS(pVf
3180: 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d  s), pTimeOut);.}
3190: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  ..static int mem
31a0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
31b0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
31c0: 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b  int a, char *b){
31d0: 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46  .  return ORIGVF
31e0: 53 28 70 56 66 73 29 2d 3e 78 47 65 74 4c 61 73  S(pVfs)->xGetLas
31f0: 74 45 72 72 6f 72 28 4f 52 49 47 56 46 53 28 70  tError(ORIGVFS(p
3200: 56 66 73 29 2c 20 61 2c 20 62 29 3b 0a 7d 0a 73  Vfs), a, b);.}.s
3210: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 43 75 72  tatic int memCur
3220: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
3230: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3240: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
3250: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49  p){.  return ORI
3260: 47 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72  GVFS(pVfs)->xCur
3270: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 4f 52  rentTimeInt64(OR
3280: 49 47 56 46 53 28 70 56 66 73 29 2c 20 70 29 3b  IGVFS(pVfs), p);
3290: 0a 7d 0a 0a 23 69 66 64 65 66 20 4d 45 4d 56 46  .}..#ifdef MEMVF
32a0: 53 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 20 20 20  S_TEST./*.**    
32b0: 20 20 20 6d 65 6d 76 66 73 5f 66 72 6f 6d 5f 66     memvfs_from_f
32c0: 69 6c 65 28 46 49 4c 45 4e 41 4d 45 2c 20 4d 41  ile(FILENAME, MA
32d0: 58 53 49 5a 45 29 0a 2a 2a 0a 2a 2a 20 54 68 69  XSIZE).**.** Thi
32e0: 73 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  s an SQL functio
32f0: 6e 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69  n used to help i
3300: 6e 20 74 65 73 74 69 6e 67 20 74 68 65 20 6d 65  n testing the me
3310: 6d 76 66 73 20 56 46 53 2e 20 20 54 68 65 0a 2a  mvfs VFS.  The.*
3320: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  * function reads
3330: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
3340: 61 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  a file into memo
3350: 72 79 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  ry and then retu
3360: 72 6e 73 0a 2a 2a 20 61 20 55 52 49 20 74 68 61  rns.** a URI tha
3370: 74 20 63 61 6e 20 62 65 20 68 61 6e 64 65 64 20  t can be handed 
3380: 74 6f 20 41 54 54 41 43 48 20 74 6f 20 61 74 74  to ATTACH to att
3390: 61 63 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 62  ach the memory b
33a0: 75 66 66 65 72 20 61 73 0a 2a 2a 20 61 20 64 61  uffer as.** a da
33b0: 74 61 62 61 73 65 2e 20 20 45 78 61 6d 70 6c 65  tabase.  Example
33c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 54  :.**.**       AT
33d0: 54 41 43 48 20 6d 65 6d 76 66 73 5f 66 72 6f 6d  TACH memvfs_from
33e0: 5f 66 69 6c 65 28 27 74 65 73 74 2e 64 62 27 2c  _file('test.db',
33f0: 31 30 34 38 35 37 36 29 20 41 53 20 69 6e 6d 65  1048576) AS inme
3400: 6d 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  m;.**.** The opt
3410: 69 6f 6e 61 6c 20 4d 41 58 53 49 5a 45 20 61 72  ional MAXSIZE ar
3420: 67 75 6d 65 6e 74 20 67 69 76 65 73 20 74 68 65  gument gives the
3430: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
3440: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
3450: 2a 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  * used to hold t
3460: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
3470: 20 6f 6d 69 74 74 65 64 2c 20 69 74 20 64 65 66   omitted, it def
3480: 61 75 6c 74 73 20 74 6f 20 74 68 65 20 73 69 7a  aults to the siz
3490: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
34a0: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 23 69 6e   on disk..*/.#in
34b0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
34c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 76  static void memv
34d0: 66 73 46 72 6f 6d 46 69 6c 65 46 75 6e 63 28 0a  fsFromFileFunc(.
34e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
34f0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3500: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3510: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3520: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
3530: 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r *p;.  sqlite3_
3540: 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69  int64 sz;.  sqli
3550: 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b  te3_int64 szMax;
3560: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
3570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3580: 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
3590: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
35a0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
35b0: 0a 20 20 63 68 61 72 20 2a 7a 55 72 69 3b 0a 0a  .  char *zUri;..
35c0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
35d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
35e0: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e  n = fopen(zFilen
35f0: 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  ame, "rb");.  if
3600: 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
3610: 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
3620: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a   SEEK_END);.  sz
3630: 4d 61 78 20 3d 20 73 7a 20 3d 20 66 74 65 6c 6c  Max = sz = ftell
3640: 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
3650: 6e 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  n);.  if( argc>=
3660: 32 20 29 7b 0a 20 20 20 20 73 7a 4d 61 78 20 3d  2 ){.    szMax =
3670: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
3680: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20  nt64(argv[1]);. 
3690: 20 20 20 69 66 28 20 73 7a 4d 61 78 3c 73 7a 20     if( szMax<sz 
36a0: 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20  ) szMax = sz;.  
36b0: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  }.  p = sqlite3_
36c0: 6d 61 6c 6c 6f 63 36 34 28 20 73 7a 4d 61 78 20  malloc64( szMax 
36d0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
36e0: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
36f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
3700: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
3710: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65  context);.    re
3720: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 72 65 61  turn;.  }.  frea
3730: 64 28 70 2c 20 73 7a 2c 20 31 2c 20 69 6e 29 3b  d(p, sz, 1, in);
3740: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
3750: 20 7a 55 72 69 20 3d 20 73 71 6c 69 74 65 33 5f   zUri = sqlite3_
3760: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
3770: 20 20 20 20 22 66 69 6c 65 3a 2f 6d 65 6d 3f 76      "file:/mem?v
3780: 66 73 3d 6d 65 6d 76 66 73 26 70 74 72 3d 25 6c  fs=memvfs&ptr=%l
3790: 6c 64 26 73 7a 3d 25 6c 6c 64 26 6d 61 78 3d 25  ld&sz=%lld&max=%
37a0: 6c 6c 64 26 66 72 65 65 6f 6e 63 6c 6f 73 65 3d  lld&freeonclose=
37b0: 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
37d0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 2c 20 73  lite3_int64)p, s
37e0: 7a 2c 20 73 7a 4d 61 78 29 3b 0a 20 20 73 71 6c  z, szMax);.  sql
37f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
3800: 28 63 6f 6e 74 65 78 74 2c 20 7a 55 72 69 2c 20  (context, zUri, 
3810: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
3820: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d  );.}.#endif /* M
3830: 45 4d 56 46 53 5f 54 45 53 54 20 2a 2f 0a 0a 23  EMVFS_TEST */..#
3840: 69 66 64 65 66 20 4d 45 4d 56 46 53 5f 54 45 53  ifdef MEMVFS_TES
3850: 54 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 20 6d 65  T./*.**       me
3860: 6d 76 66 73 5f 74 6f 5f 66 69 6c 65 28 53 43 48  mvfs_to_file(SCH
3870: 45 4d 41 2c 20 46 49 4c 45 4e 41 4d 45 29 0a 2a  EMA, FILENAME).*
3880: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
3890: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 53 43  identified by SC
38a0: 48 45 4d 41 20 6d 75 73 74 20 62 65 20 61 20 6d  HEMA must be a m
38b0: 65 6d 76 66 73 20 64 61 74 61 62 61 73 65 2e 20  emvfs database. 
38c0: 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f   Write.** the co
38d0: 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 64 61  ntent of this da
38e0: 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45  tabase into FILE
38f0: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
3900: 76 6f 69 64 20 6d 65 6d 76 66 73 54 6f 46 69 6c  void memvfsToFil
3910: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
3920: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3930: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
3940: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3950: 2a 61 72 67 76 0a 29 7b 0a 20 20 4d 65 6d 46 69  *argv.){.  MemFi
3960: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 46 49 4c  le *p = 0;.  FIL
3970: 45 20 2a 6f 75 74 3b 0a 20 20 69 6e 74 20 72 63  E *out;.  int rc
3980: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
3990: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
39a0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
39b0: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
39c0: 76 66 73 20 2a 70 56 66 73 20 3d 20 30 3b 0a 20  vfs *pVfs = 0;. 
39d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
39e0: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
39f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
3a00: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
3a10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3a20: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  Filename = (cons
3a30: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
3a40: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
3a50: 31 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 46 69 6c  1]);..  if( zFil
3a60: 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  ename==0 ) retur
3a70: 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e  n;.  out = fopen
3a80: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 62 22  (zFilename, "wb"
3a90: 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
3aa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d  ) return;.  rc =
3ab0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
3ac0: 6e 74 72 6f 6c 28 64 62 2c 20 7a 53 63 68 65 6d  ntrol(db, zSchem
3ad0: 61 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  a, SQLITE_FCNTL_
3ae0: 56 46 53 5f 50 4f 49 4e 54 45 52 2c 20 26 70 56  VFS_POINTER, &pV
3af0: 66 73 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c  fs);.  if( rc ||
3b00: 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
3b10: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
3b20: 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 6d 65 6d  pVfs->zName,"mem
3b30: 76 66 73 22 29 21 3d 30 20 29 20 72 65 74 75 72  vfs")!=0 ) retur
3b40: 6e 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  n;.  rc = sqlite
3b50: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3b60: 62 2c 20 7a 53 63 68 65 6d 61 2c 20 53 51 4c 49  b, zSchema, SQLI
3b70: 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
3b80: 49 4e 54 45 52 2c 20 26 70 29 3b 0a 20 20 69 66  INTER, &p);.  if
3b90: 28 20 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( rc ) return;. 
3ba0: 20 66 77 72 69 74 65 28 70 2d 3e 61 44 61 74 61   fwrite(p->aData
3bb0: 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 70 2d 3e  , 1, (size_t)p->
3bc0: 73 7a 2c 20 6f 75 74 29 3b 0a 20 20 66 63 6c 6f  sz, out);.  fclo
3bd0: 73 65 28 6f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  se(out);.}.#endi
3be0: 66 20 2f 2a 20 4d 45 4d 56 46 53 5f 54 45 53 54  f /* MEMVFS_TEST
3bf0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 4d 45 4d 56   */..#ifdef MEMV
3c00: 46 53 5f 54 45 53 54 0a 2f 2a 20 43 61 6c 6c 65  FS_TEST./* Calle
3c10: 64 20 66 6f 72 20 65 61 63 68 20 6e 65 77 20 64  d for each new d
3c20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3c30: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
3c40: 20 6d 65 6d 76 66 73 52 65 67 69 73 74 65 72 28   memvfsRegister(
3c50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
3c60: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
3c70: 67 2c 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  g,.  const struc
3c80: 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
3c90: 75 74 69 6e 65 73 20 2a 70 54 68 75 6e 6b 0a 29  utines *pThunk.)
3ca0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  {.  sqlite3_crea
3cb0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
3cc0: 22 6d 65 6d 76 66 73 5f 66 72 6f 6d 5f 66 69 6c  "memvfs_from_fil
3cd0: 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  e", 1, SQLITE_UT
3ce0: 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 6d 65 6d 76 66 73 46 72 6f 6d 46 69 6c 65 46   memvfsFromFileF
3d10: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  unc, 0, 0);.  sq
3d20: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
3d30: 63 74 69 6f 6e 28 64 62 2c 20 22 6d 65 6d 76 66  ction(db, "memvf
3d40: 73 5f 66 72 6f 6d 5f 66 69 6c 65 22 2c 20 32 2c  s_from_file", 2,
3d50: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
3d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d70: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 76 66             memvf
3d80: 73 46 72 6f 6d 46 69 6c 65 46 75 6e 63 2c 20 30  sFromFileFunc, 0
3d90: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
3da0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
3db0: 64 62 2c 20 22 6d 65 6d 76 66 73 5f 74 6f 5f 66  db, "memvfs_to_f
3dc0: 69 6c 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ile", 2, SQLITE_
3dd0: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 6d 65 6d 76 66 73 54 6f 46 69 6c 65 46     memvfsToFileF
3e00: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  unc, 0, 0);.  re
3e10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3e20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 45 4d 56  }.#endif /* MEMV
3e30: 46 53 5f 54 45 53 54 20 2a 2f 0a 0a 20 20 0a 23  FS_TEST */..  .#
3e40: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
3e50: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
3e60: 74 29 0a 23 65 6e 64 69 66 0a 2f 2a 20 0a 2a 2a  t).#endif./* .**
3e70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3e80: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3e90: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6c 6f   extension is lo
3ea0: 61 64 65 64 2e 0a 2a 2a 20 52 65 67 69 73 74 65  aded..** Registe
3eb0: 72 20 74 68 65 20 6e 65 77 20 56 46 53 2e 0a 2a  r the new VFS..*
3ec0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65  /.int sqlite3_me
3ed0: 6d 76 66 73 5f 69 6e 69 74 28 0a 20 20 73 71 6c  mvfs_init(.  sql
3ee0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61  ite3 *db, .  cha
3ef0: 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20  r **pzErrMsg, . 
3f00: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61   const sqlite3_a
3f10: 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70  pi_routines *pAp
3f20: 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  i.){.  int rc = 
3f30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c  SQLITE_OK;.  SQL
3f40: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
3f50: 49 54 32 28 70 41 70 69 29 3b 0a 20 20 6d 65 6d  IT2(pApi);.  mem
3f60: 5f 76 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  _vfs.pAppData = 
3f70: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
3f80: 28 30 29 3b 0a 20 20 6d 65 6d 5f 76 66 73 2e 73  (0);.  mem_vfs.s
3f90: 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66  zOsFile = sizeof
3fa0: 28 4d 65 6d 46 69 6c 65 29 3b 0a 20 20 72 63 20  (MemFile);.  rc 
3fb0: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65  = sqlite3_vfs_re
3fc0: 67 69 73 74 65 72 28 26 6d 65 6d 5f 76 66 73 2c  gister(&mem_vfs,
3fd0: 20 31 29 3b 0a 23 69 66 64 65 66 20 4d 45 4d 56   1);.#ifdef MEMV
3fe0: 46 53 5f 54 45 53 54 0a 20 20 69 66 28 20 72 63  FS_TEST.  if( rc
3ff0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4000: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4010: 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 28  auto_extension((
4020: 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6d 65  void(*)(void))me
4030: 6d 76 66 73 52 65 67 69 73 74 65 72 29 3b 0a 20  mvfsRegister);. 
4040: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4050: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
4060: 20 3d 20 6d 65 6d 76 66 73 52 65 67 69 73 74 65   = memvfsRegiste
4070: 72 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c 20  r(db, pzErrMsg, 
4080: 70 41 70 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pApi);.  }.#endi
4090: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
40a0: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
40b0: 49 54 45 5f 4f 4b 5f 4c 4f 41 44 5f 50 45 52 4d  ITE_OK_LOAD_PERM
40c0: 41 4e 45 4e 54 4c 59 3b 0a 20 20 72 65 74 75 72  ANENTLY;.  retur
40d0: 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.