/ Hex Artifact Content
Login

Artifact 1a987d078e7446a44417a1a6a01f80b48cf65b93:


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 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64 3a  .**.** @(#) $Id:
0260: 20 6d 65 6d 6a 6f 75 72 6e 61 6c 2e 63 2c 76 20   memjournal.c,v 
0270: 31 2e 31 31 20 32 30 30 39 2f 30 34 2f 30 35 20  1.11 2009/04/05 
0280: 31 32 3a 32 32 3a 30 39 20 64 72 68 20 45 78 70  12:22:09 drh Exp
0290: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
02a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
02b0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
02c0: 63 65 73 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20  ces to internal 
02d0: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 74 79  structures */.ty
02e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65 6d  pedef struct Mem
02f0: 4a 6f 75 72 6e 61 6c 20 4d 65 6d 4a 6f 75 72 6e  Journal MemJourn
0300: 61 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  al;.typedef stru
0310: 63 74 20 46 69 6c 65 50 6f 69 6e 74 20 46 69 6c  ct FilePoint Fil
0320: 65 50 6f 69 6e 74 3b 0a 74 79 70 65 64 65 66 20  ePoint;.typedef 
0330: 73 74 72 75 63 74 20 46 69 6c 65 43 68 75 6e 6b  struct FileChunk
0340: 20 46 69 6c 65 43 68 75 6e 6b 3b 0a 0a 2f 2a 20   FileChunk;../* 
0350: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
0360: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0370: 61 6c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  al is allocated 
0380: 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66  in increments of
0390: 0a 2a 2a 20 74 68 69 73 20 6d 61 6e 79 20 62 79  .** this many by
03a0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  tes..**.** The s
03b0: 69 7a 65 20 63 68 6f 73 65 6e 20 69 73 20 61 20  ize chosen is a 
03c0: 6c 69 74 74 6c 65 20 6c 65 73 73 20 74 68 61 6e  little less than
03d0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e   a power of two.
03e0: 20 20 54 68 61 74 20 77 61 79 2c 0a 2a 2a 20 74    That way,.** t
03f0: 68 65 20 46 69 6c 65 43 68 75 6e 6b 20 6f 62 6a  he FileChunk obj
0400: 65 63 74 20 77 69 6c 6c 20 68 61 76 65 20 61 20  ect will have a 
0410: 73 69 7a 65 20 74 68 61 74 20 61 6c 6d 6f 73 74  size that almost
0420: 20 65 78 61 63 74 6c 79 20 66 69 6c 6c 73 0a 2a   exactly fills.*
0430: 2a 20 61 20 70 6f 77 65 72 2d 6f 66 2d 74 77 6f  * a power-of-two
0440: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
0450: 69 73 20 6d 69 6d 69 6d 69 7a 65 73 20 77 61 73  is mimimizes was
0460: 74 65 64 20 73 70 61 63 65 20 69 6e 20 70 6f 77  ted space in pow
0470: 65 72 2d 6f 66 2d 74 77 6f 0a 2a 2a 20 6d 65 6d  er-of-two.** mem
0480: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 73 2e 0a  ory allocators..
0490: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
04a0: 41 4c 5f 43 48 55 4e 4b 53 49 5a 45 20 28 28 69  AL_CHUNKSIZE ((i
04b0: 6e 74 29 28 31 30 32 34 2d 73 69 7a 65 6f 66 28  nt)(1024-sizeof(
04c0: 46 69 6c 65 43 68 75 6e 6b 2a 29 29 29 0a 0a 2f  FileChunk*)))../
04d0: 2a 20 4d 61 63 72 6f 20 74 6f 20 66 69 6e 64 20  * Macro to find 
04e0: 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74  the minimum of t
04f0: 77 6f 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65  wo numeric value
0500: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49  s..*/.#ifndef MI
0510: 4e 0a 23 20 64 65 66 69 6e 65 20 4d 49 4e 28 78  N.# define MIN(x
0520: 2c 79 29 20 28 28 78 29 3c 28 79 29 3f 28 78 29  ,y) ((x)<(y)?(x)
0530: 3a 28 79 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  :(y)).#endif../*
0540: 0a 2a 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  .** The rollback
0550: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 6f 6d 70   journal is comp
0560: 6f 73 65 64 20 6f 66 20 61 20 6c 69 6e 6b 65 64  osed of a linked
0570: 20 6c 69 73 74 20 6f 66 20 74 68 65 73 65 20 73   list of these s
0580: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 74  tructures..*/.st
0590: 72 75 63 74 20 46 69 6c 65 43 68 75 6e 6b 20 7b  ruct FileChunk {
05a0: 0a 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 4e  .  FileChunk *pN
05b0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
05c0: 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 75 6e 6b     /* Next chunk
05d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
05e0: 2a 2f 0a 20 20 75 38 20 7a 43 68 75 6e 6b 5b 4a  */.  u8 zChunk[J
05f0: 4f 55 52 4e 41 4c 5f 43 48 55 4e 4b 53 49 5a 45  OURNAL_CHUNKSIZE
0600: 5d 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20  ];   /* Content 
0610: 6f 66 20 74 68 69 73 20 63 68 75 6e 6b 20 2a 2f  of this chunk */
0620: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0630: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
0640: 62 6a 65 63 74 20 73 65 72 76 65 73 20 61 73 20  bject serves as 
0650: 61 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  a cursor into th
0660: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0670: 61 6c 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  al..** The curso
0680: 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  r can be either 
0690: 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
06a0: 72 69 74 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63  riting..*/.struc
06b0: 74 20 46 69 6c 65 50 6f 69 6e 74 20 7b 0a 20 20  t FilePoint {.  
06c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
06d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
06e0: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 74  /* Offset from t
06f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
0700: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 46 69  the file */.  Fi
0710: 6c 65 43 68 75 6e 6b 20 2a 70 43 68 75 6e 6b 3b  leChunk *pChunk;
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0730: 20 53 70 65 63 69 66 69 63 20 63 68 75 6e 6b 20   Specific chunk 
0740: 69 6e 74 6f 20 77 68 69 63 68 20 63 75 72 73 6f  into which curso
0750: 72 20 70 6f 69 6e 74 73 20 2a 2f 0a 7d 3b 0a 0a  r points */.};..
0760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 75 62 63 6c  /*.** This subcl
0770: 61 73 73 20 69 73 20 61 20 73 75 62 63 6c 61 73  ass is a subclas
0780: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
0790: 65 2e 20 20 45 61 63 68 20 6f 70 65 6e 20 6d 65  e.  Each open me
07a0: 6d 6f 72 79 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  mory-journal.** 
07b0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
07c0: 66 20 74 68 69 73 20 63 6c 61 73 73 2e 0a 2a 2f  f this class..*/
07d0: 0a 73 74 72 75 63 74 20 4d 65 6d 4a 6f 75 72 6e  .struct MemJourn
07e0: 61 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  al {.  sqlite3_i
07f0: 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
0800: 6f 64 3b 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  od;    /* Parent
0810: 20 63 6c 61 73 73 2e 20 4d 55 53 54 20 42 45 20   class. MUST BE 
0820: 46 49 52 53 54 20 2a 2f 0a 20 20 46 69 6c 65 43  FIRST */.  FileC
0830: 68 75 6e 6b 20 2a 70 46 69 72 73 74 3b 20 20 20  hunk *pFirst;   
0840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
0850: 61 64 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  ad of in-memory 
0860: 63 68 75 6e 6b 2d 6c 69 73 74 20 2a 2f 0a 20 20  chunk-list */.  
0870: 46 69 6c 65 50 6f 69 6e 74 20 65 6e 64 70 6f 69  FilePoint endpoi
0880: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
0890: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
08a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
08b0: 65 20 2a 2f 0a 20 20 46 69 6c 65 50 6f 69 6e 74  e */.  FilePoint
08c0: 20 72 65 61 64 70 6f 69 6e 74 3b 20 20 20 20 20   readpoint;     
08d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
08e0: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
08f0: 74 68 65 20 6c 61 73 74 20 78 52 65 61 64 28 29  the last xRead()
0900: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   */.};../*.** Re
0910: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ad data from the
0920: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
0930: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
0940: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0950: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
0960: 71 6c 69 74 65 33 5f 76 66 73 2e 78 52 65 61 64  qlite3_vfs.xRead
0970: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
0980: 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 52 65  ic int memjrnlRe
0990: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
09a0: 6c 65 20 2a 70 4a 66 64 2c 20 20 20 20 2f 2a 20  le *pJfd,    /* 
09b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
09c0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 72   from which to r
09d0: 65 61 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 7a  ead */.  void *z
09e0: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
09f0: 2f 2a 20 50 75 74 20 74 68 65 20 72 65 73 75 6c  /* Put the resul
0a00: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
0a10: 20 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20   iAmt,          
0a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0a30: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
0a40: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
0a50: 20 69 4f 66 73 74 20 20 20 20 20 2f 2a 20 42 65   iOfst     /* Be
0a60: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
0a70: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
0a80: 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70  .  MemJournal *p
0a90: 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a   = (MemJournal *
0aa0: 29 70 4a 66 64 3b 0a 20 20 75 38 20 2a 7a 4f 75  )pJfd;.  u8 *zOu
0ab0: 74 20 3d 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20  t = zBuf;.  int 
0ac0: 6e 52 65 61 64 20 3d 20 69 41 6d 74 3b 0a 20 20  nRead = iAmt;.  
0ad0: 69 6e 74 20 69 43 68 75 6e 6b 4f 66 66 73 65 74  int iChunkOffset
0ae0: 3b 0a 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70  ;.  FileChunk *p
0af0: 43 68 75 6e 6b 3b 0a 0a 20 20 2f 2a 20 53 51 4c  Chunk;..  /* SQL
0b00: 69 74 65 20 6e 65 76 65 72 20 74 72 69 65 73 20  ite never tries 
0b10: 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
0b20: 20 65 6e 64 20 6f 66 20 61 20 72 6f 6c 6c 62 61   end of a rollba
0b30: 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
0b40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 4f 66  */.  assert( iOf
0b50: 73 74 2b 69 41 6d 74 3c 3d 70 2d 3e 65 6e 64 70  st+iAmt<=p->endp
0b60: 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 29 3b 0a  oint.iOffset );.
0b70: 0a 20 20 69 66 28 20 70 2d 3e 72 65 61 64 70 6f  .  if( p->readpo
0b80: 69 6e 74 2e 69 4f 66 66 73 65 74 21 3d 69 4f 66  int.iOffset!=iOf
0b90: 73 74 20 7c 7c 20 69 4f 66 73 74 3d 3d 30 20 29  st || iOfst==0 )
0ba0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
0bb0: 74 36 34 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  t64 iOff = 0;.  
0bc0: 20 20 66 6f 72 28 70 43 68 75 6e 6b 3d 70 2d 3e    for(pChunk=p->
0bd0: 70 46 69 72 73 74 3b 20 0a 20 20 20 20 20 20 20  pFirst; .       
0be0: 20 41 4c 57 41 59 53 28 70 43 68 75 6e 6b 29 20   ALWAYS(pChunk) 
0bf0: 26 26 20 28 69 4f 66 66 2b 4a 4f 55 52 4e 41 4c  && (iOff+JOURNAL
0c00: 5f 43 48 55 4e 4b 53 49 5a 45 29 3c 3d 69 4f 66  _CHUNKSIZE)<=iOf
0c10: 73 74 3b 0a 20 20 20 20 20 20 20 20 70 43 68 75  st;.        pChu
0c20: 6e 6b 3d 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74  nk=pChunk->pNext
0c30: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4f  .    ){.      iO
0c40: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 43 48  ff += JOURNAL_CH
0c50: 55 4e 4b 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20  UNKSIZE;.    }. 
0c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 68 75   }else{.    pChu
0c70: 6e 6b 20 3d 20 70 2d 3e 72 65 61 64 70 6f 69 6e  nk = p->readpoin
0c80: 74 2e 70 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  t.pChunk;.  }.. 
0c90: 20 69 43 68 75 6e 6b 4f 66 66 73 65 74 20 3d 20   iChunkOffset = 
0ca0: 28 69 6e 74 29 28 69 4f 66 73 74 25 4a 4f 55 52  (int)(iOfst%JOUR
0cb0: 4e 41 4c 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a  NAL_CHUNKSIZE);.
0cc0: 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69    do {.    int i
0cd0: 53 70 61 63 65 20 3d 20 4a 4f 55 52 4e 41 4c 5f  Space = JOURNAL_
0ce0: 43 48 55 4e 4b 53 49 5a 45 20 2d 20 69 43 68 75  CHUNKSIZE - iChu
0cf0: 6e 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e  nkOffset;.    in
0d00: 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 6e 52  t nCopy = MIN(nR
0d10: 65 61 64 2c 20 28 4a 4f 55 52 4e 41 4c 5f 43 48  ead, (JOURNAL_CH
0d20: 55 4e 4b 53 49 5a 45 20 2d 20 69 43 68 75 6e 6b  UNKSIZE - iChunk
0d30: 4f 66 66 73 65 74 29 29 3b 0a 20 20 20 20 6d 65  Offset));.    me
0d40: 6d 63 70 79 28 7a 4f 75 74 2c 20 26 70 43 68 75  mcpy(zOut, &pChu
0d50: 6e 6b 2d 3e 7a 43 68 75 6e 6b 5b 69 43 68 75 6e  nk->zChunk[iChun
0d60: 6b 4f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29  kOffset], nCopy)
0d70: 3b 0a 20 20 20 20 7a 4f 75 74 20 2b 3d 20 6e 43  ;.    zOut += nC
0d80: 6f 70 79 3b 0a 20 20 20 20 6e 52 65 61 64 20 2d  opy;.    nRead -
0d90: 3d 20 69 53 70 61 63 65 3b 0a 20 20 20 20 69 43  = iSpace;.    iC
0da0: 68 75 6e 6b 4f 66 66 73 65 74 20 3d 20 30 3b 0a  hunkOffset = 0;.
0db0: 20 20 7d 20 77 68 69 6c 65 28 20 6e 52 65 61 64    } while( nRead
0dc0: 3e 3d 30 20 26 26 20 28 70 43 68 75 6e 6b 3d 70  >=0 && (pChunk=p
0dd0: 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 29 21 3d 30  Chunk->pNext)!=0
0de0: 20 26 26 20 6e 52 65 61 64 3e 30 20 29 3b 0a 20   && nRead>0 );. 
0df0: 20 70 2d 3e 72 65 61 64 70 6f 69 6e 74 2e 69 4f   p->readpoint.iO
0e00: 66 66 73 65 74 20 3d 20 69 4f 66 73 74 2b 69 41  ffset = iOfst+iA
0e10: 6d 74 3b 0a 20 20 70 2d 3e 72 65 61 64 70 6f 69  mt;.  p->readpoi
0e20: 6e 74 2e 70 43 68 75 6e 6b 20 3d 20 70 43 68 75  nt.pChunk = pChu
0e30: 6e 6b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  nk;..  return SQ
0e40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
0e50: 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20  * Write data to 
0e60: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
0e70: 74 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 57  tic int memjrnlW
0e80: 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
0e90: 66 69 6c 65 20 2a 70 4a 66 64 2c 20 20 20 20 2f  file *pJfd,    /
0ea0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
0eb0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  le into which to
0ec0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 63 6f 6e 73   write */.  cons
0ed0: 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 20 20  t void *zBuf,   
0ee0: 20 20 20 2f 2a 20 54 61 6b 65 20 64 61 74 61 20     /* Take data 
0ef0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 66 72  to be written fr
0f00: 6f 6d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  om here */.  int
0f10: 20 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20   iAmt,          
0f20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0f30: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
0f40: 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  */.  sqlite_int6
0f50: 34 20 69 4f 66 73 74 20 20 20 20 20 2f 2a 20 42  4 iOfst     /* B
0f60: 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
0f70: 74 68 69 73 20 6f 66 66 73 65 74 20 69 6e 74 6f  this offset into
0f80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
0f90: 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20    MemJournal *p 
0fa0: 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 29  = (MemJournal *)
0fb0: 70 4a 66 64 3b 0a 20 20 69 6e 74 20 6e 57 72 69  pJfd;.  int nWri
0fc0: 74 65 20 3d 20 69 41 6d 74 3b 0a 20 20 75 38 20  te = iAmt;.  u8 
0fd0: 2a 7a 57 72 69 74 65 20 3d 20 28 75 38 20 2a 29  *zWrite = (u8 *)
0fe0: 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69  zBuf;..  /* An i
0ff0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1000: 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 6f 6e 6c   file should onl
1010: 79 20 65 76 65 72 20 62 65 20 61 70 70 65 6e 64  y ever be append
1020: 65 64 20 74 6f 2e 20 52 61 6e 64 6f 6d 0a 20 20  ed to. Random.  
1030: 2a 2a 20 61 63 63 65 73 73 20 77 72 69 74 65 73  ** access writes
1040: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
1050: 64 20 62 79 20 73 71 6c 69 74 65 2e 0a 20 20 2a  d by sqlite..  *
1060: 2f 0a 20 20 61 73 73 65 72 74 28 69 4f 66 73 74  /.  assert(iOfst
1070: 3d 3d 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f  ==p->endpoint.iO
1080: 66 66 73 65 74 29 3b 0a 20 20 55 4e 55 53 45 44  ffset);.  UNUSED
1090: 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 73 74  _PARAMETER(iOfst
10a0: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 57 72  );..  while( nWr
10b0: 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 46 69 6c  ite>0 ){.    Fil
10c0: 65 43 68 75 6e 6b 20 2a 70 43 68 75 6e 6b 20 3d  eChunk *pChunk =
10d0: 20 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 70 43 68   p->endpoint.pCh
10e0: 75 6e 6b 3b 0a 20 20 20 20 69 6e 74 20 69 43 68  unk;.    int iCh
10f0: 75 6e 6b 4f 66 66 73 65 74 20 3d 20 28 69 6e 74  unkOffset = (int
1100: 29 28 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f  )(p->endpoint.iO
1110: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 43 48  ffset%JOURNAL_CH
1120: 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 20 20 69 6e  UNKSIZE);.    in
1130: 74 20 69 53 70 61 63 65 20 3d 20 4d 49 4e 28 6e  t iSpace = MIN(n
1140: 57 72 69 74 65 2c 20 4a 4f 55 52 4e 41 4c 5f 43  Write, JOURNAL_C
1150: 48 55 4e 4b 53 49 5a 45 20 2d 20 69 43 68 75 6e  HUNKSIZE - iChun
1160: 6b 4f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 69  kOffset);..    i
1170: 66 28 20 69 43 68 75 6e 6b 4f 66 66 73 65 74 3d  f( iChunkOffset=
1180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
1190: 65 77 20 63 68 75 6e 6b 20 69 73 20 72 65 71 75  ew chunk is requ
11a0: 69 72 65 64 20 74 6f 20 65 78 74 65 6e 64 20 74  ired to extend t
11b0: 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  he file. */.    
11c0: 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 4e 65    FileChunk *pNe
11d0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
11e0: 6f 63 28 73 69 7a 65 6f 66 28 46 69 6c 65 43 68  oc(sizeof(FileCh
11f0: 75 6e 6b 29 29 3b 0a 20 20 20 20 20 20 69 66 28  unk));.      if(
1200: 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
1210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1220: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1230: 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1240: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
1250: 20 20 69 66 28 20 70 43 68 75 6e 6b 20 29 7b 0a    if( pChunk ){.
1260: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1270: 70 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 20  p->pFirst );.   
1280: 20 20 20 20 20 70 43 68 75 6e 6b 2d 3e 70 4e 65       pChunk->pNe
1290: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
12a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12b0: 61 73 73 65 72 74 28 20 21 70 2d 3e 70 46 69 72  assert( !p->pFir
12c0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  st );.        p-
12d0: 3e 70 46 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a  >pFirst = pNew;.
12e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
12f0: 3e 65 6e 64 70 6f 69 6e 74 2e 70 43 68 75 6e 6b  >endpoint.pChunk
1300: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = pNew;.    }..
1310: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 65      memcpy(&p->e
1320: 6e 64 70 6f 69 6e 74 2e 70 43 68 75 6e 6b 2d 3e  ndpoint.pChunk->
1330: 7a 43 68 75 6e 6b 5b 69 43 68 75 6e 6b 4f 66 66  zChunk[iChunkOff
1340: 73 65 74 5d 2c 20 7a 57 72 69 74 65 2c 20 69 53  set], zWrite, iS
1350: 70 61 63 65 29 3b 0a 20 20 20 20 7a 57 72 69 74  pace);.    zWrit
1360: 65 20 2b 3d 20 69 53 70 61 63 65 3b 0a 20 20 20  e += iSpace;.   
1370: 20 6e 57 72 69 74 65 20 2d 3d 20 69 53 70 61 63   nWrite -= iSpac
1380: 65 3b 0a 20 20 20 20 70 2d 3e 65 6e 64 70 6f 69  e;.    p->endpoi
1390: 6e 74 2e 69 4f 66 66 73 65 74 20 2b 3d 20 69 53  nt.iOffset += iS
13a0: 70 61 63 65 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pace;.  }..  ret
13b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13c0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
13d0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
13e0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c  atic int memjrnl
13f0: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1400: 5f 66 69 6c 65 20 2a 70 4a 66 64 2c 20 73 71 6c  _file *pJfd, sql
1410: 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b  ite_int64 size){
1420: 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70  .  MemJournal *p
1430: 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a   = (MemJournal *
1440: 29 70 4a 66 64 3b 0a 20 20 46 69 6c 65 43 68 75  )pJfd;.  FileChu
1450: 6e 6b 20 2a 70 43 68 75 6e 6b 3b 0a 20 20 61 73  nk *pChunk;.  as
1460: 73 65 72 74 28 73 69 7a 65 3d 3d 30 29 3b 0a 20  sert(size==0);. 
1470: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1480: 52 28 73 69 7a 65 29 3b 0a 20 20 70 43 68 75 6e  R(size);.  pChun
1490: 6b 20 3d 20 70 2d 3e 70 46 69 72 73 74 3b 0a 20  k = p->pFirst;. 
14a0: 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 20 29   while( pChunk )
14b0: 7b 0a 20 20 20 20 46 69 6c 65 43 68 75 6e 6b 20  {.    FileChunk 
14c0: 2a 70 54 6d 70 20 3d 20 70 43 68 75 6e 6b 3b 0a  *pTmp = pChunk;.
14d0: 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 70 43 68      pChunk = pCh
14e0: 75 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  unk->pNext;.    
14f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 6d  sqlite3_free(pTm
1500: 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
1510: 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
1520: 70 4a 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pJfd);.  return 
1530: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1540: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
1550: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1560: 74 20 6d 65 6d 6a 72 6e 6c 43 6c 6f 73 65 28 73  t memjrnlClose(s
1570: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66  qlite3_file *pJf
1580: 64 29 7b 0a 20 20 6d 65 6d 6a 72 6e 6c 54 72 75  d){.  memjrnlTru
1590: 6e 63 61 74 65 28 70 4a 66 64 2c 20 30 29 3b 0a  ncate(pJfd, 0);.
15a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15b0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 79  OK;.}.../*.** Sy
15c0: 6e 63 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  nc the file..**.
15d0: 2a 2a 20 53 79 6e 63 69 6e 67 20 61 6e 20 69 6e  ** Syncing an in
15e0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
15f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 41 6e 64  is a no-op.  And
1600: 2c 20 69 6e 20 66 61 63 74 2c 20 74 68 69 73 20  , in fact, this 
1610: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6e 65  routine.** is ne
1620: 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 61 20  ver called in a 
1630: 77 6f 72 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  working implemen
1640: 74 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6d  tation.  This im
1650: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
1660: 65 78 69 73 74 73 20 70 75 72 65 6c 79 20 61 73  exists purely as
1670: 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2c 20   a contingency, 
1680: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6d 61 6c  in case some mal
1690: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 73 6f 6d 65  function in some
16a0: 20 6f 74 68 65 72 0a 2a 2a 20 70 61 72 74 20 6f   other.** part o
16b0: 66 20 53 51 4c 69 74 65 20 63 61 75 73 65 73 20  f SQLite causes 
16c0: 53 79 6e 63 20 74 6f 20 62 65 20 63 61 6c 6c 65  Sync to be calle
16d0: 64 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2f  d by mistake..*/
16e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 6a  .static int memj
16f0: 72 6e 6c 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  rnlSync(sqlite3_
1700: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
1710: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 20 20 20  nt NotUsed2){   
1720: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
1730: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
1740: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
1750: 32 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2);             
1760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
1770: 54 45 53 54 2a 2f 0a 20 20 61 73 73 65 72 74 28  TEST*/.  assert(
1780: 20 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20   0 );           
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
17c0: 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
17d0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20   /*NO_TEST*/.}  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
1850: 5f 54 45 53 54 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  _TEST*/../*.** Q
1860: 75 65 72 79 20 74 68 65 20 73 69 7a 65 20 6f 66  uery the size of
1870: 20 74 68 65 20 66 69 6c 65 20 69 6e 20 62 79 74   the file in byt
1880: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1890: 74 20 6d 65 6d 6a 72 6e 6c 46 69 6c 65 53 69 7a  t memjrnlFileSiz
18a0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
18b0: 70 4a 66 64 2c 20 73 71 6c 69 74 65 5f 69 6e 74  pJfd, sqlite_int
18c0: 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 4d 65  64 *pSize){.  Me
18d0: 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20 3d 20 28 4d  mJournal *p = (M
18e0: 65 6d 4a 6f 75 72 6e 61 6c 20 2a 29 70 4a 66 64  emJournal *)pJfd
18f0: 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 73 71  ;.  *pSize = (sq
1900: 6c 69 74 65 5f 69 6e 74 36 34 29 20 70 2d 3e 65  lite_int64) p->e
1910: 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 3b  ndpoint.iOffset;
1920: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1930: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  _OK;.}../*.** Ta
1940: 62 6c 65 20 6f 66 20 6d 65 74 68 6f 64 73 20 66  ble of methods f
1950: 6f 72 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 73 71  or MemJournal sq
1960: 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
1970: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  t..*/.static str
1980: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  uct sqlite3_io_m
1990: 65 74 68 6f 64 73 20 4d 65 6d 4a 6f 75 72 6e 61  ethods MemJourna
19a0: 6c 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 31  lMethods = {.  1
19b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19c0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
19d0: 20 20 6d 65 6d 6a 72 6e 6c 43 6c 6f 73 65 2c 20    memjrnlClose, 
19e0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
19f0: 0a 20 20 6d 65 6d 6a 72 6e 6c 52 65 61 64 2c 20  .  memjrnlRead, 
1a00: 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
1a10: 0a 20 20 6d 65 6d 6a 72 6e 6c 57 72 69 74 65 2c  .  memjrnlWrite,
1a20: 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
1a30: 2f 0a 20 20 6d 65 6d 6a 72 6e 6c 54 72 75 6e 63  /.  memjrnlTrunc
1a40: 61 74 65 2c 20 20 2f 2a 20 78 54 72 75 6e 63 61  ate,  /* xTrunca
1a50: 74 65 20 2a 2f 0a 20 20 6d 65 6d 6a 72 6e 6c 53  te */.  memjrnlS
1a60: 79 6e 63 2c 20 20 20 20 20 20 2f 2a 20 78 53 79  ync,      /* xSy
1a70: 6e 63 20 2a 2f 0a 20 20 6d 65 6d 6a 72 6e 6c 46  nc */.  memjrnlF
1a80: 69 6c 65 53 69 7a 65 2c 20 20 2f 2a 20 78 46 69  ileSize,  /* xFi
1a90: 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 30 2c 20 20  leSize */.  0,  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab0: 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 30 2c 20 20   xLock */.  0,  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad0: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 30 2c   xUnlock */.  0,
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1b00: 64 4c 6f 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20  dLock */.  0,   
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b20: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
1b30: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1b40: 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1b50: 7a 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  ze */.  0       
1b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
1b70: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b80: 69 63 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ics */.};../* .*
1b90: 2a 20 4f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  * Open a journal
1ba0: 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
1bb0: 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1bc0: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 66 69 6c  Open(sqlite3_fil
1bd0: 65 20 2a 70 4a 66 64 29 7b 0a 20 20 4d 65 6d 4a  e *pJfd){.  MemJ
1be0: 6f 75 72 6e 61 6c 20 2a 70 20 3d 20 28 4d 65 6d  ournal *p = (Mem
1bf0: 4a 6f 75 72 6e 61 6c 20 2a 29 70 4a 66 64 3b 0a  Journal *)pJfd;.
1c00: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1c10: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1c20: 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  ) );.  memset(p,
1c30: 20 30 2c 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f   0, sqlite3MemJo
1c40: 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
1c50: 70 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 4d 65  p->pMethod = &Me
1c60: 6d 4a 6f 75 72 6e 61 6c 4d 65 74 68 6f 64 73 3b  mJournalMethods;
1c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c80: 20 74 72 75 65 20 69 66 20 74 68 65 20 66 69 6c   true if the fil
1c90: 65 2d 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e-handle passed 
1ca0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
1cb0: 73 20 0a 2a 2a 20 61 6e 20 69 6e 2d 6d 65 6d 6f  s .** an in-memo
1cc0: 72 79 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2f 0a 69  ry journal .*/.i
1cd0: 6e 74 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  nt sqlite3IsMemJ
1ce0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
1cf0: 69 6c 65 20 2a 70 4a 66 64 29 7b 0a 20 20 72 65  ile *pJfd){.  re
1d00: 74 75 72 6e 20 70 4a 66 64 2d 3e 70 4d 65 74 68  turn pJfd->pMeth
1d10: 6f 64 73 3d 3d 26 4d 65 6d 4a 6f 75 72 6e 61 6c  ods==&MemJournal
1d20: 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 2f 2a 20 0a  Methods;.}../* .
1d30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1d40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1d50: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
1d60: 61 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 74 68 61  a MemJournal tha
1d70: 74 20 75 73 65 73 20 76 66 73 0a 2a 2a 20 70 56  t uses vfs.** pV
1d80: 66 73 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  fs to create the
1d90: 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 6e 2d 64   underlying on-d
1da0: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
1db0: 74 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  t sqlite3MemJour
1dc0: 6e 61 6c 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  nalSize(void){. 
1dd0: 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 4d   return sizeof(M
1de0: 65 6d 4a 6f 75 72 6e 61 6c 29 3b 0a 7d 0a        emJournal);.}.