/ Hex Artifact Content
Login

Artifact 0683aac6cab6ec2b5374c0db37c0deb2436a3785:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4f 63 74 6f 62  /*.** 2008 Octob
0010: 65 72 20 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  er 7.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 75 73 65 20 74 6f 20 69 6d 70 6c 65 6d 65  e use to impleme
01a0: 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
01b0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
01c0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 2d 6d 65 6d 6f  ..** The in-memo
01d0: 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
01e0: 6e 61 6c 20 69 73 20 75 73 65 64 20 74 6f 20 6a  nal is used to j
01f0: 6f 75 72 6e 61 6c 20 74 72 61 6e 73 61 63 74 69  ournal transacti
0200: 6f 6e 73 20 66 6f 72 0a 2a 2a 20 22 3a 6d 65 6d  ons for.** ":mem
0210: 6f 72 79 3a 22 20 64 61 74 61 62 61 73 65 73 20  ory:" databases 
0220: 61 6e 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  and when the jou
0230: 72 6e 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59  rnal_mode=MEMORY
0240: 20 70 72 61 67 6d 61 20 69 73 20 75 73 65 64 2e   pragma is used.
0250: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0260: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46  liteInt.h"../* F
0270: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
0280: 73 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 73 74  s to internal st
0290: 72 75 63 74 75 72 65 73 20 2a 2f 0a 74 79 70 65  ructures */.type
02a0: 64 65 66 20 73 74 72 75 63 74 20 4d 65 6d 4a 6f  def struct MemJo
02b0: 75 72 6e 61 6c 20 4d 65 6d 4a 6f 75 72 6e 61 6c  urnal MemJournal
02c0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
02d0: 20 46 69 6c 65 50 6f 69 6e 74 20 46 69 6c 65 50   FilePoint FileP
02e0: 6f 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73 74  oint;.typedef st
02f0: 72 75 63 74 20 46 69 6c 65 43 68 75 6e 6b 20 46  ruct FileChunk F
0300: 69 6c 65 43 68 75 6e 6b 3b 0a 0a 2f 2a 20 53 70  ileChunk;../* Sp
0310: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
0320: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
0330: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
0340: 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66 0a 2a   increments of.*
0350: 2a 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  * this many byte
0360: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
0370: 65 20 63 68 6f 73 65 6e 20 69 73 20 61 20 6c 69  e chosen is a li
0380: 74 74 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 61  ttle less than a
0390: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20   power of two.  
03a0: 54 68 61 74 20 77 61 79 2c 0a 2a 2a 20 74 68 65  That way,.** the
03b0: 20 46 69 6c 65 43 68 75 6e 6b 20 6f 62 6a 65 63   FileChunk objec
03c0: 74 20 77 69 6c 6c 20 68 61 76 65 20 61 20 73 69  t will have a si
03d0: 7a 65 20 74 68 61 74 20 61 6c 6d 6f 73 74 20 65  ze that almost e
03e0: 78 61 63 74 6c 79 20 66 69 6c 6c 73 0a 2a 2a 20  xactly fills.** 
03f0: 61 20 70 6f 77 65 72 2d 6f 66 2d 74 77 6f 20 61  a power-of-two a
0400: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
0410: 20 6d 69 6d 69 6d 69 7a 65 73 20 77 61 73 74 65   mimimizes waste
0420: 64 20 73 70 61 63 65 20 69 6e 20 70 6f 77 65 72  d space in power
0430: 2d 6f 66 2d 74 77 6f 0a 2a 2a 20 6d 65 6d 6f 72  -of-two.** memor
0440: 79 20 61 6c 6c 6f 63 61 74 6f 72 73 2e 0a 2a 2f  y allocators..*/
0450: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
0460: 5f 43 48 55 4e 4b 53 49 5a 45 20 28 28 69 6e 74  _CHUNKSIZE ((int
0470: 29 28 31 30 32 34 2d 73 69 7a 65 6f 66 28 46 69  )(1024-sizeof(Fi
0480: 6c 65 43 68 75 6e 6b 2a 29 29 29 0a 0a 2f 2a 0a  leChunk*)))../*.
0490: 2a 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** The rollback 
04a0: 6a 6f 75 72 6e 61 6c 20 69 73 20 63 6f 6d 70 6f  journal is compo
04b0: 73 65 64 20 6f 66 20 61 20 6c 69 6e 6b 65 64 20  sed of a linked 
04c0: 6c 69 73 74 20 6f 66 20 74 68 65 73 65 20 73 74  list of these st
04d0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 74 72  ructures..*/.str
04e0: 75 63 74 20 46 69 6c 65 43 68 75 6e 6b 20 7b 0a  uct FileChunk {.
04f0: 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 4e 65    FileChunk *pNe
0500: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
0510: 20 20 2f 2a 20 4e 65 78 74 20 63 68 75 6e 6b 20    /* Next chunk 
0520: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
0530: 2f 0a 20 20 75 38 20 7a 43 68 75 6e 6b 5b 4a 4f  /.  u8 zChunk[JO
0540: 55 52 4e 41 4c 5f 43 48 55 4e 4b 53 49 5a 45 5d  URNAL_CHUNKSIZE]
0550: 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f  ;   /* Content o
0560: 66 20 74 68 69 73 20 63 68 75 6e 6b 20 2a 2f 0a  f this chunk */.
0570: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
0580: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
0590: 6a 65 63 74 20 73 65 72 76 65 73 20 61 73 20 61  ject serves as a
05a0: 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
05b0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
05c0: 6c 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  l..** The cursor
05d0: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 66   can be either f
05e0: 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
05f0: 69 74 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63 74  iting..*/.struct
0600: 20 46 69 6c 65 50 6f 69 6e 74 20 7b 0a 20 20 73   FilePoint {.  s
0610: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
0620: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  fset;          /
0630: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 74 68  * Offset from th
0640: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0650: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 46 69 6c  he file */.  Fil
0660: 65 43 68 75 6e 6b 20 2a 70 43 68 75 6e 6b 3b 20  eChunk *pChunk; 
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0680: 53 70 65 63 69 66 69 63 20 63 68 75 6e 6b 20 69  Specific chunk i
0690: 6e 74 6f 20 77 68 69 63 68 20 63 75 72 73 6f 72  nto which cursor
06a0: 20 70 6f 69 6e 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f   points */.};../
06b0: 2a 0a 2a 2a 20 54 68 69 73 20 73 75 62 63 6c 61  *.** This subcla
06c0: 73 73 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  ss is a subclass
06d0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
06e0: 2e 20 20 45 61 63 68 20 6f 70 65 6e 20 6d 65 6d  .  Each open mem
06f0: 6f 72 79 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ory-journal.** i
0700: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
0710: 20 74 68 69 73 20 63 6c 61 73 73 2e 0a 2a 2f 0a   this class..*/.
0720: 73 74 72 75 63 74 20 4d 65 6d 4a 6f 75 72 6e 61  struct MemJourna
0730: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  l {.  sqlite3_io
0740: 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
0750: 64 3b 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  d;    /* Parent 
0760: 63 6c 61 73 73 2e 20 4d 55 53 54 20 42 45 20 46  class. MUST BE F
0770: 49 52 53 54 20 2a 2f 0a 20 20 46 69 6c 65 43 68  IRST */.  FileCh
0780: 75 6e 6b 20 2a 70 46 69 72 73 74 3b 20 20 20 20  unk *pFirst;    
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 61            /* Hea
07a0: 64 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63  d of in-memory c
07b0: 68 75 6e 6b 2d 6c 69 73 74 20 2a 2f 0a 20 20 46  hunk-list */.  F
07c0: 69 6c 65 50 6f 69 6e 74 20 65 6e 64 70 6f 69 6e  ilePoint endpoin
07d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
07e0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
07f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
0800: 20 2a 2f 0a 20 20 46 69 6c 65 50 6f 69 6e 74 20   */.  FilePoint 
0810: 72 65 61 64 70 6f 69 6e 74 3b 20 20 20 20 20 20  readpoint;      
0820: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
0830: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
0840: 68 65 20 6c 61 73 74 20 78 52 65 61 64 28 29 20  he last xRead() 
0850: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  */.};../*.** Rea
0860: 64 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  d data from the 
0870: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
0880: 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
0890: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
08a0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 71  ion.** of the sq
08b0: 6c 69 74 65 33 5f 76 66 73 2e 78 52 65 61 64 20  lite3_vfs.xRead 
08c0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
08d0: 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 52 65 61  c int memjrnlRea
08e0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
08f0: 65 20 2a 70 4a 66 64 2c 20 20 20 20 2f 2a 20 54  e *pJfd,    /* T
0900: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0910: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 72 65  from which to re
0920: 61 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 7a 42  ad */.  void *zB
0930: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  uf,            /
0940: 2a 20 50 75 74 20 74 68 65 20 72 65 73 75 6c 74  * Put the result
0950: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
0960: 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  iAmt,           
0970: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0980: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
0990: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
09a0: 69 4f 66 73 74 20 20 20 20 20 2f 2a 20 42 65 67  iOfst     /* Beg
09b0: 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68  in reading at th
09c0: 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a  is offset */.){.
09d0: 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20    MemJournal *p 
09e0: 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 29  = (MemJournal *)
09f0: 70 4a 66 64 3b 0a 20 20 75 38 20 2a 7a 4f 75 74  pJfd;.  u8 *zOut
0a00: 20 3d 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e   = zBuf;.  int n
0a10: 52 65 61 64 20 3d 20 69 41 6d 74 3b 0a 20 20 69  Read = iAmt;.  i
0a20: 6e 74 20 69 43 68 75 6e 6b 4f 66 66 73 65 74 3b  nt iChunkOffset;
0a30: 0a 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 43  .  FileChunk *pC
0a40: 68 75 6e 6b 3b 0a 0a 20 20 2f 2a 20 53 51 4c 69  hunk;..  /* SQLi
0a50: 74 65 20 6e 65 76 65 72 20 74 72 69 65 73 20 74  te never tries t
0a60: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
0a70: 65 6e 64 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  end of a rollbac
0a80: 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  k journal file *
0a90: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 4f 66 73  /.  assert( iOfs
0aa0: 74 2b 69 41 6d 74 3c 3d 70 2d 3e 65 6e 64 70 6f  t+iAmt<=p->endpo
0ab0: 69 6e 74 2e 69 4f 66 66 73 65 74 20 29 3b 0a 0a  int.iOffset );..
0ac0: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 70 6f 69    if( p->readpoi
0ad0: 6e 74 2e 69 4f 66 66 73 65 74 21 3d 69 4f 66 73  nt.iOffset!=iOfs
0ae0: 74 20 7c 7c 20 69 4f 66 73 74 3d 3d 30 20 29 7b  t || iOfst==0 ){
0af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
0b00: 36 34 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20  64 iOff = 0;.   
0b10: 20 66 6f 72 28 70 43 68 75 6e 6b 3d 70 2d 3e 70   for(pChunk=p->p
0b20: 46 69 72 73 74 3b 20 0a 20 20 20 20 20 20 20 20  First; .        
0b30: 41 4c 57 41 59 53 28 70 43 68 75 6e 6b 29 20 26  ALWAYS(pChunk) &
0b40: 26 20 28 69 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  & (iOff+JOURNAL_
0b50: 43 48 55 4e 4b 53 49 5a 45 29 3c 3d 69 4f 66 73  CHUNKSIZE)<=iOfs
0b60: 74 3b 0a 20 20 20 20 20 20 20 20 70 43 68 75 6e  t;.        pChun
0b70: 6b 3d 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 0a  k=pChunk->pNext.
0b80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4f 66      ){.      iOf
0b90: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 43 48 55  f += JOURNAL_CHU
0ba0: 4e 4b 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20 20  NKSIZE;.    }.  
0bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 68 75 6e  }else{.    pChun
0bc0: 6b 20 3d 20 70 2d 3e 72 65 61 64 70 6f 69 6e 74  k = p->readpoint
0bd0: 2e 70 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  .pChunk;.  }..  
0be0: 69 43 68 75 6e 6b 4f 66 66 73 65 74 20 3d 20 28  iChunkOffset = (
0bf0: 69 6e 74 29 28 69 4f 66 73 74 25 4a 4f 55 52 4e  int)(iOfst%JOURN
0c00: 41 4c 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20  AL_CHUNKSIZE);. 
0c10: 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 53   do {.    int iS
0c20: 70 61 63 65 20 3d 20 4a 4f 55 52 4e 41 4c 5f 43  pace = JOURNAL_C
0c30: 48 55 4e 4b 53 49 5a 45 20 2d 20 69 43 68 75 6e  HUNKSIZE - iChun
0c40: 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  kOffset;.    int
0c50: 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 6e 52 65   nCopy = MIN(nRe
0c60: 61 64 2c 20 28 4a 4f 55 52 4e 41 4c 5f 43 48 55  ad, (JOURNAL_CHU
0c70: 4e 4b 53 49 5a 45 20 2d 20 69 43 68 75 6e 6b 4f  NKSIZE - iChunkO
0c80: 66 66 73 65 74 29 29 3b 0a 20 20 20 20 6d 65 6d  ffset));.    mem
0c90: 63 70 79 28 7a 4f 75 74 2c 20 26 70 43 68 75 6e  cpy(zOut, &pChun
0ca0: 6b 2d 3e 7a 43 68 75 6e 6b 5b 69 43 68 75 6e 6b  k->zChunk[iChunk
0cb0: 4f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  Offset], nCopy);
0cc0: 0a 20 20 20 20 7a 4f 75 74 20 2b 3d 20 6e 43 6f  .    zOut += nCo
0cd0: 70 79 3b 0a 20 20 20 20 6e 52 65 61 64 20 2d 3d  py;.    nRead -=
0ce0: 20 69 53 70 61 63 65 3b 0a 20 20 20 20 69 43 68   iSpace;.    iCh
0cf0: 75 6e 6b 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  unkOffset = 0;. 
0d00: 20 7d 20 77 68 69 6c 65 28 20 6e 52 65 61 64 3e   } while( nRead>
0d10: 3d 30 20 26 26 20 28 70 43 68 75 6e 6b 3d 70 43  =0 && (pChunk=pC
0d20: 68 75 6e 6b 2d 3e 70 4e 65 78 74 29 21 3d 30 20  hunk->pNext)!=0 
0d30: 26 26 20 6e 52 65 61 64 3e 30 20 29 3b 0a 20 20  && nRead>0 );.  
0d40: 70 2d 3e 72 65 61 64 70 6f 69 6e 74 2e 69 4f 66  p->readpoint.iOf
0d50: 66 73 65 74 20 3d 20 69 4f 66 73 74 2b 69 41 6d  fset = iOfst+iAm
0d60: 74 3b 0a 20 20 70 2d 3e 72 65 61 64 70 6f 69 6e  t;.  p->readpoin
0d70: 74 2e 70 43 68 75 6e 6b 20 3d 20 70 43 68 75 6e  t.pChunk = pChun
0d80: 6b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  k;..  return SQL
0d90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
0da0: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   Write data to t
0db0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
0dc0: 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 57 72  ic int memjrnlWr
0dd0: 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
0de0: 69 6c 65 20 2a 70 4a 66 64 2c 20 20 20 20 2f 2a  ile *pJfd,    /*
0df0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
0e00: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20  e into which to 
0e10: 77 72 69 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  write */.  const
0e20: 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 20 20 20   void *zBuf,    
0e30: 20 20 2f 2a 20 54 61 6b 65 20 64 61 74 61 20 74    /* Take data t
0e40: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 66 72 6f  o be written fro
0e50: 6d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  m here */.  int 
0e60: 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  iAmt,           
0e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0e80: 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a  bytes to write *
0e90: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
0ea0: 20 69 4f 66 73 74 20 20 20 20 20 2f 2a 20 42 65   iOfst     /* Be
0eb0: 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 74  gin writing at t
0ec0: 68 69 73 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  his offset into 
0ed0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
0ee0: 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20 3d   MemJournal *p =
0ef0: 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 29 70   (MemJournal *)p
0f00: 4a 66 64 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  Jfd;.  int nWrit
0f10: 65 20 3d 20 69 41 6d 74 3b 0a 20 20 75 38 20 2a  e = iAmt;.  u8 *
0f20: 7a 57 72 69 74 65 20 3d 20 28 75 38 20 2a 29 7a  zWrite = (u8 *)z
0f30: 42 75 66 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e  Buf;..  /* An in
0f40: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
0f50: 66 69 6c 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  file should only
0f60: 20 65 76 65 72 20 62 65 20 61 70 70 65 6e 64 65   ever be appende
0f70: 64 20 74 6f 2e 20 52 61 6e 64 6f 6d 0a 20 20 2a  d to. Random.  *
0f80: 2a 20 61 63 63 65 73 73 20 77 72 69 74 65 73 20  * access writes 
0f90: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
0fa0: 20 62 79 20 73 71 6c 69 74 65 2e 0a 20 20 2a 2f   by sqlite..  */
0fb0: 0a 20 20 61 73 73 65 72 74 28 20 69 4f 66 73 74  .  assert( iOfst
0fc0: 3d 3d 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f  ==p->endpoint.iO
0fd0: 66 66 73 65 74 20 29 3b 0a 20 20 55 4e 55 53 45  ffset );.  UNUSE
0fe0: 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 73  D_PARAMETER(iOfs
0ff0: 74 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 57  t);..  while( nW
1000: 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 46 69  rite>0 ){.    Fi
1010: 6c 65 43 68 75 6e 6b 20 2a 70 43 68 75 6e 6b 20  leChunk *pChunk 
1020: 3d 20 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 70 43  = p->endpoint.pC
1030: 68 75 6e 6b 3b 0a 20 20 20 20 69 6e 74 20 69 43  hunk;.    int iC
1040: 68 75 6e 6b 4f 66 66 73 65 74 20 3d 20 28 69 6e  hunkOffset = (in
1050: 74 29 28 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69  t)(p->endpoint.i
1060: 4f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 43  Offset%JOURNAL_C
1070: 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 20 20 69  HUNKSIZE);.    i
1080: 6e 74 20 69 53 70 61 63 65 20 3d 20 4d 49 4e 28  nt iSpace = MIN(
1090: 6e 57 72 69 74 65 2c 20 4a 4f 55 52 4e 41 4c 5f  nWrite, JOURNAL_
10a0: 43 48 55 4e 4b 53 49 5a 45 20 2d 20 69 43 68 75  CHUNKSIZE - iChu
10b0: 6e 6b 4f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  nkOffset);..    
10c0: 69 66 28 20 69 43 68 75 6e 6b 4f 66 66 73 65 74  if( iChunkOffset
10d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
10e0: 4e 65 77 20 63 68 75 6e 6b 20 69 73 20 72 65 71  New chunk is req
10f0: 75 69 72 65 64 20 74 6f 20 65 78 74 65 6e 64 20  uired to extend 
1100: 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
1110: 20 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 4e     FileChunk *pN
1120: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
1130: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 69 6c 65 43  loc(sizeof(FileC
1140: 68 75 6e 6b 29 29 3b 0a 20 20 20 20 20 20 69 66  hunk));.      if
1150: 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
1160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1170: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1180: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
1190: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
11a0: 20 20 20 69 66 28 20 70 43 68 75 6e 6b 20 29 7b     if( pChunk ){
11b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11c0: 20 70 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20   p->pFirst );.  
11d0: 20 20 20 20 20 20 70 43 68 75 6e 6b 2d 3e 70 4e        pChunk->pN
11e0: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
11f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1200: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 46 69   assert( !p->pFi
1210: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  rst );.        p
1220: 2d 3e 70 46 69 72 73 74 20 3d 20 70 4e 65 77 3b  ->pFirst = pNew;
1230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1240: 2d 3e 65 6e 64 70 6f 69 6e 74 2e 70 43 68 75 6e  ->endpoint.pChun
1250: 6b 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  k = pNew;.    }.
1260: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e  .    memcpy(&p->
1270: 65 6e 64 70 6f 69 6e 74 2e 70 43 68 75 6e 6b 2d  endpoint.pChunk-
1280: 3e 7a 43 68 75 6e 6b 5b 69 43 68 75 6e 6b 4f 66  >zChunk[iChunkOf
1290: 66 73 65 74 5d 2c 20 7a 57 72 69 74 65 2c 20 69  fset], zWrite, i
12a0: 53 70 61 63 65 29 3b 0a 20 20 20 20 7a 57 72 69  Space);.    zWri
12b0: 74 65 20 2b 3d 20 69 53 70 61 63 65 3b 0a 20 20  te += iSpace;.  
12c0: 20 20 6e 57 72 69 74 65 20 2d 3d 20 69 53 70 61    nWrite -= iSpa
12d0: 63 65 3b 0a 20 20 20 20 70 2d 3e 65 6e 64 70 6f  ce;.    p->endpo
12e0: 69 6e 74 2e 69 4f 66 66 73 65 74 20 2b 3d 20 69  int.iOffset += i
12f0: 53 70 61 63 65 3b 0a 20 20 7d 0a 0a 20 20 72 65  Space;.  }..  re
1300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1320: 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  e the file..*/.s
1330: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e  tatic int memjrn
1340: 6c 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  lTruncate(sqlite
1350: 33 5f 66 69 6c 65 20 2a 70 4a 66 64 2c 20 73 71  3_file *pJfd, sq
1360: 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29  lite_int64 size)
1370: 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a  {.  MemJournal *
1380: 70 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20  p = (MemJournal 
1390: 2a 29 70 4a 66 64 3b 0a 20 20 46 69 6c 65 43 68  *)pJfd;.  FileCh
13a0: 75 6e 6b 20 2a 70 43 68 75 6e 6b 3b 0a 20 20 61  unk *pChunk;.  a
13b0: 73 73 65 72 74 28 73 69 7a 65 3d 3d 30 29 3b 0a  ssert(size==0);.
13c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13d0: 45 52 28 73 69 7a 65 29 3b 0a 20 20 70 43 68 75  ER(size);.  pChu
13e0: 6e 6b 20 3d 20 70 2d 3e 70 46 69 72 73 74 3b 0a  nk = p->pFirst;.
13f0: 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 20    while( pChunk 
1400: 29 7b 0a 20 20 20 20 46 69 6c 65 43 68 75 6e 6b  ){.    FileChunk
1410: 20 2a 70 54 6d 70 20 3d 20 70 43 68 75 6e 6b 3b   *pTmp = pChunk;
1420: 0a 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 70 43  .    pChunk = pC
1430: 68 75 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  hunk->pNext;.   
1440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
1450: 6d 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  mp);.  }.  sqlit
1460: 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
1470: 28 70 4a 66 64 29 3b 0a 20 20 72 65 74 75 72 6e  (pJfd);.  return
1480: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1490: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
14a0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
14b0: 6e 74 20 6d 65 6d 6a 72 6e 6c 43 6c 6f 73 65 28  nt memjrnlClose(
14c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
14d0: 66 64 29 7b 0a 20 20 6d 65 6d 6a 72 6e 6c 54 72  fd){.  memjrnlTr
14e0: 75 6e 63 61 74 65 28 70 4a 66 64 2c 20 30 29 3b  uncate(pJfd, 0);
14f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1500: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  _OK;.}.../*.** S
1510: 79 6e 63 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ync the file..**
1520: 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 6e 20 69  .** Syncing an i
1530: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1540: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 41 6e   is a no-op.  An
1550: 64 2c 20 69 6e 20 66 61 63 74 2c 20 74 68 69 73  d, in fact, this
1560: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6e   routine.** is n
1570: 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 61  ever called in a
1580: 20 77 6f 72 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   working impleme
1590: 6e 74 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ntation.  This i
15a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
15b0: 20 65 78 69 73 74 73 20 70 75 72 65 6c 79 20 61   exists purely a
15c0: 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2c  s a contingency,
15d0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6d 61   in case some ma
15e0: 6c 66 75 6e 63 74 69 6f 6e 20 69 6e 20 73 6f 6d  lfunction in som
15f0: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 61 72 74 20  e other.** part 
1600: 6f 66 20 53 51 4c 69 74 65 20 63 61 75 73 65 73  of SQLite causes
1610: 20 53 79 6e 63 20 74 6f 20 62 65 20 63 61 6c 6c   Sync to be call
1620: 65 64 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a  ed by mistake..*
1630: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
1640: 6a 72 6e 6c 53 79 6e 63 28 73 71 6c 69 74 65 33  jrnlSync(sqlite3
1650: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
1660: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
1670: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1680: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
1690: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
16a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16b0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 73 69  .** Query the si
16c0: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
16d0: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
16e0: 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 46 69  ic int memjrnlFi
16f0: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1700: 69 6c 65 20 2a 70 4a 66 64 2c 20 73 71 6c 69 74  ile *pJfd, sqlit
1710: 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  e_int64 *pSize){
1720: 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70  .  MemJournal *p
1730: 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a   = (MemJournal *
1740: 29 70 4a 66 64 3b 0a 20 20 2a 70 53 69 7a 65 20  )pJfd;.  *pSize 
1750: 3d 20 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29  = (sqlite_int64)
1760: 20 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66   p->endpoint.iOf
1770: 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  fset;.  return S
1780: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1790: 2a 2a 20 54 61 62 6c 65 20 6f 66 20 6d 65 74 68  ** Table of meth
17a0: 6f 64 73 20 66 6f 72 20 4d 65 6d 4a 6f 75 72 6e  ods for MemJourn
17b0: 61 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al sqlite3_file 
17c0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
17d0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  c const struct s
17e0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
17f0: 73 20 4d 65 6d 4a 6f 75 72 6e 61 6c 4d 65 74 68  s MemJournalMeth
1800: 6f 64 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  ods = {.  1,    
1810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1820: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d  Version */.  mem
1830: 6a 72 6e 6c 43 6c 6f 73 65 2c 20 20 20 20 20 2f  jrnlClose,     /
1840: 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 6d 65  * xClose */.  me
1850: 6d 6a 72 6e 6c 52 65 61 64 2c 20 20 20 20 20 20  mjrnlRead,      
1860: 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 6d 65  /* xRead */.  me
1870: 6d 6a 72 6e 6c 57 72 69 74 65 2c 20 20 20 20 20  mjrnlWrite,     
1880: 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 6d  /* xWrite */.  m
1890: 65 6d 6a 72 6e 6c 54 72 75 6e 63 61 74 65 2c 20  emjrnlTruncate, 
18a0: 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
18b0: 0a 20 20 6d 65 6d 6a 72 6e 6c 53 79 6e 63 2c 20  .  memjrnlSync, 
18c0: 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
18d0: 0a 20 20 6d 65 6d 6a 72 6e 6c 46 69 6c 65 53 69  .  memjrnlFileSi
18e0: 7a 65 2c 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a  ze,  /* xFileSiz
18f0: 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
1900: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1910: 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
1920: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1930: 6f 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ock */.  0,     
1940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1950: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1960: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
1970: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1980: 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 30 2c 20  Control */.  0, 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a0: 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
19b0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
19c0: 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
19d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
19e0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
19f0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
1a00: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
1a10: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
1a20: 6f 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ock */.  0,     
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1a40: 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 30  hmBarrier */.  0
1a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a60: 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
1a70: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1a80: 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
1a90: 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
1aa0: 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
1ab0: 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  h */.};../* .** 
1ac0: 4f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  Open a journal f
1ad0: 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
1ae0: 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
1af0: 65 6e 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  en(sqlite3_file 
1b00: 2a 70 4a 66 64 29 7b 0a 20 20 4d 65 6d 4a 6f 75  *pJfd){.  MemJou
1b10: 72 6e 61 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f  rnal *p = (MemJo
1b20: 75 72 6e 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20  urnal *)pJfd;.  
1b30: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1b40: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 29 20  TE_ALIGNMENT(p) 
1b50: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  );.  memset(p, 0
1b60: 2c 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  , sqlite3MemJour
1b70: 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 70 2d  nalSize());.  p-
1b80: 3e 70 4d 65 74 68 6f 64 20 3d 20 28 73 71 6c 69  >pMethod = (sqli
1b90: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 2a 29  te3_io_methods*)
1ba0: 26 4d 65 6d 4a 6f 75 72 6e 61 6c 4d 65 74 68 6f  &MemJournalMetho
1bb0: 64 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ds;.}../*.** Ret
1bc0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1bd0: 66 69 6c 65 2d 68 61 6e 64 6c 65 20 70 61 73 73  file-handle pass
1be0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1bf0: 74 20 69 73 20 0a 2a 2a 20 61 6e 20 69 6e 2d 6d  t is .** an in-m
1c00: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 0a 2a  emory journal .*
1c10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4d  /.int sqlite3IsM
1c20: 65 6d 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  emJournal(sqlite
1c30: 33 5f 66 69 6c 65 20 2a 70 4a 66 64 29 7b 0a 20  3_file *pJfd){. 
1c40: 20 72 65 74 75 72 6e 20 70 4a 66 64 2d 3e 70 4d   return pJfd->pM
1c50: 65 74 68 6f 64 73 3d 3d 26 4d 65 6d 4a 6f 75 72  ethods==&MemJour
1c60: 6e 61 6c 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 2f  nalMethods;.}../
1c70: 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  * .** Return the
1c80: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1c90: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
1ca0: 72 65 20 61 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20  re a MemJournal 
1cb0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
1cc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1cd0: 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 76 6f  emJournalSize(vo
1ce0: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69  id){.  return si
1cf0: 7a 65 6f 66 28 4d 65 6d 4a 6f 75 72 6e 61 6c 29  zeof(MemJournal)
1d00: 3b 0a 7d 0a                                      ;.}.