/ Hex Artifact Content
Login

Artifact d95f6ad26f7c582026c5501b32dc0201ce781ad496bc61107d759b5e4e5c563a:


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: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 56 46 53  an in-memory VFS
01a0: 2e 20 41 20 64 61 74 61 62 61 73 65 20 69 73 20  . A database is 
01b0: 68 65 6c 64 20 61 73 20 61 20 63 6f 6e 74 69 67  held as a contig
01c0: 75 6f 75 73 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66  uous.** block of
01d0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
01e0: 68 69 73 20 66 69 6c 65 20 61 6c 73 6f 20 69 6d  his file also im
01f0: 70 6c 65 6d 65 6e 74 73 20 69 6e 74 65 72 66 61  plements interfa
0200: 63 65 20 73 71 6c 69 74 65 33 5f 73 65 72 69 61  ce sqlite3_seria
0210: 6c 69 7a 65 28 29 20 61 6e 64 0a 2a 2a 20 73 71  lize() and.** sq
0220: 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a  lite3_deserializ
0230: 65 28 29 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  e()..*/.#include
0240: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0250: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0260: 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a  BLE_DESERIALIZE.
0270: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
0280: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6f 62  eclaration of ob
0290: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
02a0: 69 73 20 75 74 69 6c 69 74 79 0a 2a 2f 0a 74 79  is utility.*/.ty
02b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c  pedef struct sql
02c0: 69 74 65 33 5f 76 66 73 20 4d 65 6d 56 66 73 3b  ite3_vfs MemVfs;
02d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
02e0: 4d 65 6d 46 69 6c 65 20 4d 65 6d 46 69 6c 65 3b  MemFile MemFile;
02f0: 0a 0a 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 61  ../* Access to a
0300: 20 6c 6f 77 65 72 2d 6c 65 76 65 6c 20 56 46 53   lower-level VFS
0310: 20 74 68 61 74 20 28 6d 69 67 68 74 29 20 69 6d   that (might) im
0320: 70 6c 65 6d 65 6e 74 20 64 79 6e 61 6d 69 63 20  plement dynamic 
0330: 6c 6f 61 64 69 6e 67 2c 0a 2a 2a 20 61 63 63 65  loading,.** acce
0340: 73 73 20 74 6f 20 72 61 6e 64 6f 6d 6e 65 73 73  ss to randomness
0350: 2c 20 65 74 63 2e 0a 2a 2f 0a 23 64 65 66 69 6e  , etc..*/.#defin
0360: 65 20 4f 52 49 47 56 46 53 28 70 29 20 28 28 73  e ORIGVFS(p) ((s
0370: 71 6c 69 74 65 33 5f 76 66 73 2a 29 28 28 70 29  qlite3_vfs*)((p)
0380: 2d 3e 70 41 70 70 44 61 74 61 29 29 0a 0a 2f 2a  ->pAppData))../*
0390: 20 41 6e 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f   An open file */
03a0: 0a 73 74 72 75 63 74 20 4d 65 6d 46 69 6c 65 20  .struct MemFile 
03b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
03c0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
03d0: 20 20 20 20 2f 2a 20 49 4f 20 6d 65 74 68 6f 64      /* IO method
03e0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
03f0: 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
0400: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0410: 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
0420: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
0430: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
0440: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
0450: 65 64 20 74 6f 20 61 44 61 74 61 20 2a 2f 0a 20  ed to aData */. 
0460: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
0470: 7a 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 20  zMax;           
0480: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
0490: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
04a0: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  file */.  unsign
04b0: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  ed char *aData; 
04c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
04d0: 74 65 6e 74 20 6f 66 20 74 68 65 20 66 69 6c 65  tent of the file
04e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 3b   */.  int nMmap;
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0510: 6f 66 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  of memory mapped
0520: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69   pages */.  unsi
0530: 67 6e 65 64 20 6d 46 6c 61 67 73 3b 20 20 20 20  gned mFlags;    
0540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
0550: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 65 4c  lags */.  int eL
0560: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
0570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
0580: 74 20 72 65 63 65 6e 74 20 6c 6f 63 6b 20 61 67  t recent lock ag
0590: 61 69 6e 73 74 20 74 68 69 73 20 66 69 6c 65 20  ainst this file 
05a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 64 65  */.};../* The de
05b0: 66 61 75 6c 74 20 6d 61 78 69 6d 75 6d 20 73 69  fault maximum si
05c0: 7a 65 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ze of an in-memo
05d0: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 23  ry database */.#
05e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  ifndef SQLITE_ME
05f0: 4d 44 42 5f 44 45 46 41 55 4c 54 5f 4d 41 58 53  MDB_DEFAULT_MAXS
0600: 49 5a 45 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  IZE.# define SQL
0610: 49 54 45 5f 4d 45 4d 44 42 5f 44 45 46 41 55 4c  ITE_MEMDB_DEFAUL
0620: 54 5f 4d 41 58 53 49 5a 45 20 31 30 37 33 37 34  T_MAXSIZE 107374
0630: 31 38 32 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1824.#endif../*.
0640: 2a 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 4d  ** Methods for M
0650: 65 6d 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63  emFile.*/.static
0660: 20 69 6e 74 20 6d 65 6d 64 62 43 6c 6f 73 65 28   int memdbClose(
0670: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
0680: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62  static int memdb
0690: 52 65 61 64 28 73 71 6c 69 74 65 33 5f 66 69 6c  Read(sqlite3_fil
06a0: 65 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69  e*, void*, int i
06b0: 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Amt, sqlite3_int
06c0: 36 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69  64 iOfst);.stati
06d0: 63 20 69 6e 74 20 6d 65 6d 64 62 57 72 69 74 65  c int memdbWrite
06e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 63  (sqlite3_file*,c
06f0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 20 69  onst void*,int i
0700: 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Amt, sqlite3_int
0710: 36 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69  64 iOfst);.stati
0720: 63 20 69 6e 74 20 6d 65 6d 64 62 54 72 75 6e 63  c int memdbTrunc
0730: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
0740: 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
0750: 20 73 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69   size);.static i
0760: 6e 74 20 6d 65 6d 64 62 53 79 6e 63 28 73 71 6c  nt memdbSync(sql
0770: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
0780: 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69  flags);.static i
0790: 6e 74 20 6d 65 6d 64 62 46 69 6c 65 53 69 7a 65  nt memdbFileSize
07a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
07b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
07c0: 53 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e  Size);.static in
07d0: 74 20 6d 65 6d 64 62 4c 6f 63 6b 28 73 71 6c 69  t memdbLock(sqli
07e0: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
07f0: 0a 2f 2a 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ./* static int m
0800: 65 6d 64 62 43 68 65 63 6b 52 65 73 65 72 76 65  emdbCheckReserve
0810: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
0820: 6c 65 2a 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  le*, int *pResOu
0830: 74 29 3b 2f 2f 20 6e 6f 74 20 75 73 65 64 20 2a  t);// not used *
0840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
0850: 64 62 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  dbFileControl(sq
0860: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
0870: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
0880: 3b 0a 2f 2a 20 73 74 61 74 69 63 20 69 6e 74 20  ;./* static int 
0890: 6d 65 6d 64 62 53 65 63 74 6f 72 53 69 7a 65 28  memdbSectorSize(
08a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 20  sqlite3_file*); 
08b0: 2f 2f 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 73  // not used */.s
08c0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 44  tatic int memdbD
08d0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
08e0: 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
08f0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
0900: 6d 65 6d 64 62 46 65 74 63 68 28 73 71 6c 69 74  memdbFetch(sqlit
0910: 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65  e3_file*, sqlite
0920: 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c 20 69  3_int64 iOfst, i
0930: 6e 74 20 69 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt iAmt, void **
0940: 70 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  pp);.static int 
0950: 6d 65 6d 64 62 55 6e 66 65 74 63 68 28 73 71 6c  memdbUnfetch(sql
0960: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69  ite3_file*, sqli
0970: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c  te3_int64 iOfst,
0980: 20 76 6f 69 64 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a   void *p);../*.*
0990: 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 4d 65  * Methods for Me
09a0: 6d 56 66 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mVfs.*/.static i
09b0: 6e 74 20 6d 65 6d 64 62 4f 70 65 6e 28 73 71 6c  nt memdbOpen(sql
09c0: 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74  ite3_vfs*, const
09d0: 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33   char *, sqlite3
09e0: 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e  _file*, int , in
09f0: 74 20 2a 29 3b 0a 2f 2a 20 73 74 61 74 69 63 20  t *);./* static 
0a00: 69 6e 74 20 6d 65 6d 64 62 44 65 6c 65 74 65 28  int memdbDelete(
0a10: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
0a20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
0a30: 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b 20 2a   int syncDir); *
0a40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
0a50: 64 62 41 63 63 65 73 73 28 73 71 6c 69 74 65 33  dbAccess(sqlite3
0a60: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
0a70: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c  r *zName, int fl
0a80: 61 67 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61  ags, int *);.sta
0a90: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 75 6c  tic int memdbFul
0aa0: 6c 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65  lPathname(sqlite
0ab0: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
0ac0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20  ar *zName, int, 
0ad0: 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61  char *zOut);.sta
0ae0: 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 64 62 44  tic void *memdbD
0af0: 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
0b00: 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  s*, const char *
0b10: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74  zFilename);.stat
0b20: 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 45  ic void memdbDlE
0b30: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
0b40: 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  *, int nByte, ch
0b50: 61 72 20 2a 7a 45 72 72 4d 73 67 29 3b 0a 73 74  ar *zErrMsg);.st
0b60: 61 74 69 63 20 76 6f 69 64 20 28 2a 6d 65 6d 64  atic void (*memd
0b70: 62 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  bDlSym(sqlite3_v
0b80: 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
0b90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
0ba0: 79 6d 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74  ym))(void);.stat
0bb0: 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 43  ic void memdbDlC
0bc0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
0bd0: 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 61 74 69  *, void*);.stati
0be0: 63 20 69 6e 74 20 6d 65 6d 64 62 52 61 6e 64 6f  c int memdbRando
0bf0: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
0c00: 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  s*, int nByte, c
0c10: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
0c20: 69 63 20 69 6e 74 20 6d 65 6d 64 62 53 6c 65 65  ic int memdbSlee
0c30: 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  p(sqlite3_vfs*, 
0c40: 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
0c50: 29 3b 0a 2f 2a 20 73 74 61 74 69 63 20 69 6e 74  );./* static int
0c60: 20 6d 65 6d 64 62 43 75 72 72 65 6e 74 54 69 6d   memdbCurrentTim
0c70: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
0c80: 64 6f 75 62 6c 65 2a 29 3b 20 2a 2f 0a 73 74 61  double*); */.sta
0c90: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 47 65 74  tic int memdbGet
0ca0: 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
0cb0: 33 5f 76 66 73 2a 2c 20 69 6e 74 2c 20 63 68 61  3_vfs*, int, cha
0cc0: 72 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  r *);.static int
0cd0: 20 6d 65 6d 64 62 43 75 72 72 65 6e 74 54 69 6d   memdbCurrentTim
0ce0: 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
0cf0: 66 73 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  fs*, sqlite3_int
0d00: 36 34 2a 29 3b 0a 0a 73 74 61 74 69 63 20 73 71  64*);..static sq
0d10: 6c 69 74 65 33 5f 76 66 73 20 6d 65 6d 64 62 5f  lite3_vfs memdb_
0d20: 76 66 73 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  vfs = {.  2,    
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
0d50: 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
0d80: 20 28 73 65 74 20 77 68 65 6e 20 72 65 67 69 73   (set when regis
0d90: 74 65 72 65 64 29 20 2a 2f 0a 20 20 31 30 32 34  tered) */.  1024
0da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
0dc0: 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20  thname */.  0,  
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
0df0: 74 20 2a 2f 0a 20 20 22 6d 65 6d 64 62 22 2c 20  t */.  "memdb", 
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
0e20: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e40: 2a 20 70 41 70 70 44 61 74 61 20 28 73 65 74 20  * pAppData (set 
0e50: 77 68 65 6e 20 72 65 67 69 73 74 65 72 65 64 29  when registered)
0e60: 20 2a 2f 20 0a 20 20 6d 65 6d 64 62 4f 70 65 6e   */ .  memdbOpen
0e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0e80: 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
0e90: 20 20 30 2c 20 2f 2a 20 6d 65 6d 64 62 44 65 6c    0, /* memdbDel
0ea0: 65 74 65 2c 20 2a 2f 20 20 20 20 20 20 20 20 2f  ete, */        /
0eb0: 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 6d  * xDelete */.  m
0ec0: 65 6d 64 62 41 63 63 65 73 73 2c 20 20 20 20 20  emdbAccess,     
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
0ee0: 41 63 63 65 73 73 20 2a 2f 0a 20 20 6d 65 6d 64  Access */.  memd
0ef0: 62 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  bFullPathname,  
0f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c           /* xFul
0f10: 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6d  lPathname */.  m
0f20: 65 6d 64 62 44 6c 4f 70 65 6e 2c 20 20 20 20 20  emdbDlOpen,     
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
0f40: 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 6d 65 6d 64  DlOpen */.  memd
0f50: 62 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  bDlError,       
0f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
0f70: 72 72 6f 72 20 2a 2f 0a 20 20 6d 65 6d 64 62 44  rror */.  memdbD
0f80: 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
0f90: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
0fa0: 20 2a 2f 0a 20 20 6d 65 6d 64 62 44 6c 43 6c 6f   */.  memdbDlClo
0fb0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
0fc0: 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
0fd0: 2f 0a 20 20 6d 65 6d 64 62 52 61 6e 64 6f 6d 6e  /.  memdbRandomn
0fe0: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
0ff0: 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
1000: 2a 2f 0a 20 20 6d 65 6d 64 62 53 6c 65 65 70 2c  */.  memdbSleep,
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
1030: 20 30 2c 20 2f 2a 20 6d 65 6d 64 62 43 75 72 72   0, /* memdbCurr
1040: 65 6e 74 54 69 6d 65 2c 20 2a 2f 20 20 20 2f 2a  entTime, */   /*
1050: 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
1060: 0a 20 20 6d 65 6d 64 62 47 65 74 4c 61 73 74 45  .  memdbGetLastE
1070: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
1080: 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
1090: 20 2a 2f 0a 20 20 6d 65 6d 64 62 43 75 72 72 65   */.  memdbCurre
10a0: 6e 74 54 69 6d 65 49 6e 74 36 34 20 20 20 20 20  ntTimeInt64     
10b0: 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
10c0: 6d 65 49 6e 74 36 34 20 2a 2f 0a 7d 3b 0a 0a 73  meInt64 */.};..s
10d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
10e0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6d  te3_io_methods m
10f0: 65 6d 64 62 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  emdb_io_methods 
1100: 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20  = {.  3,        
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1130: 6e 20 2a 2f 0a 20 20 6d 65 6d 64 62 43 6c 6f 73  n */.  memdbClos
1140: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1150: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1160: 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 52 65 61 64  e */.  memdbRead
1170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1180: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
1190: 20 2a 2f 0a 20 20 6d 65 6d 64 62 57 72 69 74 65   */.  memdbWrite
11a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11b0: 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
11c0: 20 2a 2f 0a 20 20 6d 65 6d 64 62 54 72 75 6e 63   */.  memdbTrunc
11d0: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
11e0: 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
11f0: 61 74 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 53 79  ate */.  memdbSy
1200: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
1220: 6e 63 20 2a 2f 0a 20 20 6d 65 6d 64 62 46 69 6c  nc */.  memdbFil
1230: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
1240: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1250: 65 53 69 7a 65 20 2a 2f 0a 20 20 6d 65 6d 64 62  eSize */.  memdb
1260: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1280: 4c 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 64 62 4c  Lock */.  memdbL
1290: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
12a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
12b0: 6e 6c 6f 63 6b 20 2d 20 73 61 6d 65 20 61 73 20  nlock - same as 
12c0: 78 4c 6f 63 6b 20 69 6e 20 74 68 69 73 20 63 61  xLock in this ca
12d0: 73 65 20 2a 2f 20 0a 20 20 30 2c 20 2f 2a 20 6d  se */ .  0, /* m
12e0: 65 6d 64 62 43 68 65 63 6b 52 65 73 65 72 76 65  emdbCheckReserve
12f0: 64 4c 6f 63 6b 2c 20 2a 2f 20 2f 2a 20 78 43 68  dLock, */ /* xCh
1300: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1310: 2a 2f 0a 20 20 6d 65 6d 64 62 46 69 6c 65 43 6f  */.  memdbFileCo
1320: 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
1330: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
1340: 6e 74 72 6f 6c 20 2a 2f 0a 20 20 30 2c 20 2f 2a  ntrol */.  0, /*
1350: 20 6d 65 6d 64 62 53 65 63 74 6f 72 53 69 7a 65   memdbSectorSize
1360: 2c 2a 2f 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,*/         /* x
1370: 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
1380: 6d 65 6d 64 62 44 65 76 69 63 65 43 68 61 72 61  memdbDeviceChara
1390: 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
13a0: 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
13b0: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
13c0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
13f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
1420: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
1450: 65 72 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  er */.  0,      
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1480: 55 6e 6d 61 70 20 2a 2f 0a 20 20 6d 65 6d 64 62  Unmap */.  memdb
1490: 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14b0: 46 65 74 63 68 20 2a 2f 0a 20 20 6d 65 6d 64 62  Fetch */.  memdb
14c0: 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14e0: 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 0a  Unfetch */.};...
14f0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
1500: 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2a 0a 2a  memdb-file..**.*
1510: 2a 20 54 68 65 20 70 44 61 74 61 20 70 6f 69 6e  * The pData poin
1520: 74 65 72 20 69 73 20 6f 77 6e 65 64 20 62 79 20  ter is owned by 
1530: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c  the application,
1540: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 74   so there is not
1550: 68 69 6e 67 0a 2a 2a 20 74 6f 20 66 72 65 65 2e  hing.** to free.
1560: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1570: 65 6d 64 62 43 6c 6f 73 65 28 73 71 6c 69 74 65  emdbClose(sqlite
1580: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1590: 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28    MemFile *p = (
15a0: 4d 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  MemFile *)pFile;
15b0: 0a 20 20 69 66 28 20 70 2d 3e 6d 46 6c 61 67 73  .  if( p->mFlags
15c0: 20 26 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49   & SQLITE_DESERI
15d0: 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53  ALIZE_FREEONCLOS
15e0: 45 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  E ) sqlite3_free
15f0: 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 72 65  (p->aData);.  re
1600: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1610: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
1620: 74 61 20 66 72 6f 6d 20 61 6e 20 6d 65 6d 64 62  ta from an memdb
1630: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1640: 20 69 6e 74 20 6d 65 6d 64 62 52 65 61 64 28 0a   int memdbRead(.
1650: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1660: 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a  pFile, .  void *
1670: 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d  zBuf, .  int iAm
1680: 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  t, .  sqlite_int
1690: 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4d 65  64 iOfst.){.  Me
16a0: 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46  mFile *p = (MemF
16b0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
16c0: 66 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70 2d  f( iOfst+iAmt>p-
16d0: 3e 73 7a 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  >sz ){.    memse
16e0: 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74 29  t(zBuf, 0, iAmt)
16f0: 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 3c  ;.    if( iOfst<
1700: 70 2d 3e 73 7a 20 29 20 6d 65 6d 63 70 79 28 7a  p->sz ) memcpy(z
1710: 42 75 66 2c 20 70 2d 3e 61 44 61 74 61 2b 69 4f  Buf, p->aData+iO
1720: 66 73 74 2c 20 70 2d 3e 73 7a 20 2d 20 69 4f 66  fst, p->sz - iOf
1730: 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1740: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1750: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6d  RT_READ;.  }.  m
1760: 65 6d 63 70 79 28 7a 42 75 66 2c 20 70 2d 3e 61  emcpy(zBuf, p->a
1770: 44 61 74 61 2b 69 4f 66 73 74 2c 20 69 41 6d 74  Data+iOfst, iAmt
1780: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1790: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17a0: 54 72 79 20 74 6f 20 65 6e 6c 61 72 67 65 20 74  Try to enlarge t
17b0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
17c0: 74 69 6f 6e 20 74 6f 20 68 6f 6c 64 20 61 74 20  tion to hold at 
17d0: 6c 65 61 73 74 20 73 7a 20 62 79 74 65 73 0a 2a  least sz bytes.*
17e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
17f0: 64 62 45 6e 6c 61 72 67 65 28 4d 65 6d 46 69 6c  dbEnlarge(MemFil
1800: 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
1810: 74 36 34 20 6e 65 77 53 7a 29 7b 0a 20 20 75 6e  t64 newSz){.  un
1820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
1830: 77 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6d 46 6c  w;.  if( (p->mFl
1840: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45 53  ags & SQLITE_DES
1850: 45 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41  ERIALIZE_RESIZEA
1860: 42 4c 45 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 4d  BLE)==0 || p->nM
1870: 6d 61 70 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  map>0 ){.    ret
1880: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1890: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 77 53 7a  .  }.  if( newSz
18a0: 3e 70 2d 3e 73 7a 4d 61 78 20 29 7b 0a 20 20 20  >p->szMax ){.   
18b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
18c0: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 6e 65 77 53 7a  ULL;.  }.  newSz
18d0: 20 2a 3d 20 32 3b 0a 20 20 69 66 28 20 6e 65 77   *= 2;.  if( new
18e0: 53 7a 3e 70 2d 3e 73 7a 4d 61 78 20 29 20 6e 65  Sz>p->szMax ) ne
18f0: 77 53 7a 20 3d 20 70 2d 3e 73 7a 4d 61 78 3b 0a  wSz = p->szMax;.
1900: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1910: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 44  _realloc64(p->aD
1920: 61 74 61 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 69  ata, newSz);.  i
1930: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
1940: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1950: 3b 0a 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 70  ;.  p->aData = p
1960: 4e 65 77 3b 0a 20 20 70 2d 3e 73 7a 41 6c 6c 6f  New;.  p->szAllo
1970: 63 20 3d 20 6e 65 77 53 7a 3b 0a 20 20 72 65 74  c = newSz;.  ret
1980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1990: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
19a0: 74 61 20 74 6f 20 61 6e 20 6d 65 6d 64 62 2d 66  ta to an memdb-f
19b0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
19c0: 6e 74 20 6d 65 6d 64 62 57 72 69 74 65 28 0a 20  nt memdbWrite(. 
19d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
19e0: 46 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  File,.  const vo
19f0: 69 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d  id *z,.  int iAm
1a00: 74 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  t,.  sqlite_int6
1a10: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4d 65 6d  4 iOfst.){.  Mem
1a20: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
1a30: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66  le *)pFile;.  if
1a40: 28 20 4e 45 56 45 52 28 70 2d 3e 6d 46 6c 61 67  ( NEVER(p->mFlag
1a50: 73 20 26 20 53 51 4c 49 54 45 5f 44 45 53 45 52  s & SQLITE_DESER
1a60: 49 41 4c 49 5a 45 5f 52 45 41 44 4f 4e 4c 59 29  IALIZE_READONLY)
1a70: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a80: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 69 66 28  _READONLY;.  if(
1a90: 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70 2d 3e 73   iOfst+iAmt>p->s
1aa0: 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  z ){.    int rc;
1ab0: 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 2b 69  .    if( iOfst+i
1ac0: 41 6d 74 3e 70 2d 3e 73 7a 41 6c 6c 6f 63 0a 20  Amt>p->szAlloc. 
1ad0: 20 20 20 20 26 26 20 28 72 63 20 3d 20 6d 65 6d      && (rc = mem
1ae0: 64 62 45 6e 6c 61 72 67 65 28 70 2c 20 69 4f 66  dbEnlarge(p, iOf
1af0: 73 74 2b 69 41 6d 74 29 29 21 3d 53 51 4c 49 54  st+iAmt))!=SQLIT
1b00: 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20 20  E_OK.    ){.    
1b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b20: 20 7d 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74   }.    if( iOfst
1b30: 3e 70 2d 3e 73 7a 20 29 20 6d 65 6d 73 65 74 28  >p->sz ) memset(
1b40: 70 2d 3e 61 44 61 74 61 2b 70 2d 3e 73 7a 2c 20  p->aData+p->sz, 
1b50: 30 2c 20 69 4f 66 73 74 2d 70 2d 3e 73 7a 29 3b  0, iOfst-p->sz);
1b60: 0a 20 20 20 20 70 2d 3e 73 7a 20 3d 20 69 4f 66  .    p->sz = iOf
1b70: 73 74 2b 69 41 6d 74 3b 0a 20 20 7d 0a 20 20 6d  st+iAmt;.  }.  m
1b80: 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2b 69  emcpy(p->aData+i
1b90: 4f 66 73 74 2c 20 7a 2c 20 69 41 6d 74 29 3b 0a  Ofst, z, iAmt);.
1ba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
1bc0: 6e 63 61 74 65 20 61 6e 20 6d 65 6d 64 62 2d 66  ncate an memdb-f
1bd0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 72 6f  ile..**.** In ro
1be0: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 28 77 68 69  llback mode (whi
1bf0: 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  ch is always the
1c00: 20 63 61 73 65 20 66 6f 72 20 6d 65 6d 64 62 2c   case for memdb,
1c10: 20 61 73 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   as it does not.
1c20: 2a 2a 20 73 75 70 70 6f 72 74 20 57 41 4c 20 6d  ** support WAL m
1c30: 6f 64 65 29 20 74 68 65 20 74 72 75 6e 63 61 74  ode) the truncat
1c40: 65 28 29 20 6d 65 74 68 6f 64 20 69 73 20 6f 6e  e() method is on
1c50: 6c 79 20 75 73 65 64 20 74 6f 20 72 65 64 75 63  ly used to reduc
1c60: 65 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66  e.** the size of
1c70: 20 61 20 66 69 6c 65 2c 20 6e 65 76 65 72 20 74   a file, never t
1c80: 6f 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  o increase the s
1c90: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
1ca0: 6e 74 20 6d 65 6d 64 62 54 72 75 6e 63 61 74 65  nt memdbTruncate
1cb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1cc0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
1cd0: 36 34 20 73 69 7a 65 29 7b 0a 20 20 4d 65 6d 46  64 size){.  MemF
1ce0: 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c  ile *p = (MemFil
1cf0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28  e *)pFile;.  if(
1d00: 20 4e 45 56 45 52 28 73 69 7a 65 3e 70 2d 3e 73   NEVER(size>p->s
1d10: 7a 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  z) ) return SQLI
1d20: 54 45 5f 46 55 4c 4c 3b 0a 20 20 70 2d 3e 73 7a  TE_FULL;.  p->sz
1d30: 20 3d 20 73 69 7a 65 3b 20 0a 20 20 72 65 74 75   = size; .  retu
1d40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d50: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 6d  ./*.** Sync an m
1d60: 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  emdb-file..*/.st
1d70: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 53 79  atic int memdbSy
1d80: 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1d90: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *pFile, int flag
1da0: 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s){.  return SQL
1db0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1dc0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1dd0: 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66  ent file-size of
1de0: 20 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a   an memdb-file..
1df0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
1e00: 6d 64 62 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  mdbFileSize(sqli
1e10: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1e20: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
1e30: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 46 69 6c 65  Size){.  MemFile
1e40: 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a   *p = (MemFile *
1e50: 29 70 46 69 6c 65 3b 0a 20 20 2a 70 53 69 7a 65  )pFile;.  *pSize
1e60: 20 3d 20 70 2d 3e 73 7a 3b 0a 20 20 72 65 74 75   = p->sz;.  retu
1e70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e80: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 6d  ./*.** Lock an m
1e90: 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  emdb-file..*/.st
1ea0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 4c 6f  atic int memdbLo
1eb0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1ec0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63  *pFile, int eLoc
1ed0: 6b 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70  k){.  MemFile *p
1ee0: 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70 46   = (MemFile *)pF
1ef0: 69 6c 65 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  ile;.  if( eLock
1f00: 3e 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41  >SQLITE_LOCK_SHA
1f10: 52 45 44 20 0a 20 20 20 26 26 20 28 70 2d 3e 6d  RED .   && (p->m
1f20: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  Flags & SQLITE_D
1f30: 45 53 45 52 49 41 4c 49 5a 45 5f 52 45 41 44 4f  ESERIALIZE_READO
1f40: 4e 4c 59 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NLY)!=0.  ){.   
1f50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1f60: 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70  EADONLY;.  }.  p
1f70: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
1f80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f90: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a  _OK;.}..#if 0 /*
1fa0: 20 4e 65 76 65 72 20 75 73 65 64 20 62 65 63 61   Never used beca
1fb0: 75 73 65 20 6d 65 6d 64 62 41 63 63 65 73 73 28  use memdbAccess(
1fc0: 29 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  ) always returns
1fd0: 20 66 61 6c 73 65 20 2a 2f 0a 2f 2a 0a 2a 2a 20   false */./*.** 
1fe0: 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
1ff0: 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
2000: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2010: 63 6b 20 6f 6e 20 61 6e 20 6d 65 6d 64 62 2d 66  ck on an memdb-f
2020: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2030: 6e 74 20 6d 65 6d 64 62 43 68 65 63 6b 52 65 73  nt memdbCheckRes
2040: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
2050: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
2060: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
2070: 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
2080: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2090: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
20a0: 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d  * File control m
20b0: 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f  ethod. For custo
20c0: 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  m operations on 
20d0: 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a  an memdb-file..*
20e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
20f0: 64 62 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  dbFileControl(sq
2100: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2110: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
2120: 2a 70 41 72 67 29 7b 0a 20 20 4d 65 6d 46 69 6c  *pArg){.  MemFil
2130: 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20  e *p = (MemFile 
2140: 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  *)pFile;.  int r
2150: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
2160: 55 4e 44 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  UND;.  if( op==S
2170: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
2180: 41 4d 45 20 29 7b 0a 20 20 20 20 2a 28 63 68 61  AME ){.    *(cha
2190: 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
21a0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 65 6d 64  e3_mprintf("memd
21b0: 62 28 25 70 2c 25 6c 6c 64 29 22 2c 20 70 2d 3e  b(%p,%lld)", p->
21c0: 61 44 61 74 61 2c 20 70 2d 3e 73 7a 29 3b 0a 20  aData, p->sz);. 
21d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21e0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  K;.  }.  if( op=
21f0: 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49  =SQLITE_FCNTL_SI
2200: 5a 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  ZE_LIMIT ){.    
2210: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
2220: 69 6d 69 74 20 3d 20 2a 28 73 71 6c 69 74 65 33  imit = *(sqlite3
2230: 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
2240: 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 70 2d 3e    if( iLimit<p->
2250: 73 7a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sz ){.      if( 
2260: 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20  iLimit<0 ){.    
2270: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 2d 3e      iLimit = p->
2280: 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 65 6c  szMax;.      }el
2290: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4c 69 6d  se{.        iLim
22a0: 69 74 20 3d 20 70 2d 3e 73 7a 3b 0a 20 20 20 20  it = p->sz;.    
22b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
22c0: 3e 73 7a 4d 61 78 20 3d 20 69 4c 69 6d 69 74 3b  >szMax = iLimit;
22d0: 0a 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 69  .    *(sqlite3_i
22e0: 6e 74 36 34 2a 29 70 41 72 67 20 3d 20 69 4c 69  nt64*)pArg = iLi
22f0: 6d 69 74 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  mit;.    rc = SQ
2300: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2310: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2320: 20 30 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20   0  /* Not used 
2330: 62 65 63 61 75 73 65 20 6f 66 20 53 51 4c 49 54  because of SQLIT
2340: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
2350: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 2f  E_OVERWRITE */./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2370: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62  sector-size in b
2380: 79 74 65 73 20 66 6f 72 20 61 6e 20 6d 65 6d 64  ytes for an memd
2390: 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  b-file..*/.stati
23a0: 63 20 69 6e 74 20 6d 65 6d 64 62 53 65 63 74 6f  c int memdbSecto
23b0: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
23c0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65  le *pFile){.  re
23d0: 74 75 72 6e 20 31 30 32 34 3b 0a 7d 0a 23 65 6e  turn 1024;.}.#en
23e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
23f0: 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
2400: 72 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67  racteristic flag
2410: 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61  s supported by a
2420: 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2f  n memdb-file..*/
2430: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
2440: 62 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  bDeviceCharacter
2450: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
2460: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72  ile *pFile){.  r
2470: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
2480: 41 50 5f 41 54 4f 4d 49 43 20 7c 20 0a 20 20 20  AP_ATOMIC | .   
2490: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
24a0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
24b0: 52 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  RWRITE |.       
24c0: 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
24d0: 41 46 45 5f 41 50 50 45 4e 44 20 7c 0a 20 20 20  AFE_APPEND |.   
24e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
24f0: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 3b 0a 7d  AP_SEQUENTIAL;.}
2500: 0a 0a 2f 2a 20 46 65 74 63 68 20 61 20 70 61 67  ../* Fetch a pag
2510: 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 2d 6d 61  e of a memory-ma
2520: 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 73 74 61  pped file */.sta
2530: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 65 74  tic int memdbFet
2540: 63 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ch(.  sqlite3_fi
2550: 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 73 71 6c  le *pFile,.  sql
2560: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
2570: 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20  ,.  int iAmt,.  
2580: 76 6f 69 64 20 2a 2a 70 70 0a 29 7b 0a 20 20 4d  void **pp.){.  M
2590: 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d  emFile *p = (Mem
25a0: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
25b0: 69 66 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70  if( iOfst+iAmt>p
25c0: 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 61 73 73 65  ->sz ){.    asse
25d0: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  rt( CORRUPT_DB )
25e0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  ;.    *pp = 0;. 
25f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
2600: 4d 6d 61 70 2b 2b 3b 0a 20 20 20 20 2a 70 70 20  Mmap++;.    *pp 
2610: 3d 20 28 76 6f 69 64 2a 29 28 70 2d 3e 61 44 61  = (void*)(p->aDa
2620: 74 61 20 2b 20 69 4f 66 73 74 29 3b 0a 20 20 7d  ta + iOfst);.  }
2630: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2640: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 6c 65 61  _OK;.}../* Relea
2650: 73 65 20 61 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  se a memory-mapp
2660: 65 64 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69  ed page */.stati
2670: 63 20 69 6e 74 20 6d 65 6d 64 62 55 6e 66 65 74  c int memdbUnfet
2680: 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
2690: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
26a0: 69 6e 74 36 34 20 69 4f 66 73 74 2c 20 76 6f 69  int64 iOfst, voi
26b0: 64 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  d *pPage){.  Mem
26c0: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
26d0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d  le *)pFile;.  p-
26e0: 3e 6e 4d 6d 61 70 2d 2d 3b 0a 20 20 72 65 74 75  >nMmap--;.  retu
26f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2700: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 6d  ./*.** Open an m
2710: 65 6d 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  em file handle..
2720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
2730: 6d 64 62 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  mdbOpen(.  sqlit
2740: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20  e3_vfs *pVfs,.  
2750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2760: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e,.  sqlite3_fil
2770: 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20  e *pFile,.  int 
2780: 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f  flags,.  int *pO
2790: 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 4d 65 6d  utFlags.){.  Mem
27a0: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
27b0: 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28  le*)pFile;.  if(
27c0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
27d0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3d 3d  _OPEN_MAIN_DB)==
27e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
27f0: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
2800: 4f 70 65 6e 28 4f 52 49 47 56 46 53 28 70 56 66  Open(ORIGVFS(pVf
2810: 73 29 2c 20 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  s), zName, pFile
2820: 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
2830: 67 73 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  gs);.  }.  memse
2840: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
2850: 70 29 29 3b 0a 20 20 70 2d 3e 6d 46 6c 61 67 73  p));.  p->mFlags
2860: 20 3d 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49   = SQLITE_DESERI
2870: 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45  ALIZE_RESIZEABLE
2880: 20 7c 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49   | SQLITE_DESERI
2890: 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53  ALIZE_FREEONCLOS
28a0: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75  E;.  assert( pOu
28b0: 74 46 6c 61 67 73 21 3d 30 20 29 3b 20 20 2f 2a  tFlags!=0 );  /*
28c0: 20 54 72 75 65 20 62 65 63 61 75 73 65 20 66 6c   True because fl
28d0: 61 67 73 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ags==SQLITE_OPEN
28e0: 5f 4d 41 49 4e 5f 44 42 20 2a 2f 0a 20 20 2a 70  _MAIN_DB */.  *p
28f0: 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
2900: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
2910: 45 4d 4f 52 59 3b 0a 20 20 70 2d 3e 62 61 73 65  EMORY;.  p->base
2920: 2e 70 4d 65 74 68 6f 64 73 20 3d 20 26 6d 65 6d  .pMethods = &mem
2930: 64 62 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20  db_io_methods;. 
2940: 20 70 2d 3e 73 7a 4d 61 78 20 3d 20 53 51 4c 49   p->szMax = SQLI
2950: 54 45 5f 4d 45 4d 44 42 5f 44 45 46 41 55 4c 54  TE_MEMDB_DEFAULT
2960: 5f 4d 41 58 53 49 5a 45 3b 0a 20 20 72 65 74 75  _MAXSIZE;.  retu
2970: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2980: 0a 23 69 66 20 30 20 2f 2a 20 4f 6e 6c 79 20 75  .#if 0 /* Only u
2990: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 72 6f  sed to delete ro
29a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 73 2c  llback journals,
29b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 73   master journals
29c0: 2c 20 61 6e 64 20 57 41 4c 0a 20 20 20 20 20 20  , and WAL.      
29d0: 2a 2a 20 66 69 6c 65 73 2c 20 6e 6f 6e 65 20 6f  ** files, none o
29e0: 66 20 77 68 69 63 68 20 65 78 69 73 74 20 69 6e  f which exist in
29f0: 20 6d 65 6d 64 62 2e 20 20 53 6f 20 74 68 69 73   memdb.  So this
2a00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
2a10: 72 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  r used */./*.** 
2a20: 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
2a30: 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68  located at zPath
2a40: 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
2a50: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
2a60: 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 65  e,.** ensure the
2a70: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6d 6f 64   file-system mod
2a80: 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20 73  ifications are s
2a90: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 62 65  ynced to disk be
2aa0: 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
2ab0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2ac0: 20 6d 65 6d 64 62 44 65 6c 65 74 65 28 73 71 6c   memdbDelete(sql
2ad0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2ae0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2af0: 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b  h, int dirSync){
2b00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b10: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d  _IOERR_DELETE;.}
2b20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2b30: 65 73 74 20 66 6f 72 20 61 63 63 65 73 73 20 70  est for access p
2b40: 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75  ermissions. Retu
2b50: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
2b60: 65 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 73  equested permiss
2b70: 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ion.** is availa
2b80: 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ble, or false ot
2b90: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  herwise..**.** W
2ba0: 69 74 68 20 6d 65 6d 64 62 2c 20 6e 6f 20 66 69  ith memdb, no fi
2bb0: 6c 65 73 20 65 76 65 72 20 65 78 69 73 74 20 6f  les ever exist o
2bc0: 6e 20 64 69 73 6b 2e 20 20 53 6f 20 61 6c 77 61  n disk.  So alwa
2bd0: 79 73 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  ys return false.
2be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2bf0: 65 6d 64 62 41 63 63 65 73 73 28 0a 20 20 73 71  emdbAccess(.  sq
2c00: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c10: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
2c20: 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c  zPath, .  int fl
2c30: 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65  ags, .  int *pRe
2c40: 73 4f 75 74 0a 29 7b 0a 20 20 2a 70 52 65 73 4f  sOut.){.  *pResO
2c50: 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
2c60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2c70: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75  *.** Populate bu
2c80: 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74  ffer zOut with t
2c90: 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61  he full canonica
2ca0: 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65  l pathname corre
2cb0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74  sponding.** to t
2cc0: 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a  he pathname in z
2cd0: 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75  Path. zOut is gu
2ce0: 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e  aranteed to poin
2cf0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a  t to a buffer.**
2d00: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 49 4e   of at least (IN
2d10: 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  ST_MAX_PATHNAME+
2d20: 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  1) bytes..*/.sta
2d30: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 75 6c  tic int memdbFul
2d40: 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
2d50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2d60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d70: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
2d80: 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
2d90: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  .){.  sqlite3_sn
2da0: 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
2db0: 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
2dc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2dd0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  _OK;.}../*.** Op
2de0: 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  en the dynamic l
2df0: 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61  ibrary located a
2e00: 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75  t zPath and retu
2e10: 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  rn a handle..*/.
2e20: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d  static void *mem
2e30: 64 62 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  dbDlOpen(sqlite3
2e40: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
2e50: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
2e60: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
2e70: 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28  (pVfs)->xDlOpen(
2e80: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 7a  ORIGVFS(pVfs), z
2e90: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
2ea0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
2eb0: 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a  fer zErrMsg (siz
2ec0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77  e nByte bytes) w
2ed0: 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64  ith a human read
2ee0: 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74  able.** utf-8 st
2ef0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
2f00: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2f10: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
2f20: 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  d associated .**
2f30: 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69   with dynamic li
2f40: 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  braries..*/.stat
2f50: 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 45  ic void memdbDlE
2f60: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2f70: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74   *pVfs, int nByt
2f80: 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
2f90: 29 7b 0a 20 20 4f 52 49 47 56 46 53 28 70 56 66  ){.  ORIGVFS(pVf
2fa0: 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 4f 52 49  s)->xDlError(ORI
2fb0: 47 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74  GVFS(pVfs), nByt
2fc0: 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a  e, zErrMsg);.}..
2fd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2fe0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 79  ointer to the sy
2ff0: 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20  mbol zSymbol in 
3000: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
3010: 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a  ary pHandle..*/.
3020: 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 6d 65  static void (*me
3030: 6d 64 62 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  mdbDlSym(sqlite3
3040: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
3050: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3060: 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
3070: 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28   return ORIGVFS(
3080: 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28 4f 52  pVfs)->xDlSym(OR
3090: 49 47 56 46 53 28 70 56 66 73 29 2c 20 70 2c 20  IGVFS(pVfs), p, 
30a0: 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zSym);.}../*.** 
30b0: 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61 6d 69  Close the dynami
30c0: 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64 6c 65  c library handle
30d0: 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61   pHandle..*/.sta
30e0: 74 69 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c  tic void memdbDl
30f0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
3100: 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
3110: 48 61 6e 64 6c 65 29 7b 0a 20 20 4f 52 49 47 56  Handle){.  ORIGV
3120: 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 43 6c 6f  FS(pVfs)->xDlClo
3130: 73 65 28 4f 52 49 47 56 46 53 28 70 56 66 73 29  se(ORIGVFS(pVfs)
3140: 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f  , pHandle);.}../
3150: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
3160: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
3170: 20 74 6f 20 62 79 20 7a 42 75 66 4f 75 74 20 77   to by zBufOut w
3180: 69 74 68 20 6e 42 79 74 65 20 62 79 74 65 73 20  ith nByte bytes 
3190: 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61  of .** random da
31a0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ta..*/.static in
31b0: 74 20 6d 65 6d 64 62 52 61 6e 64 6f 6d 6e 65 73  t memdbRandomnes
31c0: 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
31d0: 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
31e0: 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
31f0: 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
3200: 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f 6d 6e  (pVfs)->xRandomn
3210: 65 73 73 28 4f 52 49 47 56 46 53 28 70 56 66 73  ess(ORIGVFS(pVfs
3220: 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75  ), nByte, zBufOu
3230: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  t);.}../*.** Sle
3240: 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69  ep for nMicro mi
3250: 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75  croseconds. Retu
3260: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3270: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a   microseconds .*
3280: 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74  * actually slept
3290: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32a0: 6d 65 6d 64 62 53 6c 65 65 70 28 73 71 6c 69 74  memdbSleep(sqlit
32b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
32c0: 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65 74  t nMicro){.  ret
32d0: 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73  urn ORIGVFS(pVfs
32e0: 29 2d 3e 78 53 6c 65 65 70 28 4f 52 49 47 56 46  )->xSleep(ORIGVF
32f0: 53 28 70 56 66 73 29 2c 20 6e 4d 69 63 72 6f 29  S(pVfs), nMicro)
3300: 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e  ;.}..#if 0  /* N
3310: 65 76 65 72 20 75 73 65 64 2e 20 20 4d 6f 64 65  ever used.  Mode
3320: 72 6e 20 63 6f 72 65 73 20 6f 6e 6c 79 20 63 61  rn cores only ca
3330: 6c 6c 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  ll xCurrentTimeI
3340: 6e 74 36 34 28 29 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt64() */./*.** 
3350: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
3360: 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
3370: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
3380: 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
3390: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62  static int memdb
33a0: 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
33b0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
33c0: 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29  ouble *pTimeOut)
33d0: 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56  {.  return ORIGV
33e0: 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65  FS(pVfs)->xCurre
33f0: 6e 74 54 69 6d 65 28 4f 52 49 47 56 46 53 28 70  ntTime(ORIGVFS(p
3400: 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 3b  Vfs), pTimeOut);
3410: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
3420: 63 20 69 6e 74 20 6d 65 6d 64 62 47 65 74 4c 61  c int memdbGetLa
3430: 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
3440: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 61  vfs *pVfs, int a
3450: 2c 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 72 65  , char *b){.  re
3460: 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66  turn ORIGVFS(pVf
3470: 73 29 2d 3e 78 47 65 74 4c 61 73 74 45 72 72 6f  s)->xGetLastErro
3480: 72 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c  r(ORIGVFS(pVfs),
3490: 20 61 2c 20 62 29 3b 0a 7d 0a 73 74 61 74 69 63   a, b);.}.static
34a0: 20 69 6e 74 20 6d 65 6d 64 62 43 75 72 72 65 6e   int memdbCurren
34b0: 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
34c0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
34d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 29 7b  lite3_int64 *p){
34e0: 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46  .  return ORIGVF
34f0: 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65 6e  S(pVfs)->xCurren
3500: 74 54 69 6d 65 49 6e 74 36 34 28 4f 52 49 47 56  tTimeInt64(ORIGV
3510: 46 53 28 70 56 66 73 29 2c 20 70 29 3b 0a 7d 0a  FS(pVfs), p);.}.
3520: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
3530: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
3540: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 61  ection pointer a
3550: 6e 64 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 69  nd schema name i
3560: 6e 74 6f 20 61 0a 2a 2a 20 4d 65 6d 46 69 6c 65  nto a.** MemFile
3570: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
3580: 74 69 63 20 4d 65 6d 46 69 6c 65 20 2a 6d 65 6d  tic MemFile *mem
3590: 64 62 46 72 6f 6d 44 62 53 63 68 65 6d 61 28 73  dbFromDbSchema(s
35a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
35b0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 29  t char *zSchema)
35c0: 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d  {.  MemFile *p =
35d0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   0;.  int rc = s
35e0: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
35f0: 72 6f 6c 28 64 62 2c 20 7a 53 63 68 65 6d 61 2c  rol(db, zSchema,
3600: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49   SQLITE_FCNTL_FI
3610: 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 26 70 29 3b  LE_POINTER, &p);
3620: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
3630: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62  rn 0;.  if( p->b
3640: 61 73 65 2e 70 4d 65 74 68 6f 64 73 21 3d 26 6d  ase.pMethods!=&m
3650: 65 6d 64 62 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  emdb_io_methods 
3660: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
3670: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3680: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
3690: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 61 20 64  alization of a d
36a0: 61 74 61 62 61 73 65 0a 2a 2f 0a 75 6e 73 69 67  atabase.*/.unsig
36b0: 6e 65 64 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ned char *sqlite
36c0: 33 5f 73 65 72 69 61 6c 69 7a 65 28 0a 20 20 73  3_serialize(.  s
36d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
36e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
3700: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
3710: 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20  har *zSchema,   
3720: 20 20 20 2f 2a 20 57 68 69 63 68 20 64 61 74 61     /* Which data
3730: 62 61 73 65 20 77 69 74 68 69 6e 20 74 68 65 20  base within the 
3740: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
3750: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
3760: 69 53 69 7a 65 2c 20 20 20 20 2f 2a 20 57 72 69  iSize,    /* Wri
3770: 74 65 20 73 69 7a 65 20 68 65 72 65 2c 20 69 66  te size here, if
3780: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75   not NULL */.  u
3790: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 46 6c 61  nsigned int mFla
37a0: 67 73 20 20 20 20 20 20 20 2f 2a 20 4d 61 79 62  gs       /* Mayb
37b0: 65 20 53 51 4c 49 54 45 5f 53 45 52 49 41 4c 49  e SQLITE_SERIALI
37c0: 5a 45 5f 4e 4f 43 4f 50 59 20 2a 2f 0a 29 7b 0a  ZE_NOCOPY */.){.
37d0: 20 20 4d 65 6d 46 69 6c 65 20 2a 70 3b 0a 20 20    MemFile *p;.  
37e0: 69 6e 74 20 69 44 62 3b 0a 20 20 42 74 72 65 65  int iDb;.  Btree
37f0: 20 2a 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33   *pBt;.  sqlite3
3800: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 69 6e 74  _int64 sz;.  int
3810: 20 73 7a 50 61 67 65 20 3d 20 30 3b 0a 20 20 73   szPage = 0;.  s
3820: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
3830: 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  mt = 0;.  unsign
3840: 65 64 20 63 68 61 72 20 2a 70 4f 75 74 3b 0a 20  ed char *pOut;. 
3850: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3860: 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
3870: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
3880: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
3890: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
38a0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
38b0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
38c0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
38d0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
38e0: 0a 0a 20 20 69 66 28 20 7a 53 63 68 65 6d 61 3d  ..  if( zSchema=
38f0: 3d 30 20 29 20 7a 53 63 68 65 6d 61 20 3d 20 64  =0 ) zSchema = d
3900: 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61  b->aDb[0].zDbSNa
3910: 6d 65 3b 0a 20 20 70 20 3d 20 6d 65 6d 64 62 46  me;.  p = memdbF
3920: 72 6f 6d 44 62 53 63 68 65 6d 61 28 64 62 2c 20  romDbSchema(db, 
3930: 7a 53 63 68 65 6d 61 29 3b 0a 20 20 69 44 62 20  zSchema);.  iDb 
3940: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
3950: 61 6d 65 28 64 62 2c 20 7a 53 63 68 65 6d 61 29  ame(db, zSchema)
3960: 3b 0a 20 20 69 66 28 20 70 69 53 69 7a 65 20 29  ;.  if( piSize )
3970: 20 2a 70 69 53 69 7a 65 20 3d 20 2d 31 3b 0a 20   *piSize = -1;. 
3980: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
3990: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 20 29  urn 0;.  if( p )
39a0: 7b 0a 20 20 20 20 69 66 28 20 70 69 53 69 7a 65  {.    if( piSize
39b0: 20 29 20 2a 70 69 53 69 7a 65 20 3d 20 70 2d 3e   ) *piSize = p->
39c0: 73 7a 3b 0a 20 20 20 20 69 66 28 20 6d 46 6c 61  sz;.    if( mFla
39d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 45 52 49  gs & SQLITE_SERI
39e0: 41 4c 49 5a 45 5f 4e 4f 43 4f 50 59 20 29 7b 0a  ALIZE_NOCOPY ){.
39f0: 20 20 20 20 20 20 70 4f 75 74 20 3d 20 70 2d 3e        pOut = p->
3a00: 61 44 61 74 61 3b 0a 20 20 20 20 7d 65 6c 73 65  aData;.    }else
3a10: 7b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 73  {.      pOut = s
3a20: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
3a30: 20 70 2d 3e 73 7a 20 29 3b 0a 20 20 20 20 20 20   p->sz );.      
3a40: 69 66 28 20 70 4f 75 74 20 29 20 6d 65 6d 63 70  if( pOut ) memcp
3a50: 79 28 70 4f 75 74 2c 20 70 2d 3e 61 44 61 74 61  y(pOut, p->aData
3a60: 2c 20 70 2d 3e 73 7a 29 3b 0a 20 20 20 20 7d 0a  , p->sz);.    }.
3a70: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b      return pOut;
3a80: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d  .  }.  pBt = db-
3a90: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
3aa0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 20 72 65   if( pBt==0 ) re
3ab0: 74 75 72 6e 20 30 3b 0a 20 20 73 7a 50 61 67 65  turn 0;.  szPage
3ac0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
3ad0: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 3b  etPageSize(pBt);
3ae0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
3af0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
3b00: 41 20 5c 22 25 77 5c 22 2e 70 61 67 65 5f 63 6f  A \"%w\".page_co
3b10: 75 6e 74 22 2c 20 7a 53 63 68 65 6d 61 29 3b 0a  unt", zSchema);.
3b20: 20 20 72 63 20 3d 20 7a 53 71 6c 20 3f 20 73 71    rc = zSql ? sq
3b30: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
3b40: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
3b50: 70 53 74 6d 74 2c 20 30 29 20 3a 20 53 51 4c 49  pStmt, 0) : SQLI
3b60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 71 6c 69  TE_NOMEM;.  sqli
3b70: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
3b80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
3b90: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n 0;.  rc = sqli
3ba0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
3bb0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3bc0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 70 4f 75  E_ROW ){.    pOu
3bd0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
3be0: 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74 65 33      sz = sqlite3
3bf0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
3c00: 74 6d 74 2c 20 30 29 2a 73 7a 50 61 67 65 3b 0a  tmt, 0)*szPage;.
3c10: 20 20 20 20 69 66 28 20 70 69 53 69 7a 65 20 29      if( piSize )
3c20: 20 2a 70 69 53 69 7a 65 20 3d 20 73 7a 3b 0a 20   *piSize = sz;. 
3c30: 20 20 20 69 66 28 20 6d 46 6c 61 67 73 20 26 20     if( mFlags & 
3c40: 53 51 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a 45  SQLITE_SERIALIZE
3c50: 5f 4e 4f 43 4f 50 59 20 29 7b 0a 20 20 20 20 20  _NOCOPY ){.     
3c60: 20 70 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pOut = 0;.    }
3c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 75 74  else{.      pOut
3c80: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
3c90: 63 36 34 28 20 73 7a 20 29 3b 0a 20 20 20 20 20  c64( sz );.     
3ca0: 20 69 66 28 20 70 4f 75 74 20 29 7b 0a 20 20 20   if( pOut ){.   
3cb0: 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
3cc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3cd0: 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
3ce0: 20 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50         Pager *pP
3cf0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
3d00: 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
3d10: 20 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b         int pgno;
3d20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 67 6e  .        for(pgn
3d30: 6f 3d 31 3b 20 70 67 6e 6f 3c 3d 6e 50 61 67 65  o=1; pgno<=nPage
3d40: 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
3d50: 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 50 61       DbPage *pPa
3d60: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
3d70: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3d80: 2a 70 54 6f 20 3d 20 70 4f 75 74 20 2b 20 73 7a  *pTo = pOut + sz
3d90: 50 61 67 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e  Page*(sqlite3_in
3da0: 74 36 34 29 28 70 67 6e 6f 2d 31 29 3b 0a 20 20  t64)(pgno-1);.  
3db0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
3dc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
3dd0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
3de0: 67 65 2a 2a 29 26 70 50 61 67 65 2c 20 30 29 3b  ge**)&pPage, 0);
3df0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
3e00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
3e20: 70 79 28 70 54 6f 2c 20 73 71 6c 69 74 65 33 50  py(pTo, sqlite3P
3e30: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
3e40: 65 29 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20  e), szPage);.   
3e50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3e60: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
3e70: 28 70 54 6f 2c 20 30 2c 20 73 7a 50 61 67 65 29  (pTo, 0, szPage)
3e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
3ea0: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
3eb0: 3b 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  ;       .       
3ec0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3ed0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
3ee0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
3ef0: 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 7d    return pOut;.}
3f00: 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 7a 53 63  ../* Convert zSc
3f10: 68 65 6d 61 20 74 6f 20 61 20 4d 65 6d 44 42 20  hema to a MemDB 
3f20: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
3f30: 74 73 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  ts content..*/.i
3f40: 6e 74 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72  nt sqlite3_deser
3f50: 69 61 6c 69 7a 65 28 0a 20 20 73 71 6c 69 74 65  ialize(.  sqlite
3f60: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
3f70: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
3f90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
3fa0: 63 68 65 6d 61 2c 20 20 20 20 2f 2a 20 57 68 69  chema,    /* Whi
3fb0: 63 68 20 44 42 20 74 6f 20 72 65 6f 70 65 6e 20  ch DB to reopen 
3fc0: 77 69 74 68 20 74 68 65 20 64 65 73 65 72 69 61  with the deseria
3fd0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  lization */.  un
3fe0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
3ff0: 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 73 65 72  ta,   /* The ser
4000: 69 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73 65  ialized database
4010: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71   content */.  sq
4020: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 44 62  lite3_int64 szDb
4030: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
4040: 62 79 74 65 73 20 69 6e 20 74 68 65 20 64 65 73  bytes in the des
4050: 65 72 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  erialization */.
4060: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4070: 73 7a 42 75 66 2c 20 20 20 20 2f 2a 20 54 6f 74  szBuf,    /* Tot
4080: 61 6c 20 73 69 7a 65 20 6f 66 20 62 75 66 66 65  al size of buffe
4090: 72 20 70 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  r pData[] */.  u
40a0: 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 73 20 20  nsigned mFlags  
40b0: 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
40c0: 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 44 45  r more SQLITE_DE
40d0: 53 45 52 49 41 4c 49 5a 45 5f 2a 20 66 6c 61 67  SERIALIZE_* flag
40e0: 73 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c  s */.){.  MemFil
40f0: 65 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  e *p;.  char *zS
4100: 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ql;.  sqlite3_st
4110: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
4120: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
4130: 44 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Db;..#ifdef SQLI
4140: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
4150: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
4160: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
4170: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
4180: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
4190: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
41a0: 73 7a 44 62 3c 30 20 29 20 72 65 74 75 72 6e 20  szDb<0 ) return 
41b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
41c0: 50 54 3b 0a 20 20 69 66 28 20 73 7a 42 75 66 3c  PT;.  if( szBuf<
41d0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
41e0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
41f0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
4200: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
4210: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
4220: 53 63 68 65 6d 61 3d 3d 30 20 29 20 7a 53 63 68  Schema==0 ) zSch
4230: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d  ema = db->aDb[0]
4240: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 69 44 62  .zDbSName;.  iDb
4250: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
4260: 4e 61 6d 65 28 64 62 2c 20 7a 53 63 68 65 6d 61  Name(db, zSchema
4270: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
4280: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
4290: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74  E_ERROR;.    got
42a0: 6f 20 65 6e 64 5f 64 65 73 65 72 69 61 6c 69 7a  o end_deserializ
42b0: 65 3b 0a 20 20 7d 20 20 20 20 0a 20 20 7a 53 71  e;.  }    .  zSq
42c0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
42d0: 6e 74 66 28 22 41 54 54 41 43 48 20 78 20 41 53  ntf("ATTACH x AS
42e0: 20 25 51 22 2c 20 7a 53 63 68 65 6d 61 29 3b 0a   %Q", zSchema);.
42f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
4300: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
4310: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
4320: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
4330: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
4340: 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 64 65  rc ) goto end_de
4350: 73 65 72 69 61 6c 69 7a 65 3b 0a 20 20 64 62 2d  serialize;.  db-
4360: 3e 69 6e 69 74 2e 69 44 62 20 3d 20 28 75 38 29  >init.iDb = (u8)
4370: 69 44 62 3b 0a 20 20 64 62 2d 3e 69 6e 69 74 2e  iDb;.  db->init.
4380: 72 65 6f 70 65 6e 4d 65 6d 64 62 20 3d 20 31 3b  reopenMemdb = 1;
4390: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
43a0: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 64  step(pStmt);.  d
43b0: 62 2d 3e 69 6e 69 74 2e 72 65 6f 70 65 6e 4d 65  b->init.reopenMe
43c0: 6d 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  mdb = 0;.  if( r
43d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
43e0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
43f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74  E_ERROR;.    got
4400: 6f 20 65 6e 64 5f 64 65 73 65 72 69 61 6c 69 7a  o end_deserializ
4410: 65 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 6d 65 6d  e;.  }.  p = mem
4420: 64 62 46 72 6f 6d 44 62 53 63 68 65 6d 61 28 64  dbFromDbSchema(d
4430: 62 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 69  b, zSchema);.  i
4440: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( p==0 ){.    r
4450: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
4460: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4470: 2d 3e 61 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->aData = pData;
4480: 0a 20 20 20 20 70 2d 3e 73 7a 20 3d 20 73 7a 44  .    p->sz = szD
4490: 62 3b 0a 20 20 20 20 70 2d 3e 73 7a 41 6c 6c 6f  b;.    p->szAllo
44a0: 63 20 3d 20 73 7a 42 75 66 3b 0a 20 20 20 20 70  c = szBuf;.    p
44b0: 2d 3e 73 7a 4d 61 78 20 3d 20 73 7a 42 75 66 3b  ->szMax = szBuf;
44c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61  .    if( p->szMa
44d0: 78 3c 53 51 4c 49 54 45 5f 4d 45 4d 44 42 5f 44  x<SQLITE_MEMDB_D
44e0: 45 46 41 55 4c 54 5f 4d 41 58 53 49 5a 45 20 29  EFAULT_MAXSIZE )
44f0: 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 78  {.      p->szMax
4500: 20 3d 20 53 51 4c 49 54 45 5f 4d 45 4d 44 42 5f   = SQLITE_MEMDB_
4510: 44 45 46 41 55 4c 54 5f 4d 41 58 53 49 5a 45 3b  DEFAULT_MAXSIZE;
4520: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6d 46  .    }.    p->mF
4530: 6c 61 67 73 20 3d 20 6d 46 6c 61 67 73 3b 0a 20  lags = mFlags;. 
4540: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
4550: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 64 65 73 65  K;.  }..end_dese
4560: 72 69 61 6c 69 7a 65 3a 0a 20 20 73 71 6c 69 74  rialize:.  sqlit
4570: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
4580: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  t);.  sqlite3_mu
4590: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
45a0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
45b0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
45c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
45d0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 65 78 74  led when the ext
45e0: 65 6e 73 69 6f 6e 20 69 73 20 6c 6f 61 64 65 64  ension is loaded
45f0: 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  ..** Register th
4600: 65 20 6e 65 77 20 56 46 53 2e 0a 2a 2f 0a 69 6e  e new VFS..*/.in
4610: 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 62 49 6e  t sqlite3MemdbIn
4620: 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  it(void){.  sqli
4630: 74 65 33 5f 76 66 73 20 2a 70 4c 6f 77 65 72 20  te3_vfs *pLower 
4640: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
4650: 6e 64 28 30 29 3b 0a 20 20 69 6e 74 20 73 7a 20  nd(0);.  int sz 
4660: 3d 20 70 4c 6f 77 65 72 2d 3e 73 7a 4f 73 46 69  = pLower->szOsFi
4670: 6c 65 3b 0a 20 20 6d 65 6d 64 62 5f 76 66 73 2e  le;.  memdb_vfs.
4680: 70 41 70 70 44 61 74 61 20 3d 20 70 4c 6f 77 65  pAppData = pLowe
4690: 72 3b 0a 20 20 2f 2a 20 49 6e 20 61 6c 6c 20 6b  r;.  /* In all k
46a0: 6e 6f 77 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  nown configurati
46b0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 20 74  ons of SQLite, t
46c0: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 64 65 66  he size of a def
46d0: 61 75 6c 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ault.  ** sqlite
46e0: 33 5f 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  3_file is greate
46f0: 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65 20  r than the size 
4700: 6f 66 20 61 20 6d 65 6d 64 62 20 73 71 6c 69 74  of a memdb sqlit
4710: 65 33 5f 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 68  e3_file..  ** Sh
4720: 6f 75 6c 64 20 74 68 61 74 20 65 76 65 72 20 63  ould that ever c
4730: 68 61 6e 67 65 2c 20 72 65 6d 6f 76 65 20 74 68  hange, remove th
4740: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4e 45 56 45  e following NEVE
4750: 52 28 29 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  R() */.  if( NEV
4760: 45 52 28 73 7a 3c 73 69 7a 65 6f 66 28 4d 65 6d  ER(sz<sizeof(Mem
4770: 46 69 6c 65 29 29 20 29 20 73 7a 20 3d 20 73 69  File)) ) sz = si
4780: 7a 65 6f 66 28 4d 65 6d 46 69 6c 65 29 3b 0a 20  zeof(MemFile);. 
4790: 20 6d 65 6d 64 62 5f 76 66 73 2e 73 7a 4f 73 46   memdb_vfs.szOsF
47a0: 69 6c 65 20 3d 20 73 7a 3b 0a 20 20 72 65 74 75  ile = sz;.  retu
47b0: 72 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  rn sqlite3_vfs_r
47c0: 65 67 69 73 74 65 72 28 26 6d 65 6d 64 62 5f 76  egister(&memdb_v
47d0: 66 73 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  fs, 0);.}.#endif
47e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
47f0: 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f  E_DESERIALIZE */
4800: 0a                                               .