/ Hex Artifact Content
Login

Artifact 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d:


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 55 70 64 61 74 65 3a 20 20  .**.** Update:  
0260: 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  The in-memory jo
0270: 75 72 6e 61 6c 20 69 73 20 61 6c 73 6f 20 75 73  urnal is also us
0280: 65 64 20 74 6f 20 74 65 6d 70 6f 72 61 72 69 6c  ed to temporaril
0290: 79 20 63 61 63 68 65 0a 2a 2a 20 73 6d 61 6c 6c  y cache.** small
02a0: 65 72 20 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74  er journals that
02b0: 20 61 72 65 20 6e 6f 74 20 63 72 69 74 69 63 61   are not critica
02c0: 6c 20 66 6f 72 20 70 6f 77 65 72 2d 6c 6f 73 73  l for power-loss
02d0: 20 72 65 63 6f 76 65 72 79 2e 0a 2a 2a 20 46 6f   recovery..** Fo
02e0: 72 20 65 78 61 6d 70 6c 65 2c 20 73 74 61 74 65  r example, state
02f0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 74 68  ment journals th
0300: 61 74 20 61 72 65 20 6e 6f 74 20 74 6f 6f 20 62  at are not too b
0310: 69 67 20 77 69 6c 6c 20 62 65 20 68 65 6c 64 0a  ig will be held.
0320: 2a 2a 20 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d  ** entirely in m
0330: 65 6d 6f 72 79 2c 20 74 68 75 73 20 72 65 64 75  emory, thus redu
0340: 63 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  cing the number 
0350: 6f 66 20 66 69 6c 65 20 49 2f 4f 20 63 61 6c 6c  of file I/O call
0360: 73 2c 20 61 6e 64 0a 2a 2a 20 6d 6f 72 65 20 69  s, and.** more i
0370: 6d 70 6f 72 74 61 6e 74 6c 79 2c 20 72 65 64 75  mportantly, redu
0380: 63 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 66  cing temporary f
0390: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 65 76 65  ile creation eve
03a0: 6e 74 73 2e 20 20 49 66 20 74 68 65 73 65 0a 2a  nts.  If these.*
03b0: 2a 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 6f 6d  * journals becom
03c0: 65 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  e too large for 
03d0: 6d 65 6d 6f 72 79 2c 20 74 68 65 79 20 61 72 65  memory, they are
03e0: 20 73 70 69 6c 6c 65 64 20 74 6f 20 64 69 73 6b   spilled to disk
03f0: 2e 20 20 42 75 74 0a 2a 2a 20 69 6e 20 74 68 65  .  But.** in the
0400: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2c 20 74 68   common case, th
0410: 65 79 20 61 72 65 20 75 73 75 61 6c 6c 79 20 73  ey are usually s
0420: 6d 61 6c 6c 20 61 6e 64 20 6e 6f 20 66 69 6c 65  mall and no file
0430: 20 49 2f 4f 20 6e 65 65 64 73 20 74 6f 0a 2a 2a   I/O needs to.**
0440: 20 6f 63 63 75 72 2e 0a 2a 2f 0a 23 69 6e 63 6c   occur..*/.#incl
0450: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0460: 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  "../* Forward re
0470: 66 65 72 65 6e 63 65 73 20 74 6f 20 69 6e 74 65  ferences to inte
0480: 72 6e 61 6c 20 73 74 72 75 63 74 75 72 65 73 20  rnal structures 
0490: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
04a0: 74 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 4d 65 6d  t MemJournal Mem
04b0: 4a 6f 75 72 6e 61 6c 3b 0a 74 79 70 65 64 65 66  Journal;.typedef
04c0: 20 73 74 72 75 63 74 20 46 69 6c 65 50 6f 69 6e   struct FilePoin
04d0: 74 20 46 69 6c 65 50 6f 69 6e 74 3b 0a 74 79 70  t FilePoint;.typ
04e0: 65 64 65 66 20 73 74 72 75 63 74 20 46 69 6c 65  edef struct File
04f0: 43 68 75 6e 6b 20 46 69 6c 65 43 68 75 6e 6b 3b  Chunk FileChunk;
0500: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6c 6c  ../*.** The roll
0510: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73 20  back journal is 
0520: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69  composed of a li
0530: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68 65  nked list of the
0540: 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  se structures..*
0550: 2a 0a 2a 2a 20 54 68 65 20 7a 43 68 75 6e 6b 20  *.** The zChunk 
0560: 61 72 72 61 79 20 69 73 20 61 6c 77 61 79 73 20  array is always 
0570: 61 74 20 6c 65 61 73 74 20 38 20 62 79 74 65 73  at least 8 bytes
0580: 20 69 6e 20 73 69 7a 65 20 2d 20 75 73 75 61 6c   in size - usual
0590: 6c 79 20 6d 75 63 68 20 6d 6f 72 65 2e 0a 2a 2a  ly much more..**
05a0: 20 49 74 73 20 61 63 74 75 61 6c 20 73 69 7a 65   Its actual size
05b0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
05c0: 65 20 4d 65 6d 4a 6f 75 72 6e 61 6c 2e 6e 43 68  e MemJournal.nCh
05d0: 75 6e 6b 53 69 7a 65 20 76 61 72 69 61 62 6c 65  unkSize variable
05e0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 69 6c 65  ..*/.struct File
05f0: 43 68 75 6e 6b 20 7b 0a 20 20 46 69 6c 65 43 68  Chunk {.  FileCh
0600: 75 6e 6b 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  unk *pNext;     
0610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
0620: 74 20 63 68 75 6e 6b 20 69 6e 20 74 68 65 20 6a  t chunk in the j
0630: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 7a  ournal */.  u8 z
0640: 43 68 75 6e 6b 5b 38 5d 3b 20 20 20 20 20 20 20  Chunk[8];       
0650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
0660: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 63  ontent of this c
0670: 68 75 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  hunk */.};../*.*
0680: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 61 6c  * By default, al
0690: 6c 6f 63 61 74 65 20 74 68 69 73 20 6d 61 6e 79  locate this many
06a0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
06b0: 20 66 6f 72 20 65 61 63 68 20 46 69 6c 65 43 68   for each FileCh
06c0: 75 6e 6b 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 23  unk object..*/.#
06d0: 64 65 66 69 6e 65 20 4d 45 4d 4a 4f 55 52 4e 41  define MEMJOURNA
06e0: 4c 5f 44 46 4c 54 5f 46 49 4c 45 43 48 55 4e 4b  L_DFLT_FILECHUNK
06f0: 53 49 5a 45 20 31 30 32 34 0a 0a 2f 2a 0a 2a 2a  SIZE 1024../*.**
0700: 20 46 6f 72 20 63 68 75 6e 6b 20 73 69 7a 65 20   For chunk size 
0710: 6e 43 68 75 6e 6b 53 69 7a 65 2c 20 72 65 74 75  nChunkSize, retu
0720: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
0730: 20 62 79 74 65 73 20 74 68 61 74 20 73 68 6f 75   bytes that shou
0740: 6c 64 0a 2a 2a 20 62 65 20 61 6c 6c 6f 63 61 74  ld.** be allocat
0750: 65 64 20 66 6f 72 20 65 61 63 68 20 46 69 6c 65  ed for each File
0760: 43 68 75 6e 6b 20 73 74 72 75 63 74 75 72 65 2e  Chunk structure.
0770: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c 65  .*/.#define file
0780: 43 68 75 6e 6b 53 69 7a 65 28 6e 43 68 75 6e 6b  ChunkSize(nChunk
0790: 53 69 7a 65 29 20 28 73 69 7a 65 6f 66 28 46 69  Size) (sizeof(Fi
07a0: 6c 65 43 68 75 6e 6b 29 20 2b 20 28 28 6e 43 68  leChunk) + ((nCh
07b0: 75 6e 6b 53 69 7a 65 29 2d 38 29 29 0a 0a 2f 2a  unkSize)-8))../*
07c0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
07d0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 73  of this object s
07e0: 65 72 76 65 73 20 61 73 20 61 20 63 75 72 73 6f  erves as a curso
07f0: 72 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  r into the rollb
0800: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0810: 54 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  The cursor can b
0820: 65 20 65 69 74 68 65 72 20 66 6f 72 20 72 65 61  e either for rea
0830: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
0840: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 69 6c 65 50  .*/.struct FileP
0850: 6f 69 6e 74 20 7b 0a 20 20 73 71 6c 69 74 65 33  oint {.  sqlite3
0860: 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 3b 20  _int64 iOffset; 
0870: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
0880: 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  et from the begi
0890: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
08a0: 65 20 2a 2f 0a 20 20 46 69 6c 65 43 68 75 6e 6b  e */.  FileChunk
08b0: 20 2a 70 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   *pChunk;       
08c0: 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66         /* Specif
08d0: 69 63 20 63 68 75 6e 6b 20 69 6e 74 6f 20 77 68  ic chunk into wh
08e0: 69 63 68 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ich cursor point
08f0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
0900: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
0910: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
0920: 71 6c 69 74 65 33 5f 66 69 6c 65 2e 20 45 61 63  qlite3_file. Eac
0930: 68 20 6f 70 65 6e 20 6d 65 6d 6f 72 79 2d 6a 6f  h open memory-jo
0940: 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 61 6e 20 69  urnal.** is an i
0950: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0960: 63 6c 61 73 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  class..*/.struct
0970: 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 7b 0a 20 20   MemJournal {.  
0980: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
0990: 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
09a0: 64 3b 20 2f 2a 20 50 61 72 65 6e 74 20 63 6c 61  d; /* Parent cla
09b0: 73 73 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53  ss. MUST BE FIRS
09c0: 54 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 75 6e  T */.  int nChun
09d0: 6b 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  kSize;          
09e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 2d 6d 65 6d         /* In-mem
09f0: 6f 72 79 20 63 68 75 6e 6b 2d 73 69 7a 65 20 2a  ory chunk-size *
0a00: 2f 0a 0a 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b  /..  int nSpill;
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0a30: 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75   data before flu
0a40: 73 68 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  shing */.  int n
0a50: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
0a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
0a70: 74 65 73 20 6f 66 20 64 61 74 61 20 63 75 72 72  tes of data curr
0a80: 65 6e 74 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 20  ently in memory 
0a90: 2a 2f 0a 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a  */.  FileChunk *
0aa0: 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
0ab0: 20 20 20 20 20 2f 2a 20 48 65 61 64 20 6f 66 20       /* Head of 
0ac0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 68 75 6e 6b 2d  in-memory chunk-
0ad0: 6c 69 73 74 20 2a 2f 0a 20 20 46 69 6c 65 50 6f  list */.  FilePo
0ae0: 69 6e 74 20 65 6e 64 70 6f 69 6e 74 3b 20 20 20  int endpoint;   
0af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0b00: 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20  nter to the end 
0b10: 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
0b20: 20 46 69 6c 65 50 6f 69 6e 74 20 72 65 61 64 70   FilePoint readp
0b30: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  oint;           
0b40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
0b50: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
0b60: 73 74 20 78 52 65 61 64 28 29 20 2a 2f 0a 0a 20  st xRead() */.. 
0b70: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 2f 2a 20 78 4f 70 65 6e 20 66 6c 61 67 73 20   /* xOpen flags 
0ba0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
0bb0: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
0bc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
0bd0: 6c 22 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  l" underlying VF
0be0: 53 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  S */.  const cha
0bf0: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
0c00: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0c10: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
0c20: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
0c30: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74  Read data from t
0c40: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
0c50: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
0c60: 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
0c70: 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  tation.** of the
0c80: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 52 65   sqlite3_vfs.xRe
0c90: 61 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ad method..*/.st
0ca0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c  atic int memjrnl
0cb0: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
0cc0: 66 69 6c 65 20 2a 70 4a 66 64 2c 20 20 20 20 2f  file *pJfd,    /
0cd0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
0ce0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
0cf0: 20 72 65 61 64 20 2a 2f 0a 20 20 76 6f 69 64 20   read */.  void 
0d00: 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *zBuf,          
0d10: 20 20 2f 2a 20 50 75 74 20 74 68 65 20 72 65 73    /* Put the res
0d20: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
0d30: 6e 74 20 69 41 6d 74 2c 20 20 20 20 20 20 20 20  nt iAmt,        
0d40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d50: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
0d60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74   */.  sqlite_int
0d70: 36 34 20 69 4f 66 73 74 20 20 20 20 20 2f 2a 20  64 iOfst     /* 
0d80: 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74  Begin reading at
0d90: 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a   this offset */.
0da0: 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20  ){.  MemJournal 
0db0: 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c  *p = (MemJournal
0dc0: 20 2a 29 70 4a 66 64 3b 0a 20 20 75 38 20 2a 7a   *)pJfd;.  u8 *z
0dd0: 4f 75 74 20 3d 20 7a 42 75 66 3b 0a 20 20 69 6e  Out = zBuf;.  in
0de0: 74 20 6e 52 65 61 64 20 3d 20 69 41 6d 74 3b 0a  t nRead = iAmt;.
0df0: 20 20 69 6e 74 20 69 43 68 75 6e 6b 4f 66 66 73    int iChunkOffs
0e00: 65 74 3b 0a 20 20 46 69 6c 65 43 68 75 6e 6b 20  et;.  FileChunk 
0e10: 2a 70 43 68 75 6e 6b 3b 0a 0a 20 20 69 66 28 20  *pChunk;..  if( 
0e20: 28 69 41 6d 74 2b 69 4f 66 73 74 29 3e 70 2d 3e  (iAmt+iOfst)>p->
0e30: 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  endpoint.iOffset
0e40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
0e50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
0e60: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 61 73  T_READ;.  }.  as
0e70: 73 65 72 74 28 20 70 2d 3e 72 65 61 64 70 6f 69  sert( p->readpoi
0e80: 6e 74 2e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  nt.iOffset==0 ||
0e90: 20 70 2d 3e 72 65 61 64 70 6f 69 6e 74 2e 70 43   p->readpoint.pC
0ea0: 68 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 69 66 28  hunk!=0 );.  if(
0eb0: 20 70 2d 3e 72 65 61 64 70 6f 69 6e 74 2e 69 4f   p->readpoint.iO
0ec0: 66 66 73 65 74 21 3d 69 4f 66 73 74 20 7c 7c 20  ffset!=iOfst || 
0ed0: 69 4f 66 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iOfst==0 ){.    
0ee0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
0ef0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ff = 0;.    for(
0f00: 70 43 68 75 6e 6b 3d 70 2d 3e 70 46 69 72 73 74  pChunk=p->pFirst
0f10: 3b 20 0a 20 20 20 20 20 20 20 20 41 4c 57 41 59  ; .        ALWAY
0f20: 53 28 70 43 68 75 6e 6b 29 20 26 26 20 28 69 4f  S(pChunk) && (iO
0f30: 66 66 2b 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65  ff+p->nChunkSize
0f40: 29 3c 3d 69 4f 66 73 74 3b 0a 20 20 20 20 20 20  )<=iOfst;.      
0f50: 20 20 70 43 68 75 6e 6b 3d 70 43 68 75 6e 6b 2d    pChunk=pChunk-
0f60: 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20  >pNext.    ){.  
0f70: 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e      iOff += p->n
0f80: 43 68 75 6e 6b 53 69 7a 65 3b 0a 20 20 20 20 7d  ChunkSize;.    }
0f90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
0fa0: 68 75 6e 6b 20 3d 20 70 2d 3e 72 65 61 64 70 6f  hunk = p->readpo
0fb0: 69 6e 74 2e 70 43 68 75 6e 6b 3b 0a 20 20 20 20  int.pChunk;.    
0fc0: 61 73 73 65 72 74 28 20 70 43 68 75 6e 6b 21 3d  assert( pChunk!=
0fd0: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 68 75  0 );.  }..  iChu
0fe0: 6e 6b 4f 66 66 73 65 74 20 3d 20 28 69 6e 74 29  nkOffset = (int)
0ff0: 28 69 4f 66 73 74 25 70 2d 3e 6e 43 68 75 6e 6b  (iOfst%p->nChunk
1000: 53 69 7a 65 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  Size);.  do {.  
1010: 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 70    int iSpace = p
1020: 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 20 2d 20 69  ->nChunkSize - i
1030: 43 68 75 6e 6b 4f 66 66 73 65 74 3b 0a 20 20 20  ChunkOffset;.   
1040: 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1050: 28 6e 52 65 61 64 2c 20 28 70 2d 3e 6e 43 68 75  (nRead, (p->nChu
1060: 6e 6b 53 69 7a 65 20 2d 20 69 43 68 75 6e 6b 4f  nkSize - iChunkO
1070: 66 66 73 65 74 29 29 3b 0a 20 20 20 20 6d 65 6d  ffset));.    mem
1080: 63 70 79 28 7a 4f 75 74 2c 20 28 75 38 2a 29 70  cpy(zOut, (u8*)p
1090: 43 68 75 6e 6b 2d 3e 7a 43 68 75 6e 6b 20 2b 20  Chunk->zChunk + 
10a0: 69 43 68 75 6e 6b 4f 66 66 73 65 74 2c 20 6e 43  iChunkOffset, nC
10b0: 6f 70 79 29 3b 0a 20 20 20 20 7a 4f 75 74 20 2b  opy);.    zOut +
10c0: 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 52 65  = nCopy;.    nRe
10d0: 61 64 20 2d 3d 20 69 53 70 61 63 65 3b 0a 20 20  ad -= iSpace;.  
10e0: 20 20 69 43 68 75 6e 6b 4f 66 66 73 65 74 20 3d    iChunkOffset =
10f0: 20 30 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20 6e   0;.  } while( n
1100: 52 65 61 64 3e 3d 30 20 26 26 20 28 70 43 68 75  Read>=0 && (pChu
1110: 6e 6b 3d 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74  nk=pChunk->pNext
1120: 29 21 3d 30 20 26 26 20 6e 52 65 61 64 3e 30 20  )!=0 && nRead>0 
1130: 29 3b 0a 20 20 70 2d 3e 72 65 61 64 70 6f 69 6e  );.  p->readpoin
1140: 74 2e 69 4f 66 66 73 65 74 20 3d 20 70 43 68 75  t.iOffset = pChu
1150: 6e 6b 20 3f 20 69 4f 66 73 74 2b 69 41 6d 74 20  nk ? iOfst+iAmt 
1160: 3a 20 30 3b 0a 20 20 70 2d 3e 72 65 61 64 70 6f  : 0;.  p->readpo
1170: 69 6e 74 2e 70 43 68 75 6e 6b 20 3d 20 70 43 68  int.pChunk = pCh
1180: 75 6e 6b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  unk;..  return S
1190: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11a0: 2a 2a 20 46 72 65 65 20 74 68 65 20 6c 69 73 74  ** Free the list
11b0: 20 6f 66 20 46 69 6c 65 43 68 75 6e 6b 20 73 74   of FileChunk st
11c0: 72 75 63 74 75 72 65 73 20 68 65 61 64 65 64 20  ructures headed 
11d0: 61 74 20 4d 65 6d 4a 6f 75 72 6e 61 6c 2e 70 46  at MemJournal.pF
11e0: 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  irst..*/.static 
11f0: 76 6f 69 64 20 6d 65 6d 6a 72 6e 6c 46 72 65 65  void memjrnlFree
1200: 43 68 75 6e 6b 73 28 4d 65 6d 4a 6f 75 72 6e 61  Chunks(MemJourna
1210: 6c 20 2a 70 29 7b 0a 20 20 46 69 6c 65 43 68 75  l *p){.  FileChu
1220: 6e 6b 20 2a 70 49 74 65 72 3b 0a 20 20 46 69 6c  nk *pIter;.  Fil
1230: 65 43 68 75 6e 6b 20 2a 70 4e 65 78 74 3b 0a 20  eChunk *pNext;. 
1240: 20 66 6f 72 28 70 49 74 65 72 3d 70 2d 3e 70 46   for(pIter=p->pF
1250: 69 72 73 74 3b 20 70 49 74 65 72 3b 20 70 49 74  irst; pIter; pIt
1260: 65 72 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  er=pNext){.    p
1270: 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 4e  Next = pIter->pN
1280: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
1290: 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
12a0: 7d 20 0a 20 20 70 2d 3e 70 46 69 72 73 74 20 3d  } .  p->pFirst =
12b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75   0;.}../*.** Flu
12c0: 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
12d0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 61 20 72  of memory to a r
12e0: 65 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  eal file on disk
12f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1300: 6d 65 6d 6a 72 6e 6c 43 72 65 61 74 65 46 69 6c  memjrnlCreateFil
1310: 65 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 29  e(MemJournal *p)
1320: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1330: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
1340: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
1350: 65 2a 29 70 3b 0a 20 20 4d 65 6d 4a 6f 75 72 6e  e*)p;.  MemJourn
1360: 61 6c 20 63 6f 70 79 20 3d 20 2a 70 3b 0a 0a 20  al copy = *p;.. 
1370: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1380: 7a 65 6f 66 28 4d 65 6d 4a 6f 75 72 6e 61 6c 29  zeof(MemJournal)
1390: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13a0: 33 4f 73 4f 70 65 6e 28 63 6f 70 79 2e 70 56 66  3OsOpen(copy.pVf
13b0: 73 2c 20 63 6f 70 79 2e 7a 4a 6f 75 72 6e 61 6c  s, copy.zJournal
13c0: 2c 20 70 52 65 61 6c 2c 20 63 6f 70 79 2e 66 6c  , pReal, copy.fl
13d0: 61 67 73 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ags, 0);.  if( r
13e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13f0: 20 20 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d      int nChunk =
1400: 20 63 6f 70 79 2e 6e 43 68 75 6e 6b 53 69 7a 65   copy.nChunkSize
1410: 3b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d  ;.    i64 iOff =
1420: 20 30 3b 0a 20 20 20 20 46 69 6c 65 43 68 75 6e   0;.    FileChun
1430: 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
1440: 72 28 70 49 74 65 72 3d 63 6f 70 79 2e 70 46 69  r(pIter=copy.pFi
1450: 72 73 74 3b 20 70 49 74 65 72 3b 20 70 49 74 65  rst; pIter; pIte
1460: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1470: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 20  .      if( iOff 
1480: 2b 20 6e 43 68 75 6e 6b 20 3e 20 63 6f 70 79 2e  + nChunk > copy.
1490: 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  endpoint.iOffset
14a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 68 75   ){.        nChu
14b0: 6e 6b 20 3d 20 63 6f 70 79 2e 65 6e 64 70 6f 69  nk = copy.endpoi
14c0: 6e 74 2e 69 4f 66 66 73 65 74 20 2d 20 69 4f 66  nt.iOffset - iOf
14d0: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
14e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
14f0: 72 69 74 65 28 70 52 65 61 6c 2c 20 28 75 38 2a  rite(pReal, (u8*
1500: 29 70 49 74 65 72 2d 3e 7a 43 68 75 6e 6b 2c 20  )pIter->zChunk, 
1510: 6e 43 68 75 6e 6b 2c 20 69 4f 66 66 29 3b 0a 20  nChunk, iOff);. 
1520: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
1530: 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  eak;.      iOff 
1540: 2b 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 7d  += nChunk;.    }
1550: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1560: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1570: 2f 2a 20 4e 6f 20 65 72 72 6f 72 20 68 61 73 20  /* No error has 
1580: 6f 63 63 75 72 72 65 64 2e 20 46 72 65 65 20 74  occurred. Free t
1590: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 62 75 66  he in-memory buf
15a0: 66 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6d  fers. */.      m
15b0: 65 6d 6a 72 6e 6c 46 72 65 65 43 68 75 6e 6b 73  emjrnlFreeChunks
15c0: 28 26 63 6f 70 79 29 3b 0a 20 20 20 20 7d 0a 20  (&copy);.    }. 
15d0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
15e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
15f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1600: 75 72 72 65 64 20 77 68 69 6c 65 20 63 72 65 61  urred while crea
1610: 74 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ting or writing 
1620: 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 72 65 73  to the file, res
1630: 74 6f 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  tore.    ** the 
1640: 6f 72 69 67 69 6e 61 6c 20 62 65 66 6f 72 65 20  original before 
1650: 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 69 73 20  returning. This 
1660: 77 61 79 2c 20 53 51 4c 69 74 65 20 75 73 65 73  way, SQLite uses
1670: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20   the in-memory. 
1680: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 64 61     ** journal da
1690: 74 61 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ta to roll back 
16a0: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
16b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 70 61 67  the internal pag
16c0: 65 2d 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 62  e-cache.    ** b
16d0: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
16e0: 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
16f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
1700: 73 43 6c 6f 73 65 28 70 52 65 61 6c 29 3b 0a 20  sClose(pReal);. 
1710: 20 20 20 2a 70 20 3d 20 63 6f 70 79 3b 0a 20 20     *p = copy;.  
1720: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1730: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
1740: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ata to the file.
1750: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1760: 65 6d 6a 72 6e 6c 57 72 69 74 65 28 0a 20 20 73  emjrnlWrite(.  s
1770: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66  qlite3_file *pJf
1780: 64 2c 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  d,    /* The jou
1790: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 77  rnal file into w
17a0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 2a 2f  hich to write */
17b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
17c0: 42 75 66 2c 20 20 20 20 20 20 2f 2a 20 54 61 6b  Buf,      /* Tak
17d0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  e data to be wri
17e0: 74 74 65 6e 20 66 72 6f 6d 20 68 65 72 65 20 2a  tten from here *
17f0: 2f 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 20 20  /.  int iAmt,   
1800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1810: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1820: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
1830: 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 20 20  te_int64 iOfst  
1840: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 72 69 74     /* Begin writ
1850: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
1860: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
1870: 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72   */.){.  MemJour
1880: 6e 61 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75  nal *p = (MemJou
1890: 72 6e 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20 69  rnal *)pJfd;.  i
18a0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 69 41 6d 74  nt nWrite = iAmt
18b0: 3b 0a 20 20 75 38 20 2a 7a 57 72 69 74 65 20 3d  ;.  u8 *zWrite =
18c0: 20 28 75 38 20 2a 29 7a 42 75 66 3b 0a 0a 20 20   (u8 *)zBuf;..  
18d0: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 73  /* If the file s
18e0: 68 6f 75 6c 64 20 62 65 20 63 72 65 61 74 65 64  hould be created
18f0: 20 6e 6f 77 2c 20 63 72 65 61 74 65 20 69 74 20   now, create it 
1900: 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 6e 65  and write the ne
1910: 77 20 64 61 74 61 0a 20 20 2a 2a 20 69 6e 74 6f  w data.  ** into
1920: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1930: 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  k. */.  if( p->n
1940: 53 70 69 6c 6c 3e 30 20 26 26 20 28 69 41 6d 74  Spill>0 && (iAmt
1950: 2b 69 4f 66 73 74 29 3e 70 2d 3e 6e 53 70 69 6c  +iOfst)>p->nSpil
1960: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  l ){.    int rc 
1970: 3d 20 6d 65 6d 6a 72 6e 6c 43 72 65 61 74 65 46  = memjrnlCreateF
1980: 69 6c 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ile(p);.    if( 
1990: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19b0: 74 65 33 4f 73 57 72 69 74 65 28 70 4a 66 64 2c  te3OsWrite(pJfd,
19c0: 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66   zBuf, iAmt, iOf
19d0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  st);.    }.    r
19e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
19f0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
1a00: 6e 74 73 20 6f 66 20 74 68 69 73 20 77 72 69 74  nts of this writ
1a10: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
1a20: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ed in memory */.
1a30: 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41    else{.    /* A
1a40: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
1a50: 6e 61 6c 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  nal file should 
1a60: 6f 6e 6c 79 20 65 76 65 72 20 62 65 20 61 70 70  only ever be app
1a70: 65 6e 64 65 64 20 74 6f 2e 20 52 61 6e 64 6f 6d  ended to. Random
1a80: 0a 20 20 20 20 2a 2a 20 61 63 63 65 73 73 20 77  .    ** access w
1a90: 72 69 74 65 73 20 61 72 65 20 6e 6f 74 20 72 65  rites are not re
1aa0: 71 75 69 72 65 64 2e 20 54 68 65 20 6f 6e 6c 79  quired. The only
1ab0: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
1ac0: 69 73 20 69 73 20 77 68 65 6e 0a 20 20 20 20 2a  is is when.    *
1ad0: 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
1ae0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
1af0: 20 75 73 65 64 20 62 79 20 61 20 63 6f 6e 6e 65   used by a conne
1b00: 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 0a  ction using the.
1b10: 20 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72      ** atomic-wr
1b20: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
1b30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1b40: 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
1b50: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
1b60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
1b70: 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 20 70   be written as p
1b80: 61 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69 6e  art of committin
1b90: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1ba0: 6e 2e 20 2a 2f 20 0a 20 20 20 20 61 73 73 65 72  n. */ .    asser
1bb0: 74 28 20 69 4f 66 73 74 3d 3d 70 2d 3e 65 6e 64  t( iOfst==p->end
1bc0: 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 7c 7c  point.iOffset ||
1bd0: 20 69 4f 66 73 74 3d 3d 30 20 29 3b 0a 23 69 66   iOfst==0 );.#if
1be0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bf0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1c00: 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65 66 69 6e  ITE) \. || defin
1c10: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c20: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
1c30: 49 54 45 29 0a 20 20 20 20 69 66 28 20 69 4f 66  ITE).    if( iOf
1c40: 73 74 3d 3d 30 20 26 26 20 70 2d 3e 70 46 69 72  st==0 && p->pFir
1c50: 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
1c60: 72 74 28 20 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a  rt( p->nChunkSiz
1c70: 65 3e 69 41 6d 74 20 29 3b 0a 20 20 20 20 20 20  e>iAmt );.      
1c80: 6d 65 6d 63 70 79 28 28 75 38 2a 29 70 2d 3e 70  memcpy((u8*)p->p
1c90: 46 69 72 73 74 2d 3e 7a 43 68 75 6e 6b 2c 20 7a  First->zChunk, z
1ca0: 42 75 66 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20  Buf, iAmt);.    
1cb0: 7d 65 6c 73 65 0a 23 65 6c 73 65 0a 20 20 20 20  }else.#else.    
1cc0: 61 73 73 65 72 74 28 20 69 4f 66 73 74 3e 30 20  assert( iOfst>0 
1cd0: 7c 7c 20 70 2d 3e 70 46 69 72 73 74 3d 3d 30 20  || p->pFirst==0 
1ce0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  );.#endif.    {.
1cf0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 57 72        while( nWr
1d00: 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ite>0 ){.       
1d10: 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 43 68 75   FileChunk *pChu
1d20: 6e 6b 20 3d 20 70 2d 3e 65 6e 64 70 6f 69 6e 74  nk = p->endpoint
1d30: 2e 70 43 68 75 6e 6b 3b 0a 20 20 20 20 20 20 20  .pChunk;.       
1d40: 20 69 6e 74 20 69 43 68 75 6e 6b 4f 66 66 73 65   int iChunkOffse
1d50: 74 20 3d 20 28 69 6e 74 29 28 70 2d 3e 65 6e 64  t = (int)(p->end
1d60: 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 25 70 2d  point.iOffset%p-
1d70: 3e 6e 43 68 75 6e 6b 53 69 7a 65 29 3b 0a 20 20  >nChunkSize);.  
1d80: 20 20 20 20 20 20 69 6e 74 20 69 53 70 61 63 65        int iSpace
1d90: 20 3d 20 4d 49 4e 28 6e 57 72 69 74 65 2c 20 70   = MIN(nWrite, p
1da0: 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 20 2d 20 69  ->nChunkSize - i
1db0: 43 68 75 6e 6b 4f 66 66 73 65 74 29 3b 0a 0a 20  ChunkOffset);.. 
1dc0: 20 20 20 20 20 20 20 69 66 28 20 69 43 68 75 6e         if( iChun
1dd0: 6b 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  kOffset==0 ){.  
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
1df0: 68 75 6e 6b 20 69 73 20 72 65 71 75 69 72 65 64  hunk is required
1e00: 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
1e10: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
1e20: 20 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 4e 65    FileChunk *pNe
1e30: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
1e40: 6f 63 28 66 69 6c 65 43 68 75 6e 6b 53 69 7a 65  oc(fileChunkSize
1e50: 28 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 29 29  (p->nChunkSize))
1e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e70: 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1e80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e90: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
1ea0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1ec0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
1ed0: 20 20 20 20 20 20 69 66 28 20 70 43 68 75 6e 6b        if( pChunk
1ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ef0: 61 73 73 65 72 74 28 20 70 2d 3e 70 46 69 72 73  assert( p->pFirs
1f00: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
1f10: 20 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 20 3d   pChunk->pNext =
1f20: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
1f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f40: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
1f50: 70 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  pFirst );.      
1f60: 20 20 20 20 20 20 70 2d 3e 70 46 69 72 73 74 20        p->pFirst 
1f70: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
1f80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
1f90: 3e 65 6e 64 70 6f 69 6e 74 2e 70 43 68 75 6e 6b  >endpoint.pChunk
1fa0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
1fb0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   }..        memc
1fc0: 70 79 28 28 75 38 2a 29 70 2d 3e 65 6e 64 70 6f  py((u8*)p->endpo
1fd0: 69 6e 74 2e 70 43 68 75 6e 6b 2d 3e 7a 43 68 75  int.pChunk->zChu
1fe0: 6e 6b 20 2b 20 69 43 68 75 6e 6b 4f 66 66 73 65  nk + iChunkOffse
1ff0: 74 2c 20 7a 57 72 69 74 65 2c 20 69 53 70 61 63  t, zWrite, iSpac
2000: 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 57 72 69  e);.        zWri
2010: 74 65 20 2b 3d 20 69 53 70 61 63 65 3b 0a 20 20  te += iSpace;.  
2020: 20 20 20 20 20 20 6e 57 72 69 74 65 20 2d 3d 20        nWrite -= 
2030: 69 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  iSpace;.        
2040: 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66  p->endpoint.iOff
2050: 73 65 74 20 2b 3d 20 69 53 70 61 63 65 3b 0a 20  set += iSpace;. 
2060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
2070: 6e 53 69 7a 65 20 3d 20 69 41 6d 74 20 2b 20 69  nSize = iAmt + i
2080: 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ofst;.    }.  }.
2090: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
20b0: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 2e  uncate the file.
20c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
20d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
20e0: 72 65 61 64 79 20 6f 6e 20 64 69 73 6b 2c 20 74  ready on disk, t
20f0: 72 75 6e 63 61 74 65 20 69 74 20 74 68 65 72 65  runcate it there
2100: 2e 20 4f 72 2c 20 69 66 20 69 74 0a 2a 2a 20 69  . Or, if it.** i
2110: 73 20 73 74 69 6c 6c 20 69 6e 20 6d 61 69 6e 20  s still in main 
2120: 6d 65 6d 6f 72 79 20 62 75 74 20 69 73 20 62 65  memory but is be
2130: 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 74 6f  ing truncated to
2140: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
2150: 69 7a 65 2c 0a 2a 2a 20 69 67 6e 6f 72 65 20 0a  ize,.** ignore .
2160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
2170: 6d 6a 72 6e 6c 54 72 75 6e 63 61 74 65 28 73 71  mjrnlTruncate(sq
2180: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64  lite3_file *pJfd
2190: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  , sqlite_int64 s
21a0: 69 7a 65 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e  ize){.  MemJourn
21b0: 61 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72  al *p = (MemJour
21c0: 6e 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20 69 66  nal *)pJfd;.  if
21d0: 28 20 41 4c 57 41 59 53 28 73 69 7a 65 3d 3d 30  ( ALWAYS(size==0
21e0: 29 20 29 7b 0a 20 20 20 20 6d 65 6d 6a 72 6e 6c  ) ){.    memjrnl
21f0: 46 72 65 65 43 68 75 6e 6b 73 28 70 29 3b 0a 20  FreeChunks(p);. 
2200: 20 20 20 70 2d 3e 6e 53 69 7a 65 20 3d 20 30 3b     p->nSize = 0;
2210: 0a 20 20 20 20 70 2d 3e 65 6e 64 70 6f 69 6e 74  .    p->endpoint
2220: 2e 70 43 68 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  .pChunk = 0;.   
2230: 20 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66   p->endpoint.iOf
2240: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  fset = 0;.    p-
2250: 3e 72 65 61 64 70 6f 69 6e 74 2e 70 43 68 75 6e  >readpoint.pChun
2260: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72 65  k = 0;.    p->re
2270: 61 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  adpoint.iOffset 
2280: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
2290: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22a0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
22b0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
22c0: 69 6e 74 20 6d 65 6d 6a 72 6e 6c 43 6c 6f 73 65  int memjrnlClose
22d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
22e0: 4a 66 64 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e  Jfd){.  MemJourn
22f0: 61 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72  al *p = (MemJour
2300: 6e 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20 6d 65  nal *)pJfd;.  me
2310: 6d 6a 72 6e 6c 46 72 65 65 43 68 75 6e 6b 73 28  mjrnlFreeChunks(
2320: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
2330: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2340: 20 53 79 6e 63 20 74 68 65 20 66 69 6c 65 2e 0a   Sync the file..
2350: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
2360: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2370: 63 72 65 61 74 65 64 2c 20 63 61 6c 6c 20 69 74  created, call it
2380: 73 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 2e 20  s xSync method. 
2390: 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 73  Otherwise, .** s
23a0: 79 6e 63 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d  yncing an in-mem
23b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  ory journal is a
23c0: 20 6e 6f 2d 6f 70 2e 20 0a 2a 2f 0a 73 74 61 74   no-op. .*/.stat
23d0: 69 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 53 79  ic int memjrnlSy
23e0: 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
23f0: 2a 70 4a 66 64 2c 20 69 6e 74 20 66 6c 61 67 73  *pJfd, int flags
2400: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2410: 4d 45 54 45 52 32 28 70 4a 66 64 2c 20 66 6c 61  METER2(pJfd, fla
2420: 67 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  gs);.  return SQ
2430: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2440: 2a 20 51 75 65 72 79 20 74 68 65 20 73 69 7a 65  * Query the size
2450: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 20   of the file in 
2460: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2470: 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 46 69 6c 65   int memjrnlFile
2480: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
2490: 65 20 2a 70 4a 66 64 2c 20 73 71 6c 69 74 65 5f  e *pJfd, sqlite_
24a0: 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
24b0: 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20 3d   MemJournal *p =
24c0: 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 29 70   (MemJournal *)p
24d0: 4a 66 64 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  Jfd;.  *pSize = 
24e0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 20 70  (sqlite_int64) p
24f0: 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73  ->endpoint.iOffs
2500: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  et;.  return SQL
2510: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2520: 20 54 61 62 6c 65 20 6f 66 20 6d 65 74 68 6f 64   Table of method
2530: 73 20 66 6f 72 20 4d 65 6d 4a 6f 75 72 6e 61 6c  s for MemJournal
2540: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
2550: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
2560: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
2570: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2580: 4d 65 6d 4a 6f 75 72 6e 61 6c 4d 65 74 68 6f 64  MemJournalMethod
2590: 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20  s = {.  1,      
25a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
25b0: 72 73 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 6a 72  rsion */.  memjr
25c0: 6e 6c 43 6c 6f 73 65 2c 20 20 20 20 20 2f 2a 20  nlClose,     /* 
25d0: 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 6d 65 6d 6a  xClose */.  memj
25e0: 72 6e 6c 52 65 61 64 2c 20 20 20 20 20 20 2f 2a  rnlRead,      /*
25f0: 20 78 52 65 61 64 20 2a 2f 0a 20 20 6d 65 6d 6a   xRead */.  memj
2600: 72 6e 6c 57 72 69 74 65 2c 20 20 20 20 20 2f 2a  rnlWrite,     /*
2610: 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 6d 65 6d   xWrite */.  mem
2620: 6a 72 6e 6c 54 72 75 6e 63 61 74 65 2c 20 20 2f  jrnlTruncate,  /
2630: 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
2640: 20 6d 65 6d 6a 72 6e 6c 53 79 6e 63 2c 20 20 20   memjrnlSync,   
2650: 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
2660: 20 6d 65 6d 6a 72 6e 6c 46 69 6c 65 53 69 7a 65   memjrnlFileSize
2670: 2c 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20  ,  /* xFileSize 
2680: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2690: 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
26a0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
26b0: 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
26c0: 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
26d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
26e0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
26f0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2700: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
2710: 6e 74 72 6f 6c 20 2a 2f 0a 20 20 30 2c 20 20 20  ntrol */.  0,   
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
2740: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2750: 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
2760: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
2770: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2780: 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
2790: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
27a0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
27b0: 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
27c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
27d0: 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 30 2c 20  Barrier */.  0, 
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f0: 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
2800: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2810: 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
2820: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2830: 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
2840: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 4f 70  */.};../* .** Op
2850: 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
2860: 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65  e. .**.** The be
2870: 68 61 76 69 6f 75 72 20 6f 66 20 74 68 65 20 6a  haviour of the j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 70 65  ournal file depe
2890: 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
28a0: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 20 0a 2a   of parameter .*
28b0: 2a 20 6e 53 70 69 6c 6c 2e 20 49 66 20 6e 53 70  * nSpill. If nSp
28c0: 69 6c 6c 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ill is 0, then t
28d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28e0: 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65  is always create
28f0: 20 61 6e 64 20 0a 2a 2a 20 61 63 63 65 73 73 65   and .** accesse
2900: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 64 65  d using the unde
2910: 72 6c 79 69 6e 67 20 56 46 53 2e 20 49 66 20 6e  rlying VFS. If n
2920: 53 70 69 6c 6c 20 69 73 20 6c 65 73 73 20 74 68  Spill is less th
2930: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 0a 2a 2a  an zero, then.**
2940: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20   all content is 
2950: 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e  always stored in
2960: 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 2e 20 46 69   main-memory. Fi
2970: 6e 61 6c 6c 79 2c 20 69 66 20 6e 53 70 69 6c 6c  nally, if nSpill
2980: 20 69 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 76   is a.** positiv
2990: 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  e value, then th
29a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
29b0: 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61  s initially crea
29c0: 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  ted in-memory.**
29d0: 20 62 75 74 20 6d 61 79 20 62 65 20 66 6c 75 73   but may be flus
29e0: 68 65 64 20 74 6f 20 64 69 73 6b 20 6c 61 74 65  hed to disk late
29f0: 72 20 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  r on. In this ca
2a00: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2a10: 69 6c 65 20 69 73 0a 2a 2a 20 66 6c 75 73 68 65  ile is.** flushe
2a20: 64 20 74 6f 20 64 69 73 6b 20 65 69 74 68 65 72  d to disk either
2a30: 20 77 68 65 6e 20 69 74 20 67 72 6f 77 73 20 6c   when it grows l
2a40: 61 72 67 65 72 20 74 68 61 6e 20 6e 53 70 69 6c  arger than nSpil
2a50: 6c 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  l bytes in size,
2a60: 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 73 71 6c 69  .** or when sqli
2a70: 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2a80: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
2a90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 75 72  .int sqlite3Jour
2aa0: 6e 61 6c 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nalOpen(.  sqlit
2ab0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2ac0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2ad0: 20 74 6f 20 75 73 65 20 66 6f 72 20 61 63 74 75   to use for actu
2ae0: 61 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  al file I/O */. 
2af0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2b00: 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me,         /* N
2b10: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
2b20: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  al file */.  sql
2b30: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 2c  ite3_file *pJfd,
2b40: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 61 6c          /* Preal
2b50: 6c 6f 63 61 74 65 64 2c 20 62 6c 61 6e 6b 20 66  located, blank f
2b60: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
2b70: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2b90: 65 6e 69 6e 67 20 66 6c 61 67 73 20 2a 2f 0a 20  ening flags */. 
2ba0: 20 69 6e 74 20 6e 53 70 69 6c 6c 20 20 20 20 20   int nSpill     
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2bc0: 79 74 65 73 20 62 75 66 66 65 72 65 64 20 62 65  ytes buffered be
2bd0: 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65  fore opening the
2be0: 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65   file */.){.  Me
2bf0: 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20 3d 20 28 4d  mJournal *p = (M
2c00: 65 6d 4a 6f 75 72 6e 61 6c 2a 29 70 4a 66 64 3b  emJournal*)pJfd;
2c10: 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
2c20: 66 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 62 6a 65  file-handle obje
2c30: 63 74 2e 20 49 66 20 6e 53 70 69 6c 6c 20 77 61  ct. If nSpill wa
2c40: 73 20 70 61 73 73 65 64 20 7a 65 72 6f 2c 20 69  s passed zero, i
2c50: 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 69  nitialize.  ** i
2c60: 74 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  t using the sqli
2c70: 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 75 6e 63  te3OsOpen() func
2c80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 64 65  tion of the unde
2c90: 72 6c 79 69 6e 67 20 56 46 53 2e 20 49 6e 20 74  rlying VFS. In t
2ca0: 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 6e 6f  his.  ** case no
2cb0: 6e 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  ne of the code i
2cc0: 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  n this module is
2cd0: 20 65 78 65 63 75 74 65 64 20 61 73 20 61 20 72   executed as a r
2ce0: 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c 73 0a 20  esult of calls. 
2cf0: 20 2a 2a 20 6d 61 64 65 20 6f 6e 20 74 68 65 20   ** made on the 
2d00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2d10: 64 6c 65 2e 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  dle.  */.  memse
2d20: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4d  t(p, 0, sizeof(M
2d30: 65 6d 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 69  emJournal));.  i
2d40: 66 28 20 6e 53 70 69 6c 6c 3d 3d 30 20 29 7b 0a  f( nSpill==0 ){.
2d50: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2d60: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
2d70: 4e 61 6d 65 2c 20 70 4a 66 64 2c 20 66 6c 61 67  Name, pJfd, flag
2d80: 73 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  s, 0);.  }..  if
2d90: 28 20 6e 53 70 69 6c 6c 3e 30 20 29 7b 0a 20 20  ( nSpill>0 ){.  
2da0: 20 20 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 20    p->nChunkSize 
2db0: 3d 20 6e 53 70 69 6c 6c 3b 0a 20 20 7d 65 6c 73  = nSpill;.  }els
2dc0: 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 75 6e 6b  e{.    p->nChunk
2dd0: 53 69 7a 65 20 3d 20 38 20 2b 20 4d 45 4d 4a 4f  Size = 8 + MEMJO
2de0: 55 52 4e 41 4c 5f 44 46 4c 54 5f 46 49 4c 45 43  URNAL_DFLT_FILEC
2df0: 48 55 4e 4b 53 49 5a 45 20 2d 20 73 69 7a 65 6f  HUNKSIZE - sizeo
2e00: 66 28 46 69 6c 65 43 68 75 6e 6b 29 3b 0a 20 20  f(FileChunk);.  
2e10: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 4a 4f 55    assert( MEMJOU
2e20: 52 4e 41 4c 5f 44 46 4c 54 5f 46 49 4c 45 43 48  RNAL_DFLT_FILECH
2e30: 55 4e 4b 53 49 5a 45 3d 3d 66 69 6c 65 43 68 75  UNKSIZE==fileChu
2e40: 6e 6b 53 69 7a 65 28 70 2d 3e 6e 43 68 75 6e 6b  nkSize(p->nChunk
2e50: 53 69 7a 65 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  Size) );.  }..  
2e60: 70 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 28 63 6f  p->pMethod = (co
2e70: 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2e80: 65 74 68 6f 64 73 2a 29 26 4d 65 6d 4a 6f 75 72  ethods*)&MemJour
2e90: 6e 61 6c 4d 65 74 68 6f 64 73 3b 0a 20 20 70 2d  nalMethods;.  p-
2ea0: 3e 6e 53 70 69 6c 6c 20 3d 20 6e 53 70 69 6c 6c  >nSpill = nSpill
2eb0: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66  ;.  p->flags = f
2ec0: 6c 61 67 73 3b 0a 20 20 70 2d 3e 7a 4a 6f 75 72  lags;.  p->zJour
2ed0: 6e 61 6c 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  nal = zName;.  p
2ee0: 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
2f10: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2f20: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 76  urnal file..*/.v
2f30: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  oid sqlite3MemJo
2f40: 75 72 6e 61 6c 4f 70 65 6e 28 73 71 6c 69 74 65  urnalOpen(sqlite
2f50: 33 5f 66 69 6c 65 20 2a 70 4a 66 64 29 7b 0a 20  3_file *pJfd){. 
2f60: 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2f70: 70 65 6e 28 30 2c 20 30 2c 20 70 4a 66 64 2c 20  pen(0, 0, pJfd, 
2f80: 30 2c 20 2d 31 29 3b 0a 7d 0a 0a 23 69 66 20 64  0, -1);.}..#if d
2f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2fa0: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2fb0: 45 29 20 5c 0a 20 7c 7c 20 64 65 66 69 6e 65 64  E) \. || defined
2fc0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42  (SQLITE_ENABLE_B
2fd0: 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
2fe0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
2ff0: 61 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  argument p point
3000: 73 20 74 6f 20 61 20 4d 65 6d 4a 6f 75 72 6e 61  s to a MemJourna
3010: 6c 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  l structure that
3020: 20 69 73 20 6e 6f 74 20 61 6e 20 0a 2a 2a 20 69   is not an .** i
3030: 6e 2d 6d 65 6d 6f 72 79 2d 6f 6e 6c 79 20 6a 6f  n-memory-only jo
3040: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 2e 65 2e  urnal file (i.e.
3050: 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 61 73   is one that was
3060: 20 6f 70 65 6e 65 64 20 77 69 74 68 20 61 20 2b   opened with a +
3070: 76 65 0a 2a 2a 20 6e 53 70 69 6c 6c 20 70 61 72  ve.** nSpill par
3080: 61 6d 65 74 65 72 20 6f 72 20 61 73 20 53 51 4c  ameter or as SQL
3090: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
30a0: 55 52 4e 41 4c 29 2c 20 61 6e 64 20 74 68 65 20  URNAL), and the 
30b0: 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 66  underlying .** f
30c0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
30d0: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63 72  been created, cr
30e0: 65 61 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a  eate it now..*/.
30f0: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  int sqlite3Journ
3100: 61 6c 43 72 65 61 74 65 28 73 71 6c 69 74 65 33  alCreate(sqlite3
3110: 5f 66 69 6c 65 20 2a 70 4a 66 64 29 7b 0a 20 20  _file *pJfd){.  
3120: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3130: 4f 4b 3b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c  OK;.  MemJournal
3140: 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61   *p = (MemJourna
3150: 6c 2a 29 70 4a 66 64 3b 0a 20 20 69 66 28 20 70  l*)pJfd;.  if( p
3160: 2d 3e 70 4d 65 74 68 6f 64 3d 3d 26 4d 65 6d 4a  ->pMethod==&MemJ
3170: 6f 75 72 6e 61 6c 4d 65 74 68 6f 64 73 20 26 26  ournalMethods &&
3180: 20 28 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   (.#ifdef SQLITE
3190: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
31a0: 52 49 54 45 0a 20 20 20 20 20 70 2d 3e 6e 53 70  RITE.     p->nSp
31b0: 69 6c 6c 3e 30 0a 23 65 6c 73 65 0a 20 20 20 20  ill>0.#else.    
31c0: 20 2f 2a 20 57 68 69 6c 65 20 74 68 69 73 20 61   /* While this a
31d0: 70 70 65 61 72 73 20 74 6f 20 6e 6f 74 20 62 65  ppears to not be
31e0: 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 6f 75   possible withou
31f0: 74 20 41 54 4f 4d 49 43 5f 57 52 49 54 45 2c 20  t ATOMIC_WRITE, 
3200: 74 68 65 0a 20 20 20 20 20 2a 2a 20 70 61 74 68  the.     ** path
3210: 73 20 61 72 65 20 63 6f 6d 70 6c 65 78 2c 20 73  s are complex, s
3220: 6f 20 69 74 20 73 65 65 6d 73 20 70 72 75 64 65  o it seems prude
3230: 6e 74 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  nt to leave the 
3240: 74 65 73 74 20 69 6e 20 61 73 0a 20 20 20 20 20  test in as.     
3250: 2a 2a 20 61 20 4e 45 56 45 52 28 29 2c 20 69 6e  ** a NEVER(), in
3260: 20 63 61 73 65 20 6f 75 72 20 61 6e 61 6c 79 73   case our analys
3270: 69 73 20 69 73 20 73 75 62 74 6c 79 20 66 6c 61  is is subtly fla
3280: 77 65 64 2e 20 2a 2f 0a 20 20 20 20 20 4e 45 56  wed. */.     NEV
3290: 45 52 28 70 2d 3e 6e 53 70 69 6c 6c 3e 30 29 0a  ER(p->nSpill>0).
32a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
32b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
32c0: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
32d0: 20 20 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73      || (p->flags
32e0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
32f0: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 23 65 6e  AIN_JOURNAL).#en
3300: 64 69 66 0a 20 20 29 29 7b 0a 20 20 20 20 72 63  dif.  )){.    rc
3310: 20 3d 20 6d 65 6d 6a 72 6e 6c 43 72 65 61 74 65   = memjrnlCreate
3320: 46 69 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  File(p);.  }.  r
3330: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
3340: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  if../*.** The fi
3350: 6c 65 2d 68 61 6e 64 6c 65 20 70 61 73 73 65 64  le-handle passed
3360: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
3370: 75 6d 65 6e 74 20 69 73 20 6f 70 65 6e 20 6f 6e  ument is open on
3380: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
3390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
33a0: 69 66 20 74 68 69 73 20 22 6a 6f 75 72 6e 61 6c  if this "journal
33b0: 20 66 69 6c 65 22 20 69 73 20 63 75 72 72 65 6e   file" is curren
33c0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68 65  tly stored in he
33d0: 61 70 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 72  ap memory,.** or
33e0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
33f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3400: 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
3410: 79 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  y(sqlite3_file *
3420: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
3430: 70 4d 65 74 68 6f 64 73 3d 3d 26 4d 65 6d 4a 6f  pMethods==&MemJo
3440: 75 72 6e 61 6c 4d 65 74 68 6f 64 73 3b 0a 7d 0a  urnalMethods;.}.
3450: 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ./* .** Return t
3460: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3470: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
3480: 74 6f 72 65 20 61 20 4a 6f 75 72 6e 61 6c 46 69  tore a JournalFi
3490: 6c 65 20 74 68 61 74 20 75 73 65 73 20 76 66 73  le that uses vfs
34a0: 0a 2a 2a 20 70 56 66 73 20 74 6f 20 63 72 65 61  .** pVfs to crea
34b0: 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
34c0: 67 20 6f 6e 2d 64 69 73 6b 20 66 69 6c 65 73 2e  g on-disk files.
34d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
34e0: 6f 75 72 6e 61 6c 53 69 7a 65 28 73 71 6c 69 74  ournalSize(sqlit
34f0: 65 33 5f 76 66 73 20 2a 70 56 66 73 29 7b 0a 20  e3_vfs *pVfs){. 
3500: 20 72 65 74 75 72 6e 20 4d 41 58 28 70 56 66 73   return MAX(pVfs
3510: 2d 3e 73 7a 4f 73 46 69 6c 65 2c 20 28 69 6e 74  ->szOsFile, (int
3520: 29 73 69 7a 65 6f 66 28 4d 65 6d 4a 6f 75 72 6e  )sizeof(MemJourn
3530: 61 6c 29 29 3b 0a 7d 0a                          al));.}.