/ Hex Artifact Content
Login

Artifact d58bb51e6029a7bd91b2148b98ab00c3a271c6cd2632eb756cfcd91e1252930b:


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: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 69 6e 2d 6d 65 6d 6f 72 79 20 56 46 53 2e 20 20  in-memory VFS.  
01a0: 41 20 64 61 74 61 62 61 73 65 20 69 73 20 68 65  A database is he
01b0: 6c 64 20 61 73 20 61 20 63 6f 6e 74 69 67 75 6f  ld as a contiguo
01c0: 75 73 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 6d  us.** block of m
01d0: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  emory..**.** Thi
01e0: 73 20 66 69 6c 65 20 61 6c 73 6f 20 69 6d 70 6c  s file also impl
01f0: 65 6d 65 6e 74 73 20 69 6e 74 65 72 66 61 63 65  ements interface
0200: 20 73 71 6c 69 74 65 33 5f 73 65 72 69 61 6c 69   sqlite3_seriali
0210: 7a 65 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  ze() and.** sqli
0220: 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
0230: 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  )..*/.#ifdef SQL
0240: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 44 42  ITE_ENABLE_MEMDB
0250: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0260: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 46  eInt.h"../*.** F
0270: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0280: 6f 6e 20 6f 66 20 6f 62 6a 65 63 74 73 20 75 73  on of objects us
0290: 65 64 20 62 79 20 74 68 69 73 20 75 74 69 6c 69  ed by this utili
02a0: 74 79 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ty.*/.typedef st
02b0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 76 66 73  ruct sqlite3_vfs
02c0: 20 4d 65 6d 56 66 73 3b 0a 74 79 70 65 64 65 66   MemVfs;.typedef
02d0: 20 73 74 72 75 63 74 20 4d 65 6d 46 69 6c 65 20   struct MemFile 
02e0: 4d 65 6d 46 69 6c 65 3b 0a 0a 2f 2a 20 41 63 63  MemFile;../* Acc
02f0: 65 73 73 20 74 6f 20 61 20 6c 6f 77 65 72 2d 6c  ess to a lower-l
0300: 65 76 65 6c 20 56 46 53 20 74 68 61 74 20 28 6d  evel VFS that (m
0310: 69 67 68 74 29 20 69 6d 70 6c 65 6d 65 6e 74 20  ight) implement 
0320: 64 79 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67 2c  dynamic loading,
0330: 0a 2a 2a 20 61 63 63 65 73 73 20 74 6f 20 72 61  .** access to ra
0340: 6e 64 6f 6d 6e 65 73 73 2c 20 65 74 63 2e 0a 2a  ndomness, etc..*
0350: 2f 0a 23 64 65 66 69 6e 65 20 4f 52 49 47 56 46  /.#define ORIGVF
0360: 53 28 70 29 20 28 28 73 71 6c 69 74 65 33 5f 76  S(p) ((sqlite3_v
0370: 66 73 2a 29 28 28 70 29 2d 3e 70 41 70 70 44 61  fs*)((p)->pAppDa
0380: 74 61 29 29 0a 0a 2f 2a 20 41 6e 20 6f 70 65 6e  ta))../* An open
0390: 20 66 69 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20   file */.struct 
03a0: 4d 65 6d 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69  MemFile {.  sqli
03b0: 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b 20 20  te3_file base;  
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
03d0: 4f 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73  O methods */.  s
03e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0400: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * Size of the fi
0410: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
0420: 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20 20 20 20  int64 szMax;    
0430: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
0440: 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61 44   allocated to aD
0450: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
0460: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20  d char *aData;  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
0480: 65 6e 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ent of the file 
0490: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 3b 20  */.  int nMmap; 
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
04c0: 66 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  f memory mapped 
04d0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  pages */.  unsig
04e0: 6e 65 64 20 6d 46 6c 61 67 73 3b 20 20 20 20 20  ned mFlags;     
04f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
0500: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f  ags */.  int eLo
0510: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
0520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
0530: 20 72 65 63 65 6e 74 20 6c 6f 63 6b 20 61 67 61   recent lock aga
0540: 69 6e 73 74 20 74 68 69 73 20 66 69 6c 65 20 2a  inst this file *
0550: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68  /.};../*.** Meth
0560: 6f 64 73 20 66 6f 72 20 4d 65 6d 46 69 6c 65 0a  ods for MemFile.
0570: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
0580: 6d 64 62 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  mdbClose(sqlite3
0590: 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
05a0: 69 6e 74 20 6d 65 6d 64 62 52 65 61 64 28 73 71  int memdbRead(sq
05b0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69  lite3_file*, voi
05c0: 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73 71  d*, int iAmt, sq
05d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73  lite3_int64 iOfs
05e0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  t);.static int m
05f0: 65 6d 64 62 57 72 69 74 65 28 73 71 6c 69 74 65  emdbWrite(sqlite
0600: 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20 76 6f  3_file*,const vo
0610: 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20 73 71  id*,int iAmt, sq
0620: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73  lite3_int64 iOfs
0630: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  t);.static int m
0640: 65 6d 64 62 54 72 75 6e 63 61 74 65 28 73 71 6c  emdbTruncate(sql
0650: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69  ite3_file*, sqli
0660: 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b  te3_int64 size);
0670: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
0680: 62 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  bSync(sqlite3_fi
0690: 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b  le*, int flags);
06a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
06b0: 62 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  bFileSize(sqlite
06c0: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  3_file*, sqlite3
06d0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a  _int64 *pSize);.
06e0: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62  static int memdb
06f0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
0700: 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
0710: 20 69 6e 74 20 6d 65 6d 64 62 43 68 65 63 6b 52   int memdbCheckR
0720: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
0730: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2a  te3_file*, int *
0740: 70 52 65 73 4f 75 74 29 3b 0a 73 74 61 74 69 63  pResOut);.static
0750: 20 69 6e 74 20 6d 65 6d 64 62 46 69 6c 65 43 6f   int memdbFileCo
0760: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
0770: 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  le*, int op, voi
0780: 64 20 2a 70 41 72 67 29 3b 0a 73 74 61 74 69 63  d *pArg);.static
0790: 20 69 6e 74 20 6d 65 6d 64 62 53 65 63 74 6f 72   int memdbSector
07a0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
07b0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
07c0: 6d 65 6d 64 62 44 65 76 69 63 65 43 68 61 72 61  memdbDeviceChara
07d0: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
07e0: 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
07f0: 63 20 69 6e 74 20 6d 65 6d 64 62 46 65 74 63 68  c int memdbFetch
0800: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
0810: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
0820: 66 73 74 2c 20 69 6e 74 20 69 41 6d 74 2c 20 76  fst, int iAmt, v
0830: 6f 69 64 20 2a 2a 70 70 29 3b 0a 73 74 61 74 69  oid **pp);.stati
0840: 63 20 69 6e 74 20 6d 65 6d 64 62 55 6e 66 65 74  c int memdbUnfet
0850: 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ch(sqlite3_file*
0860: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
0870: 69 4f 66 73 74 2c 20 76 6f 69 64 20 2a 70 29 3b  iOfst, void *p);
0880: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 73 20  ../*.** Methods 
0890: 66 6f 72 20 4d 65 6d 56 66 73 0a 2a 2f 0a 73 74  for MemVfs.*/.st
08a0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 4f 70  atic int memdbOp
08b0: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
08c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73   const char *, s
08d0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
08e0: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  t , int *);.stat
08f0: 69 63 20 69 6e 74 20 6d 65 6d 64 62 44 65 6c 65  ic int memdbDele
0900: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  te(sqlite3_vfs*,
0910: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0920: 6d 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29  me, int syncDir)
0930: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  ;.static int mem
0940: 64 62 41 63 63 65 73 73 28 73 71 6c 69 74 65 33  dbAccess(sqlite3
0950: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
0960: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c  r *zName, int fl
0970: 61 67 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61  ags, int *);.sta
0980: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 75 6c  tic int memdbFul
0990: 6c 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65  lPathname(sqlite
09a0: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
09b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20  ar *zName, int, 
09c0: 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61  char *zOut);.sta
09d0: 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 64 62 44  tic void *memdbD
09e0: 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
09f0: 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  s*, const char *
0a00: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74  zFilename);.stat
0a10: 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 45  ic void memdbDlE
0a20: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
0a30: 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  *, int nByte, ch
0a40: 61 72 20 2a 7a 45 72 72 4d 73 67 29 3b 0a 73 74  ar *zErrMsg);.st
0a50: 61 74 69 63 20 76 6f 69 64 20 28 2a 6d 65 6d 64  atic void (*memd
0a60: 62 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  bDlSym(sqlite3_v
0a70: 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
0a80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
0a90: 79 6d 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74  ym))(void);.stat
0aa0: 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 43  ic void memdbDlC
0ab0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
0ac0: 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 61 74 69  *, void*);.stati
0ad0: 63 20 69 6e 74 20 6d 65 6d 64 62 52 61 6e 64 6f  c int memdbRando
0ae0: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
0af0: 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  s*, int nByte, c
0b00: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
0b10: 69 63 20 69 6e 74 20 6d 65 6d 64 62 53 6c 65 65  ic int memdbSlee
0b20: 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  p(sqlite3_vfs*, 
0b30: 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
0b40: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  );.static int me
0b50: 6d 64 62 43 75 72 72 65 6e 74 54 69 6d 65 28 73  mdbCurrentTime(s
0b60: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75  qlite3_vfs*, dou
0b70: 62 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ble*);.static in
0b80: 74 20 6d 65 6d 64 62 47 65 74 4c 61 73 74 45 72  t memdbGetLastEr
0b90: 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ror(sqlite3_vfs*
0ba0: 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 29 3b 0a  , int, char *);.
0bb0: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62  static int memdb
0bc0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
0bd0: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 73  (sqlite3_vfs*, s
0be0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 3b 0a  qlite3_int64*);.
0bf0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
0c00: 76 66 73 20 6d 65 6d 64 62 5f 76 66 73 20 3d 20  vfs memdb_vfs = 
0c10: 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
0c40: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c60: 2a 20 73 7a 4f 73 46 69 6c 65 20 28 73 65 74 20  * szOsFile (set 
0c70: 77 68 65 6e 20 72 65 67 69 73 74 65 72 65 64 29  when registered)
0c80: 20 2a 2f 0a 20 20 31 30 32 34 2c 20 20 20 20 20   */.  1024,     
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
0cb0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
0ce0: 20 22 6d 65 6d 64 62 22 2c 20 20 20 20 20 20 20   "memdb",       
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d00: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20   zName */.  0,  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
0d30: 44 61 74 61 20 28 73 65 74 20 77 68 65 6e 20 72  Data (set when r
0d40: 65 67 69 73 74 65 72 65 64 29 20 2a 2f 20 0a 20  egistered) */ . 
0d50: 20 6d 65 6d 64 62 4f 70 65 6e 2c 20 20 20 20 20   memdbOpen,     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d70: 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 6d 65 6d 64   xOpen */.  memd
0d80: 62 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  bDelete,        
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
0da0: 65 74 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 41 63  ete */.  memdbAc
0db0: 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
0dc0: 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
0dd0: 20 2a 2f 0a 20 20 6d 65 6d 64 62 46 75 6c 6c 50   */.  memdbFullP
0de0: 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  athname,        
0df0: 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
0e00: 61 6d 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 44 6c  ame */.  memdbDl
0e10: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
0e20: 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
0e30: 20 2a 2f 0a 20 20 6d 65 6d 64 62 44 6c 45 72 72   */.  memdbDlErr
0e40: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
0e50: 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
0e60: 2f 0a 20 20 6d 65 6d 64 62 44 6c 53 79 6d 2c 20  /.  memdbDlSym, 
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
0e90: 6d 65 6d 64 62 44 6c 43 6c 6f 73 65 2c 20 20 20  memdbDlClose,   
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0eb0: 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 6d 65  xDlClose */.  me
0ec0: 6d 64 62 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  mdbRandomness,  
0ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
0ee0: 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 6d  andomness */.  m
0ef0: 65 6d 64 62 53 6c 65 65 70 2c 20 20 20 20 20 20  emdbSleep,      
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
0f10: 53 6c 65 65 70 20 2a 2f 0a 20 20 6d 65 6d 64 62  Sleep */.  memdb
0f20: 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
0f30: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
0f40: 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  entTime */.  mem
0f50: 64 62 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  dbGetLastError, 
0f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65            /* xGe
0f70: 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
0f80: 6d 65 6d 64 62 43 75 72 72 65 6e 74 54 69 6d 65  memdbCurrentTime
0f90: 49 6e 74 36 34 20 20 20 20 20 20 20 20 2f 2a 20  Int64        /* 
0fa0: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
0fb0: 34 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  4 */.};..static 
0fc0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
0fd0: 5f 6d 65 74 68 6f 64 73 20 6d 65 6d 64 62 5f 69  _methods memdb_i
0fe0: 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  o_methods = {.  
0ff0: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
1020: 20 6d 65 6d 64 62 43 6c 6f 73 65 2c 20 20 20 20   memdbClose,    
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
1050: 20 6d 65 6d 64 62 52 65 61 64 2c 20 20 20 20 20   memdbRead,     
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
1080: 6d 65 6d 64 62 57 72 69 74 65 2c 20 20 20 20 20  memdbWrite,     
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
10b0: 6d 65 6d 64 62 54 72 75 6e 63 61 74 65 2c 20 20  memdbTruncate,  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
10e0: 0a 20 20 6d 65 6d 64 62 53 79 6e 63 2c 20 20 20  .  memdbSync,   
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
1110: 20 20 6d 65 6d 64 62 46 69 6c 65 53 69 7a 65 2c    memdbFileSize,
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
1140: 2a 2f 0a 20 20 6d 65 6d 64 62 4c 6f 63 6b 2c 20  */.  memdbLock, 
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1170: 2f 0a 20 20 6d 65 6d 64 62 4c 6f 63 6b 2c 20 20  /.  memdbLock,  
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
11a0: 2d 20 73 61 6d 65 20 61 73 20 78 4c 6f 63 6b 20  - same as xLock 
11b0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 2a 2f 20  in this case */ 
11c0: 0a 20 20 6d 65 6d 64 62 43 68 65 63 6b 52 65 73  .  memdbCheckRes
11d0: 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
11e0: 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
11f0: 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 6d  ervedLock */.  m
1200: 65 6d 64 62 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  emdbFileControl,
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
1230: 2a 2f 0a 20 20 6d 65 6d 64 62 53 65 63 74 6f 72  */.  memdbSector
1240: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1250: 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
1260: 53 69 7a 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 44  Size */.  memdbD
1270: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1280: 74 69 63 73 2c 20 20 20 20 20 20 2f 2a 20 78 44  tics,      /* xD
1290: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
12a0: 74 69 63 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20  tics */.  0,    
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
12d0: 68 6d 4d 61 70 20 2a 2f 0a 20 20 30 2c 20 20 20  hmMap */.  0,   
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1300: 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 30 2c 20  ShmLock */.  0, 
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1330: 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
1340: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
1370: 2a 2f 0a 20 20 6d 65 6d 64 62 46 65 74 63 68 2c  */.  memdbFetch,
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
13a0: 2a 2f 0a 20 20 6d 65 6d 64 62 55 6e 66 65 74 63  */.  memdbUnfetc
13b0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
13c0: 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
13d0: 68 20 2a 2f 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a 2a  h */.};..../*.**
13e0: 20 43 6c 6f 73 65 20 61 6e 20 6d 65 6d 64 62 2d   Close an memdb-
13f0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
1400: 70 44 61 74 61 20 70 6f 69 6e 74 65 72 20 69 73  pData pointer is
1410: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 61 70   owned by the ap
1420: 70 6c 69 63 61 74 69 6f 6e 2c 20 73 6f 20 74 68  plication, so th
1430: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 0a 2a  ere is nothing.*
1440: 2a 20 74 6f 20 66 72 65 65 2e 0a 2a 2f 0a 73 74  * to free..*/.st
1450: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 43 6c  atic int memdbCl
1460: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
1470: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4d 65 6d 46   *pFile){.  MemF
1480: 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c  ile *p = (MemFil
1490: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28  e *)pFile;.  if(
14a0: 20 70 2d 3e 6d 46 6c 61 67 73 20 26 20 53 51 4c   p->mFlags & SQL
14b0: 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f  ITE_DESERIALIZE_
14c0: 46 52 45 45 4f 4e 43 4c 4f 53 45 20 29 20 73 71  FREEONCLOSE ) sq
14d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 44  lite3_free(p->aD
14e0: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ata);.  return S
14f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1500: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
1510: 6d 20 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e  m an memdb-file.
1520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1530: 65 6d 64 62 52 65 61 64 28 0a 20 20 73 71 6c 69  emdbRead(.  sqli
1540: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1550: 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20   .  void *zBuf, 
1560: 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20  .  int iAmt, .  
1570: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
1580: 73 74 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20  st.){.  MemFile 
1590: 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29  *p = (MemFile *)
15a0: 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 69 4f 66  pFile;.  if( iOf
15b0: 73 74 2b 69 41 6d 74 3e 70 2d 3e 73 7a 20 29 7b  st+iAmt>p->sz ){
15c0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  .    memset(zBuf
15d0: 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20  , 0, iAmt);.    
15e0: 69 66 28 20 69 4f 66 73 74 3c 70 2d 3e 73 7a 20  if( iOfst<p->sz 
15f0: 29 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 70  ) memcpy(zBuf, p
1600: 2d 3e 61 44 61 74 61 2b 69 4f 66 73 74 2c 20 70  ->aData+iOfst, p
1610: 2d 3e 73 7a 20 2d 20 69 4f 66 73 74 29 3b 0a 20  ->sz - iOfst);. 
1620: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1630: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1640: 44 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  D;.  }.  memcpy(
1650: 7a 42 75 66 2c 20 70 2d 3e 61 44 61 74 61 2b 69  zBuf, p->aData+i
1660: 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 72  Ofst, iAmt);.  r
1670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1690: 20 65 6e 6c 61 72 67 65 20 74 68 65 20 6d 65 6d   enlarge the mem
16a0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74  ory allocation t
16b0: 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  o hold at least 
16c0: 73 7a 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  sz bytes.*/.stat
16d0: 69 63 20 69 6e 74 20 6d 65 6d 64 62 45 6e 6c 61  ic int memdbEnla
16e0: 72 67 65 28 4d 65 6d 46 69 6c 65 20 2a 70 2c 20  rge(MemFile *p, 
16f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
1700: 77 53 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  wSz){.  unsigned
1710: 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20 20 69   char *pNew;.  i
1720: 66 28 20 28 70 2d 3e 6d 46 6c 61 67 73 20 26 20  f( (p->mFlags & 
1730: 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49  SQLITE_DESERIALI
1740: 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 29 3d 3d  ZE_RESIZEABLE)==
1750: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1760: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 2d  E_FULL;.  if( p-
1770: 3e 6e 4d 6d 61 70 3e 30 20 29 20 72 65 74 75 72  >nMmap>0 ) retur
1780: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1790: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
17a0: 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 44 61  realloc64(p->aDa
17b0: 74 61 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 69 66  ta, newSz);.  if
17c0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
17d0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
17e0: 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 70 4e 65    p->aData = pNe
17f0: 77 3b 0a 20 20 70 2d 3e 73 7a 4d 61 78 20 3d 20  w;.  p->szMax = 
1800: 6e 65 77 53 7a 3b 0a 20 20 72 65 74 75 72 6e 20  newSz;.  return 
1810: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1820: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74  .** Write data t
1830: 6f 20 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e  o an memdb-file.
1840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1850: 65 6d 64 62 57 72 69 74 65 28 0a 20 20 73 71 6c  emdbWrite(.  sql
1860: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1870: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
1880: 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20  z,.  int iAmt,. 
1890: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f   sqlite_int64 iO
18a0: 66 73 74 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65  fst.){.  MemFile
18b0: 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a   *p = (MemFile *
18c0: 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 69 4f  )pFile;.  if( iO
18d0: 66 73 74 2b 69 41 6d 74 3e 70 2d 3e 73 7a 20 29  fst+iAmt>p->sz )
18e0: 7b 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 2b  {.    if( iOfst+
18f0: 69 41 6d 74 3e 70 2d 3e 73 7a 4d 61 78 20 26 26  iAmt>p->szMax &&
1900: 20 6d 65 6d 64 62 45 6e 6c 61 72 67 65 28 70 2c   memdbEnlarge(p,
1910: 20 28 69 4f 66 73 74 2b 69 41 6d 74 29 2a 32 29   (iOfst+iAmt)*2)
1920: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1930: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1940: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4f 66 73    }.    if( iOfs
1950: 74 3e 70 2d 3e 73 7a 20 29 20 6d 65 6d 73 65 74  t>p->sz ) memset
1960: 28 70 2d 3e 61 44 61 74 61 2b 70 2d 3e 73 7a 2c  (p->aData+p->sz,
1970: 20 30 2c 20 69 4f 66 73 74 2d 70 2d 3e 73 7a 29   0, iOfst-p->sz)
1980: 3b 0a 20 20 20 20 70 2d 3e 73 7a 20 3d 20 69 4f  ;.    p->sz = iO
1990: 66 73 74 2b 69 41 6d 74 3b 0a 20 20 7d 0a 20 20  fst+iAmt;.  }.  
19a0: 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2b  memcpy(p->aData+
19b0: 69 4f 66 73 74 2c 20 7a 2c 20 69 41 6d 74 29 3b  iOfst, z, iAmt);
19c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
19e0: 75 6e 63 61 74 65 20 61 6e 20 6d 65 6d 64 62 2d  uncate an memdb-
19f0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1a00: 69 6e 74 20 6d 65 6d 64 62 54 72 75 6e 63 61 74  int memdbTruncat
1a10: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1a20: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
1a30: 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 4d 65 6d  t64 size){.  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 73 69 7a 65 3e 70 2d 3e 73 7a 20 29 7b 0a  ( size>p->sz ){.
1a70: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 70 2d 3e      if( size>p->
1a80: 73 7a 4d 61 78 20 26 26 20 6d 65 6d 64 62 45 6e  szMax && memdbEn
1a90: 6c 61 72 67 65 28 70 2c 20 73 69 7a 65 29 20 29  large(p, size) )
1aa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1ab0: 55 4c 4c 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ULL;.    memset(
1ac0: 70 2d 3e 61 44 61 74 61 2b 70 2d 3e 73 7a 2c 20  p->aData+p->sz, 
1ad0: 30 2c 20 73 69 7a 65 2d 70 2d 3e 73 7a 29 3b 0a  0, size-p->sz);.
1ae0: 20 20 7d 0a 20 20 70 2d 3e 73 7a 20 3d 20 73 69    }.  p->sz = si
1af0: 7a 65 3b 20 0a 20 20 72 65 74 75 72 6e 20 53 51  ze; .  return SQ
1b00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b10: 2a 20 53 79 6e 63 20 61 6e 20 6d 65 6d 64 62 2d  * Sync an memdb-
1b20: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1b30: 69 6e 74 20 6d 65 6d 64 62 53 79 6e 63 28 73 71  int memdbSync(sq
1b40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1b50: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
1b60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
1b80: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  rn the current f
1b90: 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 6d  ile-size of an m
1ba0: 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  emdb-file..*/.st
1bb0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 69  atic int memdbFi
1bc0: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1bd0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
1be0: 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  te_int64 *pSize)
1bf0: 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d  {.  MemFile *p =
1c00: 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c   (MemFile *)pFil
1c10: 65 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 2d  e;.  *pSize = p-
1c20: 3e 73 7a 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  >sz;.  return SQ
1c30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c40: 2a 20 4c 6f 63 6b 20 61 6e 20 6d 65 6d 64 62 2d  * Lock an memdb-
1c50: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1c60: 69 6e 74 20 6d 65 6d 64 62 4c 6f 63 6b 28 73 71  int memdbLock(sq
1c70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1c80: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
1c90: 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d   MemFile *p = (M
1ca0: 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  emFile *)pFile;.
1cb0: 20 20 70 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f    p->eLock = eLo
1cc0: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ck;.  return SQL
1cd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ce0: 20 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65   Check if anothe
1cf0: 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f  r file-handle ho
1d00: 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
1d10: 6f 63 6b 20 6f 6e 20 61 6e 20 6d 65 6d 64 62 2d  ock on an memdb-
1d20: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1d30: 69 6e 74 20 6d 65 6d 64 62 43 68 65 63 6b 52 65  int memdbCheckRe
1d40: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
1d50: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1d60: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
1d70: 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
1d80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  K;.}../*.** File
1da0: 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
1db0: 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
1dc0: 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 6d 65 6d  ations on an mem
1dd0: 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  db-file..*/.stat
1de0: 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 69 6c 65  ic int memdbFile
1df0: 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1e00: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1e10: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1e20: 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d  {.  MemFile *p =
1e30: 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c   (MemFile *)pFil
1e40: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1e50: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
1e60: 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1e70: 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29 7b  FCNTL_VFSNAME ){
1e80: 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41  .    *(char**)pA
1e90: 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
1ea0: 69 6e 74 66 28 22 6d 65 6d 64 62 28 25 70 2c 25  intf("memdb(%p,%
1eb0: 6c 6c 64 29 22 2c 20 70 2d 3e 61 44 61 74 61 2c  lld)", p->aData,
1ec0: 20 70 2d 3e 73 7a 29 3b 0a 20 20 20 20 72 63 20   p->sz);.    rc 
1ed0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ef0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f00: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
1f10: 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 6d 65   bytes for an me
1f20: 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  mdb-file..*/.sta
1f30: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 53 65 63  tic int memdbSec
1f40: 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1f50: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1f60: 72 65 74 75 72 6e 20 31 30 32 34 3b 0a 7d 0a 0a  return 1024;.}..
1f70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f80: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1f90: 72 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70  ristic flags sup
1fa0: 70 6f 72 74 65 64 20 62 79 20 61 6e 20 6d 65 6d  ported by an mem
1fb0: 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  db-file..*/.stat
1fc0: 69 63 20 69 6e 74 20 6d 65 6d 64 62 44 65 76 69  ic int memdbDevi
1fd0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fe0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1ff0: 70 46 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e  pFile){.  return
2000: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
2010: 4f 4d 49 43 20 7c 20 0a 20 20 20 20 20 20 20 20  OMIC | .        
2020: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2030: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2040: 45 20 7c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  E |.         SQL
2050: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
2060: 50 50 45 4e 44 20 7c 0a 20 20 20 20 20 20 20 20  PPEND |.        
2070: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
2080: 51 55 45 4e 54 49 41 4c 3b 0a 7d 0a 0a 2f 2a 20  QUENTIAL;.}../* 
2090: 46 65 74 63 68 20 61 20 70 61 67 65 20 6f 66 20  Fetch a page of 
20a0: 61 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  a memory-mapped 
20b0: 66 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  file */.static i
20c0: 6e 74 20 6d 65 6d 64 62 46 65 74 63 68 28 0a 20  nt memdbFetch(. 
20d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
20e0: 46 69 6c 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f  File,.  sqlite3_
20f0: 69 6e 74 36 34 20 69 4f 66 73 74 2c 0a 20 20 69  int64 iOfst,.  i
2100: 6e 74 20 69 41 6d 74 2c 0a 20 20 76 6f 69 64 20  nt iAmt,.  void 
2110: 2a 2a 70 70 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c  **pp.){.  MemFil
2120: 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20  e *p = (MemFile 
2130: 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 6e 4d  *)pFile;.  p->nM
2140: 6d 61 70 2b 2b 3b 0a 20 20 2a 70 70 20 3d 20 28  map++;.  *pp = (
2150: 76 6f 69 64 2a 29 28 70 2d 3e 61 44 61 74 61 20  void*)(p->aData 
2160: 2b 20 69 4f 66 73 74 29 3b 0a 20 20 72 65 74 75  + iOfst);.  retu
2170: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2180: 0a 2f 2a 20 52 65 6c 65 61 73 65 20 61 20 6d 65  ./* Release a me
2190: 6d 6f 72 79 2d 6d 61 70 70 65 64 20 70 61 67 65  mory-mapped page
21a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
21b0: 65 6d 64 62 55 6e 66 65 74 63 68 28 73 71 6c 69  emdbUnfetch(sqli
21c0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
21d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
21e0: 4f 66 73 74 2c 20 76 6f 69 64 20 2a 70 50 61 67  Ofst, void *pPag
21f0: 65 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70  e){.  MemFile *p
2200: 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70 46   = (MemFile *)pF
2210: 69 6c 65 3b 0a 20 20 70 2d 3e 6e 4d 6d 61 70 2d  ile;.  p->nMmap-
2220: 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2230: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2240: 4f 70 65 6e 20 61 6e 20 6d 65 6d 20 66 69 6c 65  Open an mem file
2250: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
2260: 69 63 20 69 6e 74 20 6d 65 6d 64 62 4f 70 65 6e  ic int memdbOpen
2270: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2280: 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
2290: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71  har *zName,.  sq
22a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
22b0: 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a  e,.  int flags,.
22c0: 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
22d0: 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70  .){.  MemFile *p
22e0: 20 3d 20 28 4d 65 6d 46 69 6c 65 2a 29 70 46 69   = (MemFile*)pFi
22f0: 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  le;.  memset(p, 
2300: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
2310: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
2320: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2330: 44 42 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  DB)==0 ) return 
2340: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
2350: 0a 20 20 70 2d 3e 6d 46 6c 61 67 73 20 3d 20 53  .  p->mFlags = S
2360: 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a  QLITE_DESERIALIZ
2370: 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 20 53  E_RESIZEABLE | S
2380: 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a  QLITE_DESERIALIZ
2390: 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 3b 0a 20  E_FREEONCLOSE;. 
23a0: 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
23b0: 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
23c0: 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 70 2d 3e 62  N_MEMORY;.  p->b
23d0: 61 73 65 2e 70 4d 65 74 68 6f 64 73 20 3d 20 26  ase.pMethods = &
23e0: 6d 65 6d 64 62 5f 69 6f 5f 6d 65 74 68 6f 64 73  memdb_io_methods
23f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2400: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
2410: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c  elete the file l
2420: 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e  ocated at zPath.
2430: 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
2440: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
2450: 2c 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 65 20  ,.** ensure the 
2460: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6d 6f 64 69  file-system modi
2470: 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20 73 79  fications are sy
2480: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 62 65 66  nced to disk bef
2490: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
24a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24b0: 6d 65 6d 64 62 44 65 6c 65 74 65 28 73 71 6c 69  memdbDelete(sqli
24c0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
24d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
24e0: 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a  , int dirSync){.
24f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2500: 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d 0a  IOERR_DELETE;.}.
2510: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
2520: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
2530: 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
2540: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
2550: 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
2560: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
2570: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2590: 65 6d 64 62 41 63 63 65 73 73 28 0a 20 20 73 71  emdbAccess(.  sq
25a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
25b0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
25c0: 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c  zPath, .  int fl
25d0: 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65  ags, .  int *pRe
25e0: 73 4f 75 74 0a 29 7b 0a 20 20 2a 70 52 65 73 4f  sOut.){.  *pResO
25f0: 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
2600: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2610: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75  *.** Populate bu
2620: 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74  ffer zOut with t
2630: 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61  he full canonica
2640: 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65  l pathname corre
2650: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74  sponding.** to t
2660: 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a  he pathname in z
2670: 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75  Path. zOut is gu
2680: 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e  aranteed to poin
2690: 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a  t to a buffer.**
26a0: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 49 4e   of at least (IN
26b0: 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  ST_MAX_PATHNAME+
26c0: 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  1) bytes..*/.sta
26d0: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 75 6c  tic int memdbFul
26e0: 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
26f0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2700: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2710: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
2720: 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
2730: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  .){.  sqlite3_sn
2740: 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
2750: 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
2760: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2770: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  _OK;.}../*.** Op
2780: 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  en the dynamic l
2790: 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61  ibrary located a
27a0: 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75  t zPath and retu
27b0: 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  rn a handle..*/.
27c0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d  static void *mem
27d0: 64 62 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  dbDlOpen(sqlite3
27e0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
27f0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
2800: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
2810: 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28  (pVfs)->xDlOpen(
2820: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 7a  ORIGVFS(pVfs), z
2830: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
2840: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
2850: 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a  fer zErrMsg (siz
2860: 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77  e nByte bytes) w
2870: 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64  ith a human read
2880: 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74  able.** utf-8 st
2890: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
28a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
28b0: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
28c0: 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  d associated .**
28d0: 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69   with dynamic li
28e0: 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  braries..*/.stat
28f0: 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 45  ic void memdbDlE
2900: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2910: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74   *pVfs, int nByt
2920: 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
2930: 29 7b 0a 20 20 4f 52 49 47 56 46 53 28 70 56 66  ){.  ORIGVFS(pVf
2940: 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 4f 52 49  s)->xDlError(ORI
2950: 47 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74  GVFS(pVfs), nByt
2960: 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a  e, zErrMsg);.}..
2970: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2980: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 79  ointer to the sy
2990: 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20  mbol zSymbol in 
29a0: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
29b0: 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a  ary pHandle..*/.
29c0: 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 6d 65  static void (*me
29d0: 6d 64 62 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  mdbDlSym(sqlite3
29e0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
29f0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2a00: 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2a10: 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28   return ORIGVFS(
2a20: 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28 4f 52  pVfs)->xDlSym(OR
2a30: 49 47 56 46 53 28 70 56 66 73 29 2c 20 70 2c 20  IGVFS(pVfs), p, 
2a40: 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zSym);.}../*.** 
2a50: 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61 6d 69  Close the dynami
2a60: 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64 6c 65  c library handle
2a70: 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61   pHandle..*/.sta
2a80: 74 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c  tic void memdbDl
2a90: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
2aa0: 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
2ab0: 48 61 6e 64 6c 65 29 7b 0a 20 20 4f 52 49 47 56  Handle){.  ORIGV
2ac0: 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 43 6c 6f  FS(pVfs)->xDlClo
2ad0: 73 65 28 4f 52 49 47 56 46 53 28 70 56 66 73 29  se(ORIGVFS(pVfs)
2ae0: 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f  , pHandle);.}../
2af0: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
2b00: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
2b10: 20 74 6f 20 62 79 20 7a 42 75 66 4f 75 74 20 77   to by zBufOut w
2b20: 69 74 68 20 6e 42 79 74 65 20 62 79 74 65 73 20  ith nByte bytes 
2b30: 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61  of .** random da
2b40: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ta..*/.static in
2b50: 74 20 6d 65 6d 64 62 52 61 6e 64 6f 6d 6e 65 73  t memdbRandomnes
2b60: 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
2b70: 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
2b80: 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
2b90: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
2ba0: 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f 6d 6e  (pVfs)->xRandomn
2bb0: 65 73 73 28 4f 52 49 47 56 46 53 28 70 56 66 73  ess(ORIGVFS(pVfs
2bc0: 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75  ), nByte, zBufOu
2bd0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  t);.}../*.** Sle
2be0: 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69  ep for nMicro mi
2bf0: 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75  croseconds. Retu
2c00: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2c10: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a   microseconds .*
2c20: 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74  * actually slept
2c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c40: 6d 65 6d 64 62 53 6c 65 65 70 28 73 71 6c 69 74  memdbSleep(sqlit
2c50: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2c60: 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65 74  t nMicro){.  ret
2c70: 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73  urn ORIGVFS(pVfs
2c80: 29 2d 3e 78 53 6c 65 65 70 28 4f 52 49 47 56 46  )->xSleep(ORIGVF
2c90: 53 28 70 56 66 73 29 2c 20 6e 4d 69 63 72 6f 29  S(pVfs), nMicro)
2ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2cb0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
2cc0: 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  me as a Julian D
2cd0: 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54  ay number in *pT
2ce0: 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  imeOut..*/.stati
2cf0: 63 20 69 6e 74 20 6d 65 6d 64 62 43 75 72 72 65  c int memdbCurre
2d00: 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2d10: 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
2d20: 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72   *pTimeOut){.  r
2d30: 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
2d40: 66 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  fs)->xCurrentTim
2d50: 65 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c  e(ORIGVFS(pVfs),
2d60: 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 73   pTimeOut);.}..s
2d70: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 47  tatic int memdbG
2d80: 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2d90: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2da0: 6e 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a  nt a, char *b){.
2db0: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
2dc0: 28 70 56 66 73 29 2d 3e 78 47 65 74 4c 61 73 74  (pVfs)->xGetLast
2dd0: 45 72 72 6f 72 28 4f 52 49 47 56 46 53 28 70 56  Error(ORIGVFS(pV
2de0: 66 73 29 2c 20 61 2c 20 62 29 3b 0a 7d 0a 73 74  fs), a, b);.}.st
2df0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 43 75  atic int memdbCu
2e00: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
2e10: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2e20: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2e30: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52  *p){.  return OR
2e40: 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75  IGVFS(pVfs)->xCu
2e50: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 4f  rrentTimeInt64(O
2e60: 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 70 29  RIGVFS(pVfs), p)
2e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
2e80: 6c 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  late a database 
2e90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
2ea0: 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20 6e 61  er and schema na
2eb0: 6d 65 20 69 6e 74 6f 20 61 0a 2a 2a 20 4d 65 6d  me into a.** Mem
2ec0: 46 69 6c 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  File pointer..*/
2ed0: 0a 73 74 61 74 69 63 20 4d 65 6d 46 69 6c 65 20  .static MemFile 
2ee0: 2a 6d 65 6d 64 62 46 72 6f 6d 44 62 53 63 68 65  *memdbFromDbSche
2ef0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
2f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
2f10: 65 6d 61 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20  ema){.  MemFile 
2f20: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  *p = 0;.  int rc
2f30: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
2f40: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 53 63 68  control(db, zSch
2f50: 65 6d 61 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ema, SQLITE_FCNT
2f60: 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20  L_FILE_POINTER, 
2f70: 26 70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  &p);.  if( rc ) 
2f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
2f90: 70 2d 3e 62 61 73 65 2e 70 4d 65 74 68 6f 64 73  p->base.pMethods
2fa0: 21 3d 26 6d 65 6d 64 62 5f 69 6f 5f 6d 65 74 68  !=&memdb_io_meth
2fb0: 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ods ) return 0;.
2fc0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2fd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2fe0: 73 65 72 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  serialization of
2ff0: 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 75   a database.*/.u
3000: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 71  nsigned char *sq
3010: 6c 69 74 65 33 5f 73 65 72 69 61 6c 69 7a 65 28  lite3_serialize(
3020: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3040: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
3050: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
3060: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
3070: 2c 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  ,      /* Which 
3080: 64 61 74 61 62 61 73 65 20 77 69 74 68 69 6e 20  database within 
3090: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  the connection *
30a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
30b0: 34 20 2a 70 69 53 69 7a 65 2c 20 20 20 20 2f 2a  4 *piSize,    /*
30c0: 20 57 72 69 74 65 20 73 69 7a 65 20 68 65 72 65   Write size here
30d0: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
30e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
30f0: 6d 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  mFlags       /* 
3100: 4d 61 79 62 65 20 53 51 4c 49 54 45 5f 53 45 52  Maybe SQLITE_SER
3110: 49 41 4c 49 5a 45 5f 4e 4f 43 4f 50 59 20 2a 2f  IALIZE_NOCOPY */
3120: 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70  .){.  MemFile *p
3130: 20 3d 20 6d 65 6d 64 62 46 72 6f 6d 44 62 53 63   = memdbFromDbSc
3140: 68 65 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d 61  hema(db, zSchema
3150: 29 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  );.  int iDb = s
3160: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
3170: 28 64 62 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20  (db, zSchema);. 
3180: 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 73   Btree *pBt;.  s
3190: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
31a0: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20  .  int szPage = 
31b0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
31c0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
31d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31e0: 4f 75 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  Out;.  char *zSq
31f0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
3200: 69 66 28 20 70 69 53 69 7a 65 20 29 20 2a 70 69  if( piSize ) *pi
3210: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 69 66 28  Size = -1;.  if(
3220: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 20   iDb<0 ) return 
3230: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
3240: 20 20 69 66 28 20 70 69 53 69 7a 65 20 29 20 2a    if( piSize ) *
3250: 70 69 53 69 7a 65 20 3d 20 70 2d 3e 73 7a 3b 0a  piSize = p->sz;.
3260: 20 20 20 20 69 66 28 20 6d 46 6c 61 67 73 20 26      if( mFlags &
3270: 20 53 51 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a   SQLITE_SERIALIZ
3280: 45 5f 4e 4f 43 4f 50 59 20 29 7b 0a 20 20 20 20  E_NOCOPY ){.    
3290: 20 20 70 4f 75 74 20 3d 20 70 2d 3e 61 44 61 74    pOut = p->aDat
32a0: 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a;.    }else{.  
32b0: 20 20 20 20 70 4f 75 74 20 3d 20 73 71 6c 69 74      pOut = sqlit
32c0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 2d 3e  e3_malloc64( p->
32d0: 73 7a 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sz );.      if( 
32e0: 70 4f 75 74 20 29 20 6d 65 6d 63 70 79 28 70 4f  pOut ) memcpy(pO
32f0: 75 74 2c 20 70 2d 3e 61 44 61 74 61 2c 20 70 2d  ut, p->aData, p-
3300: 3e 73 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >sz);.    }.    
3310: 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20 7d  return pOut;.  }
3320: 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
3330: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 69 66 28  [iDb].pBt;.  if(
3340: 20 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e   pBt==0 ) return
3350: 20 30 3b 0a 20 20 73 7a 50 61 67 65 20 3d 20 73   0;.  szPage = s
3360: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
3370: 67 65 53 69 7a 65 28 70 42 74 29 3b 0a 20 20 7a  geSize(pBt);.  z
3380: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
3390: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 5c 22  rintf("PRAGMA \"
33a0: 25 77 5c 22 2e 70 61 67 65 5f 63 6f 75 6e 74 22  %w\".page_count"
33b0: 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 72 63  , zSchema);.  rc
33c0: 20 3d 20 7a 53 71 6c 20 3f 20 73 71 6c 69 74 65   = zSql ? sqlite
33d0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
33e0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
33f0: 74 2c 20 30 29 20 3a 20 53 51 4c 49 54 45 5f 4e  t, 0) : SQLITE_N
3400: 4f 4d 45 4d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OMEM;.  sqlite3_
3410: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
3420: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
3430: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
3440: 70 53 74 6d 74 29 3b 0a 20 20 73 7a 20 3d 20 73  pStmt);.  sz = s
3450: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
3460: 74 36 34 28 70 53 74 6d 74 2c 20 30 29 2a 73 7a  t64(pStmt, 0)*sz
3470: 50 61 67 65 3b 0a 20 20 69 66 28 20 70 69 53 69  Page;.  if( piSi
3480: 7a 65 20 29 20 2a 70 69 53 69 7a 65 20 3d 20 73  ze ) *piSize = s
3490: 7a 3b 0a 20 20 69 66 28 20 6d 46 6c 61 67 73 20  z;.  if( mFlags 
34a0: 26 20 53 51 4c 49 54 45 5f 53 45 52 49 41 4c 49  & SQLITE_SERIALI
34b0: 5a 45 5f 4e 4f 43 4f 50 59 20 29 7b 0a 20 20 20  ZE_NOCOPY ){.   
34c0: 20 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 65 6c   pOut = 0;.  }el
34d0: 73 65 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 73  se{.    pOut = s
34e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
34f0: 20 73 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70   sz );.    if( p
3500: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Out ){.      int
3510: 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
3520: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
3530: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 50 61 67  t, 0);.      Pag
3540: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
3550: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
3560: 42 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Bt);.      int p
3570: 67 6e 6f 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  gno;.      for(p
3580: 67 6e 6f 3d 31 3b 20 70 67 6e 6f 3c 3d 6e 50 61  gno=1; pgno<=nPa
3590: 67 65 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20  ge; pgno++){.   
35a0: 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 50 61       DbPage *pPa
35b0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
35c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
35d0: 54 6f 20 3d 20 70 4f 75 74 20 2b 20 73 7a 50 61  To = pOut + szPa
35e0: 67 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ge*(sqlite3_int6
35f0: 34 29 28 70 67 6e 6f 2d 31 29 3b 0a 20 20 20 20  4)(pgno-1);.    
3600: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3610: 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
3620: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
3630: 29 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  )&pPage, 0);.   
3640: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3650: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3660: 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20      memcpy(pTo, 
3670: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3680: 61 74 61 28 70 50 61 67 65 29 2c 20 73 7a 50 61  ata(pPage), szPa
3690: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ge);.        }el
36a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
36b0: 6d 73 65 74 28 70 54 6f 2c 20 30 2c 20 73 7a 50  mset(pTo, 0, szP
36c0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
36d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
36e0: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
36f0: 3b 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 7d  ;       .      }
3700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3710: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3720: 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tmt);.  return p
3730: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 76 65  Out;.}../* Conve
3740: 72 74 20 7a 53 63 68 65 6d 61 20 74 6f 20 61 20  rt zSchema to a 
3750: 4d 65 6d 44 42 20 61 6e 64 20 69 6e 69 74 69 61  MemDB and initia
3760: 6c 69 7a 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  lize its content
3770: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3780: 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 0a 20 20  _deserialize(.  
3790: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
37a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
37b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
37c0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
37d0: 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20 20  ar *zSchema,    
37e0: 2f 2a 20 57 68 69 63 68 20 44 42 20 74 6f 20 72  /* Which DB to r
37f0: 65 6f 70 65 6e 20 77 69 74 68 20 74 68 65 20 64  eopen with the d
3800: 65 73 65 72 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  eserialization *
3810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
3820: 72 20 2a 70 44 61 74 61 2c 20 20 20 2f 2a 20 54  r *pData,   /* T
3830: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
3840: 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 2a  tabase content *
3850: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
3860: 34 20 73 7a 44 62 2c 20 20 20 20 20 2f 2a 20 4e  4 szDb,     /* N
3870: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 74  umber bytes in t
3880: 68 65 20 64 65 73 65 72 69 61 6c 69 7a 61 74 69  he deserializati
3890: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
38a0: 69 6e 74 36 34 20 73 7a 42 75 66 2c 20 20 20 20  int64 szBuf,    
38b0: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
38c0: 20 62 75 66 66 65 72 20 70 44 61 74 61 5b 5d 20   buffer pData[] 
38d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 46  */.  unsigned mF
38e0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 2f 2a 20  lags         /* 
38f0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c  Zero or more SQL
3900: 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f  ITE_DESERIALIZE_
3910: 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
3920: 4d 65 6d 46 69 6c 65 20 2a 70 3b 0a 20 20 63 68  MemFile *p;.  ch
3930: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69  ar *zSql;.  sqli
3940: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
3950: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
3960: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 73 71 6c   int iDb;..  sql
3970: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
3980: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
3990: 66 28 20 7a 53 63 68 65 6d 61 3d 3d 30 20 29 20  f( zSchema==0 ) 
39a0: 7a 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  zSchema = db->aD
39b0: 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  b[0].zDbSName;. 
39c0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
39d0: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 53 63  ndDbName(db, zSc
39e0: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 69 44 62  hema);.  if( iDb
39f0: 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
3a00: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3a10: 20 67 6f 74 6f 20 65 6e 64 5f 64 65 73 65 72 69   goto end_deseri
3a20: 61 6c 69 7a 65 3b 0a 20 20 7d 20 20 20 20 0a 20  alize;.  }    . 
3a30: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
3a40: 6d 70 72 69 6e 74 66 28 22 41 54 54 41 43 48 20  mprintf("ATTACH 
3a50: 78 20 41 53 20 25 51 22 2c 20 7a 53 63 68 65 6d  x AS %Q", zSchem
3a60: 61 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  a);.  rc = sqlit
3a70: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
3a80: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
3a90: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
3aa0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
3ab0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
3ac0: 64 5f 64 65 73 65 72 69 61 6c 69 7a 65 3b 0a 20  d_deserialize;. 
3ad0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20   db->init.iDb = 
3ae0: 28 75 38 29 69 44 62 3b 0a 20 20 64 62 2d 3e 69  (u8)iDb;.  db->i
3af0: 6e 69 74 2e 72 65 6f 70 65 6e 4d 65 6d 64 62 20  nit.reopenMemdb 
3b00: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
3b10: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
3b20: 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 72 65 6f 70  .  db->init.reop
3b30: 65 6e 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 69  enMemdb = 0;.  i
3b40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
3b50: 4e 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  NE ){.    rc = S
3b60: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3b70: 20 67 6f 74 6f 20 65 6e 64 5f 64 65 73 65 72 69   goto end_deseri
3b80: 61 6c 69 7a 65 3b 0a 20 20 7d 0a 20 20 70 20 3d  alize;.  }.  p =
3b90: 20 6d 65 6d 64 62 46 72 6f 6d 44 62 53 63 68 65   memdbFromDbSche
3ba0: 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d 61 29 3b  ma(db, zSchema);
3bb0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
3bc0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
3bd0: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
3be0: 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 70 44     p->aData = pD
3bf0: 61 74 61 3b 0a 20 20 20 20 70 2d 3e 73 7a 20 3d  ata;.    p->sz =
3c00: 20 73 7a 44 62 3b 0a 20 20 20 20 70 2d 3e 73 7a   szDb;.    p->sz
3c10: 4d 61 78 20 3d 20 73 7a 42 75 66 3b 0a 20 20 20  Max = szBuf;.   
3c20: 20 70 2d 3e 6d 46 6c 61 67 73 20 3d 20 6d 46 6c   p->mFlags = mFl
3c30: 61 67 73 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ags;.    rc = SQ
3c40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64  LITE_OK;.  }.end
3c50: 5f 64 65 73 65 72 69 61 6c 69 7a 65 3a 0a 20 20  _deserialize:.  
3c60: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3c70: 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
3c80: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
3c90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
3ca0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
3cb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3cc0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
3cd0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6c  e extension is l
3ce0: 6f 61 64 65 64 2e 0a 2a 2a 20 52 65 67 69 73 74  oaded..** Regist
3cf0: 65 72 20 74 68 65 20 6e 65 77 20 56 46 53 2e 0a  er the new VFS..
3d00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
3d10: 6d 64 62 49 6e 69 74 28 76 6f 69 64 29 7b 0a 20  mdbInit(void){. 
3d20: 20 6d 65 6d 64 62 5f 76 66 73 2e 70 41 70 70 44   memdb_vfs.pAppD
3d30: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ata = sqlite3_vf
3d40: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 6d 65 6d  s_find(0);.  mem
3d50: 64 62 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20  db_vfs.szOsFile 
3d60: 3d 20 73 69 7a 65 6f 66 28 4d 65 6d 46 69 6c 65  = sizeof(MemFile
3d70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
3d80: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
3d90: 28 26 6d 65 6d 64 62 5f 76 66 73 2c 20 30 29 3b  (&memdb_vfs, 0);
3da0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3db0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 44 42  ITE_ENABLE_MEMDB
3dc0: 20 2a 2f 0a                                       */.