/ Hex Artifact Content
Login

Artifact 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661:


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 23 69 66 20 64 65  *pChunk;..#if de
0e20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0e30: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
0e40: 29 20 5c 0a 20 7c 7c 20 64 65 66 69 6e 65 64 28  ) \. || defined(
0e50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
0e60: 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
0e70: 29 0a 20 20 69 66 28 20 28 69 41 6d 74 2b 69 4f  ).  if( (iAmt+iO
0e80: 66 73 74 29 3e 70 2d 3e 65 6e 64 70 6f 69 6e 74  fst)>p->endpoint
0e90: 2e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  .iOffset ){.    
0ea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
0eb0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
0ec0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
0ed0: 73 65 72 74 28 20 28 69 41 6d 74 2b 69 4f 66 73  sert( (iAmt+iOfs
0ee0: 74 29 3c 3d 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e  t)<=p->endpoint.
0ef0: 69 4f 66 66 73 65 74 20 29 3b 0a 20 20 61 73 73  iOffset );.  ass
0f00: 65 72 74 28 20 70 2d 3e 72 65 61 64 70 6f 69 6e  ert( p->readpoin
0f10: 74 2e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  t.iOffset==0 || 
0f20: 70 2d 3e 72 65 61 64 70 6f 69 6e 74 2e 70 43 68  p->readpoint.pCh
0f30: 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk!=0 );.  if( 
0f40: 70 2d 3e 72 65 61 64 70 6f 69 6e 74 2e 69 4f 66  p->readpoint.iOf
0f50: 66 73 65 74 21 3d 69 4f 66 73 74 20 7c 7c 20 69  fset!=iOfst || i
0f60: 4f 66 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Ofst==0 ){.    s
0f70: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
0f80: 66 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  f = 0;.    for(p
0f90: 43 68 75 6e 6b 3d 70 2d 3e 70 46 69 72 73 74 3b  Chunk=p->pFirst;
0fa0: 20 0a 20 20 20 20 20 20 20 20 41 4c 57 41 59 53   .        ALWAYS
0fb0: 28 70 43 68 75 6e 6b 29 20 26 26 20 28 69 4f 66  (pChunk) && (iOf
0fc0: 66 2b 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 29  f+p->nChunkSize)
0fd0: 3c 3d 69 4f 66 73 74 3b 0a 20 20 20 20 20 20 20  <=iOfst;.       
0fe0: 20 70 43 68 75 6e 6b 3d 70 43 68 75 6e 6b 2d 3e   pChunk=pChunk->
0ff0: 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20 20  pNext.    ){.   
1000: 20 20 20 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e 43     iOff += p->nC
1010: 68 75 6e 6b 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  hunkSize;.    }.
1020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 68    }else{.    pCh
1030: 75 6e 6b 20 3d 20 70 2d 3e 72 65 61 64 70 6f 69  unk = p->readpoi
1040: 6e 74 2e 70 43 68 75 6e 6b 3b 0a 20 20 20 20 61  nt.pChunk;.    a
1050: 73 73 65 72 74 28 20 70 43 68 75 6e 6b 21 3d 30  ssert( pChunk!=0
1060: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 68 75 6e   );.  }..  iChun
1070: 6b 4f 66 66 73 65 74 20 3d 20 28 69 6e 74 29 28  kOffset = (int)(
1080: 69 4f 66 73 74 25 70 2d 3e 6e 43 68 75 6e 6b 53  iOfst%p->nChunkS
1090: 69 7a 65 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  ize);.  do {.   
10a0: 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 70 2d   int iSpace = p-
10b0: 3e 6e 43 68 75 6e 6b 53 69 7a 65 20 2d 20 69 43  >nChunkSize - iC
10c0: 68 75 6e 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20  hunkOffset;.    
10d0: 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
10e0: 6e 52 65 61 64 2c 20 28 70 2d 3e 6e 43 68 75 6e  nRead, (p->nChun
10f0: 6b 53 69 7a 65 20 2d 20 69 43 68 75 6e 6b 4f 66  kSize - iChunkOf
1100: 66 73 65 74 29 29 3b 0a 20 20 20 20 6d 65 6d 63  fset));.    memc
1110: 70 79 28 7a 4f 75 74 2c 20 28 75 38 2a 29 70 43  py(zOut, (u8*)pC
1120: 68 75 6e 6b 2d 3e 7a 43 68 75 6e 6b 20 2b 20 69  hunk->zChunk + i
1130: 43 68 75 6e 6b 4f 66 66 73 65 74 2c 20 6e 43 6f  ChunkOffset, nCo
1140: 70 79 29 3b 0a 20 20 20 20 7a 4f 75 74 20 2b 3d  py);.    zOut +=
1150: 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 52 65 61   nCopy;.    nRea
1160: 64 20 2d 3d 20 69 53 70 61 63 65 3b 0a 20 20 20  d -= iSpace;.   
1170: 20 69 43 68 75 6e 6b 4f 66 66 73 65 74 20 3d 20   iChunkOffset = 
1180: 30 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20 6e 52  0;.  } while( nR
1190: 65 61 64 3e 3d 30 20 26 26 20 28 70 43 68 75 6e  ead>=0 && (pChun
11a0: 6b 3d 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 29  k=pChunk->pNext)
11b0: 21 3d 30 20 26 26 20 6e 52 65 61 64 3e 30 20 29  !=0 && nRead>0 )
11c0: 3b 0a 20 20 70 2d 3e 72 65 61 64 70 6f 69 6e 74  ;.  p->readpoint
11d0: 2e 69 4f 66 66 73 65 74 20 3d 20 70 43 68 75 6e  .iOffset = pChun
11e0: 6b 20 3f 20 69 4f 66 73 74 2b 69 41 6d 74 20 3a  k ? iOfst+iAmt :
11f0: 20 30 3b 0a 20 20 70 2d 3e 72 65 61 64 70 6f 69   0;.  p->readpoi
1200: 6e 74 2e 70 43 68 75 6e 6b 20 3d 20 70 43 68 75  nt.pChunk = pChu
1210: 6e 6b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  nk;..  return SQ
1220: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1230: 2a 20 46 72 65 65 20 74 68 65 20 6c 69 73 74 20  * Free the list 
1240: 6f 66 20 46 69 6c 65 43 68 75 6e 6b 20 73 74 72  of FileChunk str
1250: 75 63 74 75 72 65 73 20 68 65 61 64 65 64 20 61  uctures headed a
1260: 74 20 4d 65 6d 4a 6f 75 72 6e 61 6c 2e 70 46 69  t MemJournal.pFi
1270: 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rst..*/.static v
1280: 6f 69 64 20 6d 65 6d 6a 72 6e 6c 46 72 65 65 43  oid memjrnlFreeC
1290: 68 75 6e 6b 73 28 4d 65 6d 4a 6f 75 72 6e 61 6c  hunks(MemJournal
12a0: 20 2a 70 29 7b 0a 20 20 46 69 6c 65 43 68 75 6e   *p){.  FileChun
12b0: 6b 20 2a 70 49 74 65 72 3b 0a 20 20 46 69 6c 65  k *pIter;.  File
12c0: 43 68 75 6e 6b 20 2a 70 4e 65 78 74 3b 0a 20 20  Chunk *pNext;.  
12d0: 66 6f 72 28 70 49 74 65 72 3d 70 2d 3e 70 46 69  for(pIter=p->pFi
12e0: 72 73 74 3b 20 70 49 74 65 72 3b 20 70 49 74 65  rst; pIter; pIte
12f0: 72 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  r=pNext){.    pN
1300: 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  ext = pIter->pNe
1310: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
1320: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
1330: 20 0a 20 20 70 2d 3e 70 46 69 72 73 74 20 3d 20   .  p->pFirst = 
1340: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  0;.}../*.** Flus
1350: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
1360: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 61 20 72 65  f memory to a re
1370: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
1380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1390: 65 6d 6a 72 6e 6c 43 72 65 61 74 65 46 69 6c 65  emjrnlCreateFile
13a0: 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 29 7b  (MemJournal *p){
13b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
13c0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
13d0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
13e0: 2a 29 70 3b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61  *)p;.  MemJourna
13f0: 6c 20 63 6f 70 79 20 3d 20 2a 70 3b 0a 0a 20 20  l copy = *p;..  
1400: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
1410: 65 6f 66 28 4d 65 6d 4a 6f 75 72 6e 61 6c 29 29  eof(MemJournal))
1420: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1430: 4f 73 4f 70 65 6e 28 63 6f 70 79 2e 70 56 66 73  OsOpen(copy.pVfs
1440: 2c 20 63 6f 70 79 2e 7a 4a 6f 75 72 6e 61 6c 2c  , copy.zJournal,
1450: 20 70 52 65 61 6c 2c 20 63 6f 70 79 2e 66 6c 61   pReal, copy.fla
1460: 67 73 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  gs, 0);.  if( rc
1470: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1480: 20 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20     int nChunk = 
1490: 63 6f 70 79 2e 6e 43 68 75 6e 6b 53 69 7a 65 3b  copy.nChunkSize;
14a0: 0a 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20  .    i64 iOff = 
14b0: 30 3b 0a 20 20 20 20 46 69 6c 65 43 68 75 6e 6b  0;.    FileChunk
14c0: 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
14d0: 28 70 49 74 65 72 3d 63 6f 70 79 2e 70 46 69 72  (pIter=copy.pFir
14e0: 73 74 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  st; pIter; pIter
14f0: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1500: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 20 2b        if( iOff +
1510: 20 6e 43 68 75 6e 6b 20 3e 20 63 6f 70 79 2e 65   nChunk > copy.e
1520: 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  ndpoint.iOffset 
1530: 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 68 75 6e  ){.        nChun
1540: 6b 20 3d 20 63 6f 70 79 2e 65 6e 64 70 6f 69 6e  k = copy.endpoin
1550: 74 2e 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  t.iOffset - iOff
1560: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1570: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1580: 69 74 65 28 70 52 65 61 6c 2c 20 28 75 38 2a 29  ite(pReal, (u8*)
1590: 70 49 74 65 72 2d 3e 7a 43 68 75 6e 6b 2c 20 6e  pIter->zChunk, n
15a0: 43 68 75 6e 6b 2c 20 69 4f 66 66 29 3b 0a 20 20  Chunk, iOff);.  
15b0: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
15c0: 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ak;.      iOff +
15d0: 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 7d 0a  = nChunk;.    }.
15e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
1600: 2a 20 4e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f  * No error has o
1610: 63 63 75 72 72 65 64 2e 20 46 72 65 65 20 74 68  ccurred. Free th
1620: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 62 75 66 66  e in-memory buff
1630: 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6d 65  ers. */.      me
1640: 6d 6a 72 6e 6c 46 72 65 65 43 68 75 6e 6b 73 28  mjrnlFreeChunks(
1650: 26 63 6f 70 79 29 3b 0a 20 20 20 20 7d 0a 20 20  &copy);.    }.  
1660: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
1670: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
1680: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1690: 72 72 65 64 20 77 68 69 6c 65 20 63 72 65 61 74  rred while creat
16a0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
16b0: 6f 20 74 68 65 20 66 69 6c 65 2c 20 72 65 73 74  o the file, rest
16c0: 6f 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f  ore.    ** the o
16d0: 72 69 67 69 6e 61 6c 20 62 65 66 6f 72 65 20 72  riginal before r
16e0: 65 74 75 72 6e 69 6e 67 2e 20 54 68 69 73 20 77  eturning. This w
16f0: 61 79 2c 20 53 51 4c 69 74 65 20 75 73 65 73 20  ay, SQLite uses 
1700: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20  the in-memory.  
1710: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 64 61 74    ** journal dat
1720: 61 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 63  a to roll back c
1730: 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
1740: 68 65 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65  he internal page
1750: 2d 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 62 65  -cache.    ** be
1760: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1770: 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20  on was called.  
1780: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  */.    sqlite3Os
1790: 43 6c 6f 73 65 28 70 52 65 61 6c 29 3b 0a 20 20  Close(pReal);.  
17a0: 20 20 2a 70 20 3d 20 63 6f 70 79 3b 0a 20 20 7d    *p = copy;.  }
17b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17c0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
17d0: 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  ta to the file..
17e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
17f0: 6d 6a 72 6e 6c 57 72 69 74 65 28 0a 20 20 73 71  mjrnlWrite(.  sq
1800: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64  lite3_file *pJfd
1810: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ,    /* The jour
1820: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 77 68  nal file into wh
1830: 69 63 68 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  ich to write */.
1840: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
1850: 75 66 2c 20 20 20 20 20 20 2f 2a 20 54 61 6b 65  uf,      /* Take
1860: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
1870: 74 65 6e 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ten from here */
1880: 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 20 20 20  .  int iAmt,    
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
18b0: 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
18c0: 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 20 20 20  e_int64 iOfst   
18d0: 20 20 2f 2a 20 42 65 67 69 6e 20 77 72 69 74 69    /* Begin writi
18e0: 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
18f0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  t into the file 
1900: 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e  */.){.  MemJourn
1910: 61 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72  al *p = (MemJour
1920: 6e 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20 69 6e  nal *)pJfd;.  in
1930: 74 20 6e 57 72 69 74 65 20 3d 20 69 41 6d 74 3b  t nWrite = iAmt;
1940: 0a 20 20 75 38 20 2a 7a 57 72 69 74 65 20 3d 20  .  u8 *zWrite = 
1950: 28 75 38 20 2a 29 7a 42 75 66 3b 0a 0a 20 20 2f  (u8 *)zBuf;..  /
1960: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 73 68  * If the file sh
1970: 6f 75 6c 64 20 62 65 20 63 72 65 61 74 65 64 20  ould be created 
1980: 6e 6f 77 2c 20 63 72 65 61 74 65 20 69 74 20 61  now, create it a
1990: 6e 64 20 77 72 69 74 65 20 74 68 65 20 6e 65 77  nd write the new
19a0: 20 64 61 74 61 0a 20 20 2a 2a 20 69 6e 74 6f 20   data.  ** into 
19b0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
19c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53  . */.  if( p->nS
19d0: 70 69 6c 6c 3e 30 20 26 26 20 28 69 41 6d 74 2b  pill>0 && (iAmt+
19e0: 69 4f 66 73 74 29 3e 70 2d 3e 6e 53 70 69 6c 6c  iOfst)>p->nSpill
19f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
1a00: 20 6d 65 6d 6a 72 6e 6c 43 72 65 61 74 65 46 69   memjrnlCreateFi
1a10: 6c 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72  le(p);.    if( r
1a20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a40: 65 33 4f 73 57 72 69 74 65 28 70 4a 66 64 2c 20  e3OsWrite(pJfd, 
1a50: 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73  zBuf, iAmt, iOfs
1a60: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  t);.    }.    re
1a70: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1a80: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
1a90: 74 73 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ts of this write
1aa0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
1ab0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  d in memory */. 
1ac0: 20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 6e   else{.    /* An
1ad0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
1ae0: 61 6c 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 6f  al file should o
1af0: 6e 6c 79 20 65 76 65 72 20 62 65 20 61 70 70 65  nly ever be appe
1b00: 6e 64 65 64 20 74 6f 2e 20 52 61 6e 64 6f 6d 0a  nded to. Random.
1b10: 20 20 20 20 2a 2a 20 61 63 63 65 73 73 20 77 72      ** access wr
1b20: 69 74 65 73 20 61 72 65 20 6e 6f 74 20 72 65 71  ites are not req
1b30: 75 69 72 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  uired. The only 
1b40: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
1b50: 73 20 69 73 20 77 68 65 6e 0a 20 20 20 20 2a 2a  s is when.    **
1b60: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
1b70: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
1b80: 75 73 65 64 20 62 79 20 61 20 63 6f 6e 6e 65 63  used by a connec
1b90: 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 0a 20  tion using the. 
1ba0: 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69     ** atomic-wri
1bb0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  te optimization.
1bc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1bd0: 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
1be0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   of the.    ** j
1bf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
1c00: 62 65 20 77 72 69 74 74 65 6e 20 61 73 20 70 61  be written as pa
1c10: 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69 6e 67  rt of committing
1c20: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c30: 2e 20 2a 2f 20 0a 20 20 20 20 61 73 73 65 72 74  . */ .    assert
1c40: 28 20 69 4f 66 73 74 3d 3d 70 2d 3e 65 6e 64 70  ( iOfst==p->endp
1c50: 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 7c 7c 20  oint.iOffset || 
1c60: 69 4f 66 73 74 3d 3d 30 20 29 3b 0a 23 69 66 20  iOfst==0 );.#if 
1c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c80: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1c90: 54 45 29 20 5c 0a 20 7c 7c 20 64 65 66 69 6e 65  TE) \. || define
1ca0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1cb0: 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
1cc0: 54 45 29 0a 20 20 20 20 69 66 28 20 69 4f 66 73  TE).    if( iOfs
1cd0: 74 3d 3d 30 20 26 26 20 70 2d 3e 70 46 69 72 73  t==0 && p->pFirs
1ce0: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
1cf0: 74 28 20 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65  t( p->nChunkSize
1d00: 3e 69 41 6d 74 20 29 3b 0a 20 20 20 20 20 20 6d  >iAmt );.      m
1d10: 65 6d 63 70 79 28 28 75 38 2a 29 70 2d 3e 70 46  emcpy((u8*)p->pF
1d20: 69 72 73 74 2d 3e 7a 43 68 75 6e 6b 2c 20 7a 42  irst->zChunk, zB
1d30: 75 66 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 7d  uf, iAmt);.    }
1d40: 65 6c 73 65 0a 23 65 6c 73 65 0a 20 20 20 20 61  else.#else.    a
1d50: 73 73 65 72 74 28 20 69 4f 66 73 74 3e 30 20 7c  ssert( iOfst>0 |
1d60: 7c 20 70 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29  | p->pFirst==0 )
1d70: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  ;.#endif.    {. 
1d80: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 57 72 69       while( nWri
1d90: 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  te>0 ){.        
1da0: 46 69 6c 65 43 68 75 6e 6b 20 2a 70 43 68 75 6e  FileChunk *pChun
1db0: 6b 20 3d 20 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e  k = p->endpoint.
1dc0: 70 43 68 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pChunk;.        
1dd0: 69 6e 74 20 69 43 68 75 6e 6b 4f 66 66 73 65 74  int iChunkOffset
1de0: 20 3d 20 28 69 6e 74 29 28 70 2d 3e 65 6e 64 70   = (int)(p->endp
1df0: 6f 69 6e 74 2e 69 4f 66 66 73 65 74 25 70 2d 3e  oint.iOffset%p->
1e00: 6e 43 68 75 6e 6b 53 69 7a 65 29 3b 0a 20 20 20  nChunkSize);.   
1e10: 20 20 20 20 20 69 6e 74 20 69 53 70 61 63 65 20       int iSpace 
1e20: 3d 20 4d 49 4e 28 6e 57 72 69 74 65 2c 20 70 2d  = MIN(nWrite, p-
1e30: 3e 6e 43 68 75 6e 6b 53 69 7a 65 20 2d 20 69 43  >nChunkSize - iC
1e40: 68 75 6e 6b 4f 66 66 73 65 74 29 3b 0a 0a 20 20  hunkOffset);..  
1e50: 20 20 20 20 20 20 69 66 28 20 69 43 68 75 6e 6b        if( iChunk
1e60: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
1e70: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 68         /* New ch
1e80: 75 6e 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  unk is required 
1e90: 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69  to extend the fi
1ea0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
1eb0: 20 46 69 6c 65 43 68 75 6e 6b 20 2a 70 4e 65 77   FileChunk *pNew
1ec0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1ed0: 63 28 66 69 6c 65 43 68 75 6e 6b 53 69 7a 65 28  c(fileChunkSize(
1ee0: 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 29 29 3b  p->nChunkSize));
1ef0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1f00: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
1f10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f20: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
1f30: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
1f40: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1f50: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
1f60: 20 20 20 20 20 69 66 28 20 70 43 68 75 6e 6b 20       if( pChunk 
1f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1f80: 73 73 65 72 74 28 20 70 2d 3e 70 46 69 72 73 74  ssert( p->pFirst
1f90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1fa0: 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20  pChunk->pNext = 
1fb0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
1fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fd0: 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
1fe0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
1ff0: 20 20 20 20 20 70 2d 3e 70 46 69 72 73 74 20 3d       p->pFirst =
2000: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
2010: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
2020: 65 6e 64 70 6f 69 6e 74 2e 70 43 68 75 6e 6b 20  endpoint.pChunk 
2030: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
2040: 7d 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  }..        memcp
2050: 79 28 28 75 38 2a 29 70 2d 3e 65 6e 64 70 6f 69  y((u8*)p->endpoi
2060: 6e 74 2e 70 43 68 75 6e 6b 2d 3e 7a 43 68 75 6e  nt.pChunk->zChun
2070: 6b 20 2b 20 69 43 68 75 6e 6b 4f 66 66 73 65 74  k + iChunkOffset
2080: 2c 20 7a 57 72 69 74 65 2c 20 69 53 70 61 63 65  , zWrite, iSpace
2090: 29 3b 0a 20 20 20 20 20 20 20 20 7a 57 72 69 74  );.        zWrit
20a0: 65 20 2b 3d 20 69 53 70 61 63 65 3b 0a 20 20 20  e += iSpace;.   
20b0: 20 20 20 20 20 6e 57 72 69 74 65 20 2d 3d 20 69       nWrite -= i
20c0: 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 70  Space;.        p
20d0: 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73  ->endpoint.iOffs
20e0: 65 74 20 2b 3d 20 69 53 70 61 63 65 3b 0a 20 20  et += iSpace;.  
20f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
2100: 53 69 7a 65 20 3d 20 69 41 6d 74 20 2b 20 69 4f  Size = iAmt + iO
2110: 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  fst;.    }.  }..
2120: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2130: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
2140: 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 2e 0a  ncate the file..
2150: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
2160: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
2170: 65 61 64 79 20 6f 6e 20 64 69 73 6b 2c 20 74 72  eady on disk, tr
2180: 75 6e 63 61 74 65 20 69 74 20 74 68 65 72 65 2e  uncate it there.
2190: 20 4f 72 2c 20 69 66 20 69 74 0a 2a 2a 20 69 73   Or, if it.** is
21a0: 20 73 74 69 6c 6c 20 69 6e 20 6d 61 69 6e 20 6d   still in main m
21b0: 65 6d 6f 72 79 20 62 75 74 20 69 73 20 62 65 69  emory but is bei
21c0: 6e 67 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ng truncated to 
21d0: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
21e0: 7a 65 2c 0a 2a 2a 20 69 67 6e 6f 72 65 20 0a 2a  ze,.** ignore .*
21f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
2200: 6a 72 6e 6c 54 72 75 6e 63 61 74 65 28 73 71 6c  jrnlTruncate(sql
2210: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 2c  ite3_file *pJfd,
2220: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
2230: 7a 65 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61  ze){.  MemJourna
2240: 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e  l *p = (MemJourn
2250: 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20 69 66 28  al *)pJfd;.  if(
2260: 20 41 4c 57 41 59 53 28 73 69 7a 65 3d 3d 30 29   ALWAYS(size==0)
2270: 20 29 7b 0a 20 20 20 20 6d 65 6d 6a 72 6e 6c 46   ){.    memjrnlF
2280: 72 65 65 43 68 75 6e 6b 73 28 70 29 3b 0a 20 20  reeChunks(p);.  
2290: 20 20 70 2d 3e 6e 53 69 7a 65 20 3d 20 30 3b 0a    p->nSize = 0;.
22a0: 20 20 20 20 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e      p->endpoint.
22b0: 70 43 68 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pChunk = 0;.    
22c0: 70 2d 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66  p->endpoint.iOff
22d0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  set = 0;.    p->
22e0: 72 65 61 64 70 6f 69 6e 74 2e 70 43 68 75 6e 6b  readpoint.pChunk
22f0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72 65 61   = 0;.    p->rea
2300: 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 3d  dpoint.iOffset =
2310: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2330: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
2340: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2350: 6e 74 20 6d 65 6d 6a 72 6e 6c 43 6c 6f 73 65 28  nt memjrnlClose(
2360: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
2370: 66 64 29 7b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61  fd){.  MemJourna
2380: 6c 20 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e  l *p = (MemJourn
2390: 61 6c 20 2a 29 70 4a 66 64 3b 0a 20 20 6d 65 6d  al *)pJfd;.  mem
23a0: 6a 72 6e 6c 46 72 65 65 43 68 75 6e 6b 73 28 70  jrnlFreeChunks(p
23b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23d0: 53 79 6e 63 20 74 68 65 20 66 69 6c 65 2e 0a 2a  Sync the file..*
23e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
23f0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
2400: 72 65 61 74 65 64 2c 20 63 61 6c 6c 20 69 74 73  reated, call its
2410: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 2e 20 4f   xSync method. O
2420: 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 73 79  therwise, .** sy
2430: 6e 63 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncing an in-memo
2440: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ry journal is a 
2450: 6e 6f 2d 6f 70 2e 20 0a 2a 2f 0a 73 74 61 74 69  no-op. .*/.stati
2460: 63 20 69 6e 74 20 6d 65 6d 6a 72 6e 6c 53 79 6e  c int memjrnlSyn
2470: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
2480: 70 4a 66 64 2c 20 69 6e 74 20 66 6c 61 67 73 29  pJfd, int flags)
2490: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24a0: 45 54 45 52 32 28 70 4a 66 64 2c 20 66 6c 61 67  ETER2(pJfd, flag
24b0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
24c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
24d0: 20 51 75 65 72 79 20 74 68 65 20 73 69 7a 65 20   Query the size 
24e0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 20 62  of the file in b
24f0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
2500: 69 6e 74 20 6d 65 6d 6a 72 6e 6c 46 69 6c 65 53  int memjrnlFileS
2510: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
2520: 20 2a 70 4a 66 64 2c 20 73 71 6c 69 74 65 5f 69   *pJfd, sqlite_i
2530: 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
2540: 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 70 20 3d 20  MemJournal *p = 
2550: 28 4d 65 6d 4a 6f 75 72 6e 61 6c 20 2a 29 70 4a  (MemJournal *)pJ
2560: 66 64 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28  fd;.  *pSize = (
2570: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 20 70 2d  sqlite_int64) p-
2580: 3e 65 6e 64 70 6f 69 6e 74 2e 69 4f 66 66 73 65  >endpoint.iOffse
2590: 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
25a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25b0: 54 61 62 6c 65 20 6f 66 20 6d 65 74 68 6f 64 73  Table of methods
25c0: 20 66 6f 72 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20   for MemJournal 
25d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
25e0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ect..*/.static c
25f0: 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
2600: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
2610: 65 6d 4a 6f 75 72 6e 61 6c 4d 65 74 68 6f 64 73  emJournalMethods
2620: 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20   = {.  1,       
2630: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2640: 73 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 6a 72 6e  sion */.  memjrn
2650: 6c 43 6c 6f 73 65 2c 20 20 20 20 20 2f 2a 20 78  lClose,     /* x
2660: 43 6c 6f 73 65 20 2a 2f 0a 20 20 6d 65 6d 6a 72  Close */.  memjr
2670: 6e 6c 52 65 61 64 2c 20 20 20 20 20 20 2f 2a 20  nlRead,      /* 
2680: 78 52 65 61 64 20 2a 2f 0a 20 20 6d 65 6d 6a 72  xRead */.  memjr
2690: 6e 6c 57 72 69 74 65 2c 20 20 20 20 20 2f 2a 20  nlWrite,     /* 
26a0: 78 57 72 69 74 65 20 2a 2f 0a 20 20 6d 65 6d 6a  xWrite */.  memj
26b0: 72 6e 6c 54 72 75 6e 63 61 74 65 2c 20 20 2f 2a  rnlTruncate,  /*
26c0: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
26d0: 6d 65 6d 6a 72 6e 6c 53 79 6e 63 2c 20 20 20 20  memjrnlSync,    
26e0: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
26f0: 6d 65 6d 6a 72 6e 6c 46 69 6c 65 53 69 7a 65 2c  memjrnlFileSize,
2700: 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
2710: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2720: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
2730: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2740: 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2750: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2760: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
2770: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
2780: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2790: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
27a0: 74 72 6f 6c 20 2a 2f 0a 20 20 30 2c 20 20 20 20  trol */.  0,    
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27c0: 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
27d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
27e0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
27f0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
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 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
2820: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2830: 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
2840: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2850: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
2860: 61 72 72 69 65 72 20 2a 2f 0a 20 20 30 2c 20 20  arrier */.  0,  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2880: 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20   xShmUnmap */.  
2890: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
28a0: 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
28b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
28c0: 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
28d0: 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 4f 70 65  /.};../* .** Ope
28e0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
28f0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 68  . .**.** The beh
2900: 61 76 69 6f 75 72 20 6f 66 20 74 68 65 20 6a 6f  aviour of the jo
2910: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 70 65 6e  urnal file depen
2920: 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2930: 6f 66 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a  of parameter .**
2940: 20 6e 53 70 69 6c 6c 2e 20 49 66 20 6e 53 70 69   nSpill. If nSpi
2950: 6c 6c 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68  ll is 0, then th
2960: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2970: 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65 20  s always create 
2980: 61 6e 64 20 0a 2a 2a 20 61 63 63 65 73 73 65 64  and .** accessed
2990: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 64 65 72   using the under
29a0: 6c 79 69 6e 67 20 56 46 53 2e 20 49 66 20 6e 53  lying VFS. If nS
29b0: 70 69 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61  pill is less tha
29c0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 0a 2a 2a 20  n zero, then.** 
29d0: 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 61  all content is a
29e0: 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20  lways stored in 
29f0: 6d 61 69 6e 2d 6d 65 6d 6f 72 79 2e 20 46 69 6e  main-memory. Fin
2a00: 61 6c 6c 79 2c 20 69 66 20 6e 53 70 69 6c 6c 20  ally, if nSpill 
2a10: 69 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 76 65  is a.** positive
2a20: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
2a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2a40: 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61 74   initially creat
2a50: 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  ed in-memory.** 
2a60: 62 75 74 20 6d 61 79 20 62 65 20 66 6c 75 73 68  but may be flush
2a70: 65 64 20 74 6f 20 64 69 73 6b 20 6c 61 74 65 72  ed to disk later
2a80: 20 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73   on. In this cas
2a90: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2aa0: 6c 65 20 69 73 0a 2a 2a 20 66 6c 75 73 68 65 64  le is.** flushed
2ab0: 20 74 6f 20 64 69 73 6b 20 65 69 74 68 65 72 20   to disk either 
2ac0: 77 68 65 6e 20 69 74 20 67 72 6f 77 73 20 6c 61  when it grows la
2ad0: 72 67 65 72 20 74 68 61 6e 20 6e 53 70 69 6c 6c  rger than nSpill
2ae0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 0a   bytes in size,.
2af0: 2a 2a 20 6f 72 20 77 68 65 6e 20 73 71 6c 69 74  ** or when sqlit
2b00: 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2b10: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  ) is called..*/.
2b20: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  int sqlite3Journ
2b30: 61 6c 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  alOpen(.  sqlite
2b40: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
2b60: 74 6f 20 75 73 65 20 66 6f 72 20 61 63 74 75 61  to use for actua
2b70: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20  l file I/O */.  
2b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2b90: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  e,         /* Na
2ba0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
2bb0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  l file */.  sqli
2bc0: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 2c 20  te3_file *pJfd, 
2bd0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 61 6c 6c         /* Preall
2be0: 6f 63 61 74 65 64 2c 20 62 6c 61 6e 6b 20 66 69  ocated, blank fi
2bf0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
2c00: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2c20: 6e 69 6e 67 20 66 6c 61 67 73 20 2a 2f 0a 20 20  ning flags */.  
2c30: 69 6e 74 20 6e 53 70 69 6c 6c 20 20 20 20 20 20  int nSpill      
2c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2c50: 74 65 73 20 62 75 66 66 65 72 65 64 20 62 65 66  tes buffered bef
2c60: 6f 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ore opening the 
2c70: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  file */.){.  Mem
2c80: 4a 6f 75 72 6e 61 6c 20 2a 70 20 3d 20 28 4d 65  Journal *p = (Me
2c90: 6d 4a 6f 75 72 6e 61 6c 2a 29 70 4a 66 64 3b 0a  mJournal*)pJfd;.
2ca0: 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66  .  /* Zero the f
2cb0: 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile-handle objec
2cc0: 74 2e 20 49 66 20 6e 53 70 69 6c 6c 20 77 61 73  t. If nSpill was
2cd0: 20 70 61 73 73 65 64 20 7a 65 72 6f 2c 20 69 6e   passed zero, in
2ce0: 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 69 74  itialize.  ** it
2cf0: 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
2d00: 65 33 4f 73 4f 70 65 6e 28 29 20 66 75 6e 63 74  e3OsOpen() funct
2d10: 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ion of the under
2d20: 6c 79 69 6e 67 20 56 46 53 2e 20 49 6e 20 74 68  lying VFS. In th
2d30: 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 6e 6f 6e  is.  ** case non
2d40: 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e  e of the code in
2d50: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   this module is 
2d60: 65 78 65 63 75 74 65 64 20 61 73 20 61 20 72 65  executed as a re
2d70: 73 75 6c 74 20 6f 66 20 63 61 6c 6c 73 0a 20 20  sult of calls.  
2d80: 2a 2a 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 6a  ** made on the j
2d90: 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2da0: 6c 65 2e 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  le.  */.  memset
2db0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4d 65  (p, 0, sizeof(Me
2dc0: 6d 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 69 66  mJournal));.  if
2dd0: 28 20 6e 53 70 69 6c 6c 3d 3d 30 20 29 7b 0a 20  ( nSpill==0 ){. 
2de0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2df0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  3OsOpen(pVfs, zN
2e00: 61 6d 65 2c 20 70 4a 66 64 2c 20 66 6c 61 67 73  ame, pJfd, flags
2e10: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 0);.  }..  if(
2e20: 20 6e 53 70 69 6c 6c 3e 30 20 29 7b 0a 20 20 20   nSpill>0 ){.   
2e30: 20 70 2d 3e 6e 43 68 75 6e 6b 53 69 7a 65 20 3d   p->nChunkSize =
2e40: 20 6e 53 70 69 6c 6c 3b 0a 20 20 7d 65 6c 73 65   nSpill;.  }else
2e50: 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 75 6e 6b 53  {.    p->nChunkS
2e60: 69 7a 65 20 3d 20 38 20 2b 20 4d 45 4d 4a 4f 55  ize = 8 + MEMJOU
2e70: 52 4e 41 4c 5f 44 46 4c 54 5f 46 49 4c 45 43 48  RNAL_DFLT_FILECH
2e80: 55 4e 4b 53 49 5a 45 20 2d 20 73 69 7a 65 6f 66  UNKSIZE - sizeof
2e90: 28 46 69 6c 65 43 68 75 6e 6b 29 3b 0a 20 20 20  (FileChunk);.   
2ea0: 20 61 73 73 65 72 74 28 20 4d 45 4d 4a 4f 55 52   assert( MEMJOUR
2eb0: 4e 41 4c 5f 44 46 4c 54 5f 46 49 4c 45 43 48 55  NAL_DFLT_FILECHU
2ec0: 4e 4b 53 49 5a 45 3d 3d 66 69 6c 65 43 68 75 6e  NKSIZE==fileChun
2ed0: 6b 53 69 7a 65 28 70 2d 3e 6e 43 68 75 6e 6b 53  kSize(p->nChunkS
2ee0: 69 7a 65 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  ize) );.  }..  p
2ef0: 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 28 63 6f 6e  ->pMethod = (con
2f00: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2f10: 74 68 6f 64 73 2a 29 26 4d 65 6d 4a 6f 75 72 6e  thods*)&MemJourn
2f20: 61 6c 4d 65 74 68 6f 64 73 3b 0a 20 20 70 2d 3e  alMethods;.  p->
2f30: 6e 53 70 69 6c 6c 20 3d 20 6e 53 70 69 6c 6c 3b  nSpill = nSpill;
2f40: 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  .  p->flags = fl
2f50: 61 67 73 3b 0a 20 20 70 2d 3e 7a 4a 6f 75 72 6e  ags;.  p->zJourn
2f60: 61 6c 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 2d  al = zName;.  p-
2f70: 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
2f80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2fa0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2fb0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  rnal file..*/.vo
2fc0: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  id sqlite3MemJou
2fd0: 72 6e 61 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  rnalOpen(sqlite3
2fe0: 5f 66 69 6c 65 20 2a 70 4a 66 64 29 7b 0a 20 20  _file *pJfd){.  
2ff0: 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
3000: 65 6e 28 30 2c 20 30 2c 20 70 4a 66 64 2c 20 30  en(0, 0, pJfd, 0
3010: 2c 20 2d 31 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  , -1);.}..#if de
3020: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
3030: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
3040: 29 20 5c 0a 20 7c 7c 20 64 65 66 69 6e 65 64 28  ) \. || defined(
3050: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
3060: 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
3070: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61  )./*.** If the a
3080: 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
3090: 20 74 6f 20 61 20 4d 65 6d 4a 6f 75 72 6e 61 6c   to a MemJournal
30a0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
30b0: 69 73 20 6e 6f 74 20 61 6e 20 0a 2a 2a 20 69 6e  is not an .** in
30c0: 2d 6d 65 6d 6f 72 79 2d 6f 6e 6c 79 20 6a 6f 75  -memory-only jou
30d0: 72 6e 61 6c 20 66 69 6c 65 20 28 69 2e 65 2e 20  rnal file (i.e. 
30e0: 69 73 20 6f 6e 65 20 74 68 61 74 20 77 61 73 20  is one that was 
30f0: 6f 70 65 6e 65 64 20 77 69 74 68 20 61 20 2b 76  opened with a +v
3100: 65 0a 2a 2a 20 6e 53 70 69 6c 6c 20 70 61 72 61  e.** nSpill para
3110: 6d 65 74 65 72 20 6f 72 20 61 73 20 53 51 4c 49  meter or as SQLI
3120: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
3130: 52 4e 41 4c 29 2c 20 61 6e 64 20 74 68 65 20 75  RNAL), and the u
3140: 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 66 69  nderlying .** fi
3150: 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
3160: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63 72 65  een created, cre
3170: 61 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 69  ate it now..*/.i
3180: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  nt sqlite3Journa
3190: 6c 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 5f  lCreate(sqlite3_
31a0: 66 69 6c 65 20 2a 70 4a 66 64 29 7b 0a 20 20 69  file *pJfd){.  i
31b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31c0: 4b 3b 0a 20 20 4d 65 6d 4a 6f 75 72 6e 61 6c 20  K;.  MemJournal 
31d0: 2a 70 20 3d 20 28 4d 65 6d 4a 6f 75 72 6e 61 6c  *p = (MemJournal
31e0: 2a 29 70 4a 66 64 3b 0a 20 20 69 66 28 20 70 2d  *)pJfd;.  if( p-
31f0: 3e 70 4d 65 74 68 6f 64 3d 3d 26 4d 65 6d 4a 6f  >pMethod==&MemJo
3200: 75 72 6e 61 6c 4d 65 74 68 6f 64 73 20 26 26 20  urnalMethods && 
3210: 28 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  (.#ifdef SQLITE_
3220: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
3230: 49 54 45 0a 20 20 20 20 20 70 2d 3e 6e 53 70 69  ITE.     p->nSpi
3240: 6c 6c 3e 30 0a 23 65 6c 73 65 0a 20 20 20 20 20  ll>0.#else.     
3250: 2f 2a 20 57 68 69 6c 65 20 74 68 69 73 20 61 70  /* While this ap
3260: 70 65 61 72 73 20 74 6f 20 6e 6f 74 20 62 65 20  pears to not be 
3270: 70 6f 73 73 69 62 6c 65 20 77 69 74 68 6f 75 74  possible without
3280: 20 41 54 4f 4d 49 43 5f 57 52 49 54 45 2c 20 74   ATOMIC_WRITE, t
3290: 68 65 0a 20 20 20 20 20 2a 2a 20 70 61 74 68 73  he.     ** paths
32a0: 20 61 72 65 20 63 6f 6d 70 6c 65 78 2c 20 73 6f   are complex, so
32b0: 20 69 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e   it seems pruden
32c0: 74 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 74  t to leave the t
32d0: 65 73 74 20 69 6e 20 61 73 0a 20 20 20 20 20 2a  est in as.     *
32e0: 2a 20 61 20 4e 45 56 45 52 28 29 2c 20 69 6e 20  * a NEVER(), in 
32f0: 63 61 73 65 20 6f 75 72 20 61 6e 61 6c 79 73 69  case our analysi
3300: 73 20 69 73 20 73 75 62 74 6c 79 20 66 6c 61 77  s is subtly flaw
3310: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 4e 45 56 45  ed. */.     NEVE
3320: 52 28 70 2d 3e 6e 53 70 69 6c 6c 3e 30 29 0a 23  R(p->nSpill>0).#
3330: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3340: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
3350: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
3360: 20 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20     || (p->flags 
3370: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
3380: 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 23 65 6e 64  IN_JOURNAL).#end
3390: 69 66 0a 20 20 29 29 7b 0a 20 20 20 20 72 63 20  if.  )){.    rc 
33a0: 3d 20 6d 65 6d 6a 72 6e 6c 43 72 65 61 74 65 46  = memjrnlCreateF
33b0: 69 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ile(p);.  }.  re
33c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
33d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  f../*.** The fil
33e0: 65 2d 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e-handle passed 
33f0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
3400: 6d 65 6e 74 20 69 73 20 6f 70 65 6e 20 6f 6e 20  ment is open on 
3410: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
3420: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
3430: 66 20 74 68 69 73 20 22 6a 6f 75 72 6e 61 6c 20  f this "journal 
3440: 66 69 6c 65 22 20 69 73 20 63 75 72 72 65 6e 74  file" is current
3450: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68 65 61  ly stored in hea
3460: 70 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 72 20  p memory,.** or 
3470: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3480: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
3490: 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
34a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
34b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
34c0: 4d 65 74 68 6f 64 73 3d 3d 26 4d 65 6d 4a 6f 75  Methods==&MemJou
34d0: 72 6e 61 6c 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  rnalMethods;.}..
34e0: 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  /* .** Return th
34f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
3500: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
3510: 6f 72 65 20 61 20 4a 6f 75 72 6e 61 6c 46 69 6c  ore a JournalFil
3520: 65 20 74 68 61 74 20 75 73 65 73 20 76 66 73 0a  e that uses vfs.
3530: 2a 2a 20 70 56 66 73 20 74 6f 20 63 72 65 61 74  ** pVfs to creat
3540: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
3550: 20 6f 6e 2d 64 69 73 6b 20 66 69 6c 65 73 2e 0a   on-disk files..
3560: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f  */.int sqlite3Jo
3570: 75 72 6e 61 6c 53 69 7a 65 28 73 71 6c 69 74 65  urnalSize(sqlite
3580: 33 5f 76 66 73 20 2a 70 56 66 73 29 7b 0a 20 20  3_vfs *pVfs){.  
3590: 72 65 74 75 72 6e 20 4d 41 58 28 70 56 66 73 2d  return MAX(pVfs-
35a0: 3e 73 7a 4f 73 46 69 6c 65 2c 20 28 69 6e 74 29  >szOsFile, (int)
35b0: 73 69 7a 65 6f 66 28 4d 65 6d 4a 6f 75 72 6e 61  sizeof(MemJourna
35c0: 6c 29 29 3b 0a 7d 0a                             l));.}.