/ Hex Artifact Content
Login

Artifact e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 32 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 22.**.** 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 40 28 23 29 20 24  ***.**.** @(#) $
0180: 49 64 3a 20 6a 6f 75 72 6e 61 6c 2e 63 2c 76 20  Id: journal.c,v 
0190: 31 2e 39 20 32 30 30 39 2f 30 31 2f 32 30 20 31  1.9 2009/01/20 1
01a0: 37 3a 30 36 3a 32 37 20 64 61 6e 69 65 6c 6b 31  7:06:27 danielk1
01b0: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 0a 23 69  977 Exp $.*/..#i
01c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
01d0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
01e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
01f0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 70   implements a sp
0200: 65 63 69 61 6c 20 6b 69 6e 64 20 6f 66 20 73 71  ecial kind of sq
0210: 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
0220: 74 20 75 73 65 64 0a 2a 2a 20 62 79 20 53 51 4c  t used.** by SQL
0230: 69 74 65 20 74 6f 20 63 72 65 61 74 65 20 6a 6f  ite to create jo
0240: 75 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 74  urnal files if t
0250: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
0260: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0270: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  is enabled..**.*
0280: 2a 20 54 68 65 20 64 69 73 74 69 6e 63 74 69 76  * The distinctiv
0290: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
02a0: 20 6f 66 20 74 68 69 73 20 73 71 6c 69 74 65 33   of this sqlite3
02b0: 5f 66 69 6c 65 20 69 73 20 74 68 61 74 20 74 68  _file is that th
02c0: 65 0a 2a 2a 20 61 63 74 75 61 6c 20 6f 6e 20 64  e.** actual on d
02d0: 69 73 6b 20 66 69 6c 65 20 69 73 20 63 72 65 61  isk file is crea
02e0: 74 65 64 20 6c 61 7a 69 6c 79 2e 20 57 68 65 6e  ted lazily. When
02f0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65   the file is cre
0300: 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 63 61 6c  ated,.** the cal
0310: 6c 65 72 20 73 70 65 63 69 66 69 65 73 20 61 20  ler specifies a 
0320: 62 75 66 66 65 72 20 73 69 7a 65 20 66 6f 72 20  buffer size for 
0330: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 62 75 66  an in-memory buf
0340: 66 65 72 20 74 6f 0a 2a 2a 20 62 65 20 75 73 65  fer to.** be use
0350: 64 20 74 6f 20 73 65 72 76 69 63 65 20 72 65 61  d to service rea
0360: 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
0370: 72 65 71 75 65 73 74 73 2e 20 54 68 65 20 61 63  requests. The ac
0380: 74 75 61 6c 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20  tual file.** on 
0390: 64 69 73 6b 20 69 73 20 6e 6f 74 20 63 72 65 61  disk is not crea
03a0: 74 65 64 20 6f 72 20 70 6f 70 75 6c 61 74 65 64  ted or populated
03b0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 3a 0a 2a   until either:.*
03c0: 2a 0a 2a 2a 20 20 20 31 29 20 54 68 65 20 69 6e  *.**   1) The in
03d0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
03e0: 74 61 74 69 6f 6e 20 67 72 6f 77 73 20 74 6f 6f  tation grows too
03f0: 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 61   large for the a
0400: 6c 6c 6f 63 61 74 65 64 20 0a 2a 2a 20 20 20 20  llocated .**    
0410: 20 20 62 75 66 66 65 72 2c 20 6f 72 0a 2a 2a 20    buffer, or.** 
0420: 20 20 32 29 20 54 68 65 20 73 71 6c 69 74 65 33    2) The sqlite3
0430: 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 20  JournalCreate() 
0440: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0450: 65 64 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ed..*/..#include
0460: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0470: 0a 2f 2a 0a 2a 2a 20 41 20 4a 6f 75 72 6e 61 6c  ./*.** A Journal
0480: 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 61  File object is a
0490: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
04a0: 69 74 65 33 5f 66 69 6c 65 20 75 73 65 64 20 62  ite3_file used b
04b0: 79 0a 2a 2a 20 61 73 20 61 6e 20 6f 70 65 6e 20  y.** as an open 
04c0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
04d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
04e0: 2f 0a 73 74 72 75 63 74 20 4a 6f 75 72 6e 61 6c  /.struct Journal
04f0: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
0500: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
0510: 74 68 6f 64 3b 20 20 20 20 2f 2a 20 49 2f 4f 20  thod;    /* I/O 
0520: 6d 65 74 68 6f 64 73 20 6f 6e 20 6a 6f 75 72 6e  methods on journ
0530: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 69 6e  al files */.  in
0540: 74 20 6e 42 75 66 3b 20 20 20 20 20 20 20 20 20  t nBuf;         
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0560: 20 53 69 7a 65 20 6f 66 20 7a 42 75 66 5b 5d 20   Size of zBuf[] 
0570: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
0580: 61 72 20 2a 7a 42 75 66 3b 20 20 20 20 20 20 20  ar *zBuf;       
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
05a0: 20 53 70 61 63 65 20 74 6f 20 62 75 66 66 65 72   Space to buffer
05b0: 20 6a 6f 75 72 6e 61 6c 20 77 72 69 74 65 73 20   journal writes 
05c0: 2a 2f 0a 20 20 69 6e 74 20 69 53 69 7a 65 3b 20  */.  int iSize; 
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
05f0: 66 20 7a 42 75 66 5b 5d 20 63 75 72 72 65 6e 74  f zBuf[] current
0600: 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ly used */.  int
0610: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0630: 78 4f 70 65 6e 20 66 6c 61 67 73 20 2a 2f 0a 20  xOpen flags */. 
0640: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0650: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
0660: 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20 75   /* The "real" u
0670: 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f  nderlying VFS */
0680: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
0690: 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20 20 20  *pReal;         
06a0: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
06b0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
06c0: 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
06d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f   const char *zJo
06e0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
06f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
0700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
0710: 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  };.typedef struc
0720: 74 20 4a 6f 75 72 6e 61 6c 46 69 6c 65 20 4a 6f  t JournalFile Jo
0730: 75 72 6e 61 6c 46 69 6c 65 3b 0a 0a 2f 2a 0a 2a  urnalFile;../*.*
0740: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  * If it does not
0750: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c   already exists,
0760: 20 63 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75   create and popu
0770: 6c 61 74 65 20 74 68 65 20 6f 6e 2d 64 69 73 6b  late the on-disk
0780: 20 66 69 6c 65 20 0a 2a 2a 20 66 6f 72 20 4a 6f   file .** for Jo
0790: 75 72 6e 61 6c 46 69 6c 65 20 70 2e 0a 2a 2f 0a  urnalFile p..*/.
07a0: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
07b0: 65 46 69 6c 65 28 4a 6f 75 72 6e 61 6c 46 69 6c  eFile(JournalFil
07c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
07d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
07e0: 66 28 20 21 70 2d 3e 70 52 65 61 6c 20 29 7b 0a  f( !p->pReal ){.
07f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
0800: 20 2a 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74   *pReal = (sqlit
0810: 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b  e3_file *)&p[1];
0820: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
0830: 33 4f 73 4f 70 65 6e 28 70 2d 3e 70 56 66 73 2c  3OsOpen(p->pVfs,
0840: 20 70 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 52   p->zJournal, pR
0850: 65 61 6c 2c 20 70 2d 3e 66 6c 61 67 73 2c 20 30  eal, p->flags, 0
0860: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
0870: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0880: 20 20 70 2d 3e 70 52 65 61 6c 20 3d 20 70 52 65    p->pReal = pRe
0890: 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  al;.      if( p-
08a0: 3e 69 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  >iSize>0 ){.    
08b0: 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e 69 53      assert(p->iS
08c0: 69 7a 65 3c 3d 70 2d 3e 6e 42 75 66 29 3b 0a 20  ize<=p->nBuf);. 
08d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
08e0: 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e 70 52  te3OsWrite(p->pR
08f0: 65 61 6c 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d  eal, p->zBuf, p-
0900: 3e 69 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  >iSize, 0);.    
0910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
0920: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0930: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
0940: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
0950: 74 20 6a 72 6e 6c 43 6c 6f 73 65 28 73 71 6c 69  t jrnlClose(sqli
0960: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 29 7b  te3_file *pJfd){
0970: 0a 20 20 4a 6f 75 72 6e 61 6c 46 69 6c 65 20 2a  .  JournalFile *
0980: 70 20 3d 20 28 4a 6f 75 72 6e 61 6c 46 69 6c 65  p = (JournalFile
0990: 20 2a 29 70 4a 66 64 3b 0a 20 20 69 66 28 20 70   *)pJfd;.  if( p
09a0: 2d 3e 70 52 65 61 6c 20 29 7b 0a 20 20 20 20 73  ->pReal ){.    s
09b0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 2d  qlite3OsClose(p-
09c0: 3e 70 52 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  >pReal);.  }.  s
09d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
09e0: 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Buf);.  return S
09f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
0a00: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
0a10: 6d 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  m the file..*/.s
0a20: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 52 65  tatic int jrnlRe
0a30: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
0a40: 6c 65 20 2a 70 4a 66 64 2c 20 20 20 20 2f 2a 20  le *pJfd,    /* 
0a50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
0a60: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 72   from which to r
0a70: 65 61 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 7a  ead */.  void *z
0a80: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
0a90: 2f 2a 20 50 75 74 20 74 68 65 20 72 65 73 75 6c  /* Put the resul
0aa0: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
0ab0: 20 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20   iAmt,          
0ac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ad0: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
0ae0: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
0af0: 20 69 4f 66 73 74 20 20 20 20 20 2f 2a 20 42 65   iOfst     /* Be
0b00: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
0b10: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
0b20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
0b30: 54 45 5f 4f 4b 3b 0a 20 20 4a 6f 75 72 6e 61 6c  TE_OK;.  Journal
0b40: 46 69 6c 65 20 2a 70 20 3d 20 28 4a 6f 75 72 6e  File *p = (Journ
0b50: 61 6c 46 69 6c 65 20 2a 29 70 4a 66 64 3b 0a 20  alFile *)pJfd;. 
0b60: 20 69 66 28 20 70 2d 3e 70 52 65 61 6c 20 29 7b   if( p->pReal ){
0b70: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
0b80: 33 4f 73 52 65 61 64 28 70 2d 3e 70 52 65 61 6c  3OsRead(p->pReal
0b90: 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
0ba0: 66 73 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  fst);.  }else if
0bb0: 28 20 28 69 41 6d 74 2b 69 4f 66 73 74 29 3e 70  ( (iAmt+iOfst)>p
0bc0: 2d 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  ->iSize ){.    r
0bd0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
0be0: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
0bf0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79  else{.    memcpy
0c00: 28 7a 42 75 66 2c 20 26 70 2d 3e 7a 42 75 66 5b  (zBuf, &p->zBuf[
0c10: 69 4f 66 73 74 5d 2c 20 69 41 6d 74 29 3b 0a 20  iOfst], iAmt);. 
0c20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
0c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
0c40: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ata to the file.
0c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
0c60: 72 6e 6c 57 72 69 74 65 28 0a 20 20 73 71 6c 69  rnlWrite(.  sqli
0c70: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 2c 20  te3_file *pJfd, 
0c80: 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
0c90: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 77 68 69 63  l file into whic
0ca0: 68 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  h to write */.  
0cb0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
0cc0: 2c 20 20 20 20 20 20 2f 2a 20 54 61 6b 65 20 64  ,      /* Take d
0cd0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
0ce0: 6e 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 20  n from here */. 
0cf0: 20 69 6e 74 20 69 41 6d 74 2c 20 20 20 20 20 20   int iAmt,      
0d00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0d10: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
0d20: 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  ite */.  sqlite_
0d30: 69 6e 74 36 34 20 69 4f 66 73 74 20 20 20 20 20  int64 iOfst     
0d40: 2f 2a 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67  /* Begin writing
0d50: 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20   at this offset 
0d60: 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  into the file */
0d70: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
0d80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4a 6f 75 72  QLITE_OK;.  Jour
0d90: 6e 61 6c 46 69 6c 65 20 2a 70 20 3d 20 28 4a 6f  nalFile *p = (Jo
0da0: 75 72 6e 61 6c 46 69 6c 65 20 2a 29 70 4a 66 64  urnalFile *)pJfd
0db0: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 70 52 65 61  ;.  if( !p->pRea
0dc0: 6c 20 26 26 20 28 69 4f 66 73 74 2b 69 41 6d 74  l && (iOfst+iAmt
0dd0: 29 3e 70 2d 3e 6e 42 75 66 20 29 7b 0a 20 20 20  )>p->nBuf ){.   
0de0: 20 72 63 20 3d 20 63 72 65 61 74 65 46 69 6c 65   rc = createFile
0df0: 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  (p);.  }.  if( r
0e00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
0e10: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 6c      if( p->pReal
0e20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
0e30: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d  qlite3OsWrite(p-
0e40: 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41  >pReal, zBuf, iA
0e50: 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20  mt, iOfst);.    
0e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
0e70: 63 70 79 28 26 70 2d 3e 7a 42 75 66 5b 69 4f 66  cpy(&p->zBuf[iOf
0e80: 73 74 5d 2c 20 7a 42 75 66 2c 20 69 41 6d 74 29  st], zBuf, iAmt)
0e90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
0ea0: 53 69 7a 65 3c 28 69 4f 66 73 74 2b 69 41 6d 74  Size<(iOfst+iAmt
0eb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
0ec0: 69 53 69 7a 65 20 3d 20 28 69 4f 66 73 74 2b 69  iSize = (iOfst+i
0ed0: 41 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Amt);.      }.  
0ee0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0ef0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
0f00: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 2e  uncate the file.
0f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
0f20: 72 6e 6c 54 72 75 6e 63 61 74 65 28 73 71 6c 69  rnlTruncate(sqli
0f30: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 2c 20  te3_file *pJfd, 
0f40: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a  sqlite_int64 siz
0f50: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
0f60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4a 6f 75 72  QLITE_OK;.  Jour
0f70: 6e 61 6c 46 69 6c 65 20 2a 70 20 3d 20 28 4a 6f  nalFile *p = (Jo
0f80: 75 72 6e 61 6c 46 69 6c 65 20 2a 29 70 4a 66 64  urnalFile *)pJfd
0f90: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 6c  ;.  if( p->pReal
0fa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
0fb0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
0fc0: 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a  ->pReal, size);.
0fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
0fe0: 3c 70 2d 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20  <p->iSize ){.   
0ff0: 20 70 2d 3e 69 53 69 7a 65 20 3d 20 73 69 7a 65   p->iSize = size
1000: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
1020: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1030: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 53 79 6e  atic int jrnlSyn
1040: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
1050: 70 4a 66 64 2c 20 69 6e 74 20 66 6c 61 67 73 29  pJfd, int flags)
1060: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4a 6f  {.  int rc;.  Jo
1070: 75 72 6e 61 6c 46 69 6c 65 20 2a 70 20 3d 20 28  urnalFile *p = (
1080: 4a 6f 75 72 6e 61 6c 46 69 6c 65 20 2a 29 70 4a  JournalFile *)pJ
1090: 66 64 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65  fd;.  if( p->pRe
10a0: 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  al ){.    rc = s
10b0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 2d 3e  qlite3OsSync(p->
10c0: 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 20  pReal, flags);. 
10d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
10e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1100: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20  /*.** Query the 
1110: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1120: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74   in bytes..*/.st
1130: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 46 69 6c  atic int jrnlFil
1140: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1150: 6c 65 20 2a 70 4a 66 64 2c 20 73 71 6c 69 74 65  le *pJfd, sqlite
1160: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
1170: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1180: 45 5f 4f 4b 3b 0a 20 20 4a 6f 75 72 6e 61 6c 46  E_OK;.  JournalF
1190: 69 6c 65 20 2a 70 20 3d 20 28 4a 6f 75 72 6e 61  ile *p = (Journa
11a0: 6c 46 69 6c 65 20 2a 29 70 4a 66 64 3b 0a 20 20  lFile *)pJfd;.  
11b0: 69 66 28 20 70 2d 3e 70 52 65 61 6c 20 29 7b 0a  if( p->pReal ){.
11c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11d0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52  OsFileSize(p->pR
11e0: 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 20 20 7d  eal, pSize);.  }
11f0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 53 69 7a 65  else{.    *pSize
1200: 20 3d 20 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   = (sqlite_int64
1210: 29 20 70 2d 3e 69 53 69 7a 65 3b 0a 20 20 7d 0a  ) p->iSize;.  }.
1220: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1230: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20 6d  /*.** Table of m
1240: 65 74 68 6f 64 73 20 66 6f 72 20 4a 6f 75 72 6e  ethods for Journ
1250: 61 6c 46 69 6c 65 20 73 71 6c 69 74 65 33 5f 66  alFile sqlite3_f
1260: 69 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ile object..*/.s
1270: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 71 6c  tatic struct sql
1280: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1290: 4a 6f 75 72 6e 61 6c 46 69 6c 65 4d 65 74 68 6f  JournalFileMetho
12a0: 64 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  ds = {.  1,     
12b0: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
12c0: 69 6f 6e 20 2a 2f 0a 20 20 6a 72 6e 6c 43 6c 6f  ion */.  jrnlClo
12d0: 73 65 2c 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73  se,     /* xClos
12e0: 65 20 2a 2f 0a 20 20 6a 72 6e 6c 52 65 61 64 2c  e */.  jrnlRead,
12f0: 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
1300: 2f 0a 20 20 6a 72 6e 6c 57 72 69 74 65 2c 20 20  /.  jrnlWrite,  
1310: 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
1320: 20 20 6a 72 6e 6c 54 72 75 6e 63 61 74 65 2c 20    jrnlTruncate, 
1330: 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
1340: 0a 20 20 6a 72 6e 6c 53 79 6e 63 2c 20 20 20 20  .  jrnlSync,    
1350: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
1360: 6a 72 6e 6c 46 69 6c 65 53 69 7a 65 2c 20 20 2f  jrnlFileSize,  /
1370: 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
1380: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1390: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 30 2c  /* xLock */.  0,
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b0: 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 30 2c 20  xUnlock */.  0, 
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
13d0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13e0: 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
13f0: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
1400: 6e 74 72 6f 6c 20 2a 2f 0a 20 20 30 2c 20 20 20  ntrol */.  0,   
1410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
1420: 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 30 20  ctorSize */.  0 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1440: 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1450: 69 73 74 69 63 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  istics */.};../*
1460: 20 0a 2a 2a 20 4f 70 65 6e 20 61 20 6a 6f 75 72   .** Open a jour
1470: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  nal file..*/.int
1480: 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
1490: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
14a0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
14b0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20    /* The VFS to 
14c0: 75 73 65 20 66 6f 72 20 61 63 74 75 61 6c 20 66  use for actual f
14d0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 63 6f 6e  ile I/O */.  con
14e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
14f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1500: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1510: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
1520: 5f 66 69 6c 65 20 2a 70 4a 66 64 2c 20 20 20 20  _file *pJfd,    
1530: 20 20 20 20 2f 2a 20 50 72 65 61 6c 6c 6f 63 61      /* Prealloca
1540: 74 65 64 2c 20 62 6c 61 6e 6b 20 66 69 6c 65 20  ted, blank file 
1550: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
1560: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1570: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e         /* Openin
1580: 67 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  g flags */.  int
1590: 20 6e 42 75 66 20 20 20 20 20 20 20 20 20 20 20   nBuf           
15a0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
15b0: 20 62 75 66 66 65 72 65 64 20 62 65 66 6f 72 65   buffered before
15c0: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
15d0: 65 20 2a 2f 0a 29 7b 0a 20 20 4a 6f 75 72 6e 61  e */.){.  Journa
15e0: 6c 46 69 6c 65 20 2a 70 20 3d 20 28 4a 6f 75 72  lFile *p = (Jour
15f0: 6e 61 6c 46 69 6c 65 20 2a 29 70 4a 66 64 3b 0a  nalFile *)pJfd;.
1600: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1610: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
1620: 65 28 70 56 66 73 29 29 3b 0a 20 20 69 66 28 20  e(pVfs));.  if( 
1630: 6e 42 75 66 3e 30 20 29 7b 0a 20 20 20 20 70 2d  nBuf>0 ){.    p-
1640: 3e 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d  >zBuf = sqlite3M
1650: 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 75 66 29 3b  allocZero(nBuf);
1660: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 7a 42 75  .    if( !p->zBu
1670: 66 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  f ){.      retur
1680: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1690: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
16a0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
16b0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  3OsOpen(pVfs, zN
16c0: 61 6d 65 2c 20 70 4a 66 64 2c 20 66 6c 61 67 73  ame, pJfd, flags
16d0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  , 0);.  }.  p->p
16e0: 4d 65 74 68 6f 64 20 3d 20 26 4a 6f 75 72 6e 61  Method = &Journa
16f0: 6c 46 69 6c 65 4d 65 74 68 6f 64 73 3b 0a 20 20  lFileMethods;.  
1700: 70 2d 3e 6e 42 75 66 20 3d 20 6e 42 75 66 3b 0a  p->nBuf = nBuf;.
1710: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61    p->flags = fla
1720: 67 73 3b 0a 20 20 70 2d 3e 7a 4a 6f 75 72 6e 61  gs;.  p->zJourna
1730: 6c 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 2d 3e  l = zName;.  p->
1740: 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 72  pVfs = pVfs;.  r
1750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1770: 20 61 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   argument p poin
1780: 74 73 20 74 6f 20 61 20 4a 6f 75 72 6e 61 6c 46  ts to a JournalF
1790: 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 61  ile structure, a
17a0: 6e 64 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  nd the underlyin
17b0: 67 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 6e 6f  g.** file has no
17c0: 74 20 79 65 74 20 62 65 65 6e 20 63 72 65 61 74  t yet been creat
17d0: 65 64 2c 20 63 72 65 61 74 65 20 69 74 20 6e 6f  ed, create it no
17e0: 77 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  w..*/.int sqlite
17f0: 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 73  3JournalCreate(s
1800: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 29 7b  qlite3_file *p){
1810: 0a 20 20 69 66 28 20 70 2d 3e 70 4d 65 74 68 6f  .  if( p->pMetho
1820: 64 73 21 3d 26 4a 6f 75 72 6e 61 6c 46 69 6c 65  ds!=&JournalFile
1830: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
1840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 72  .  }.  return cr
1860: 65 61 74 65 46 69 6c 65 28 28 4a 6f 75 72 6e 61  eateFile((Journa
1870: 6c 46 69 6c 65 20 2a 29 70 29 3b 0a 7d 0a 0a 2f  lFile *)p);.}../
1880: 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  * .** Return the
1890: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18a0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
18b0: 72 65 20 61 20 4a 6f 75 72 6e 61 6c 46 69 6c 65  re a JournalFile
18c0: 20 74 68 61 74 20 75 73 65 73 20 76 66 73 0a 2a   that uses vfs.*
18d0: 2a 20 70 56 66 73 20 74 6f 20 63 72 65 61 74 65  * pVfs to create
18e0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
18f0: 6f 6e 2d 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  on-disk files..*
1900: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 75  /.int sqlite3Jou
1910: 72 6e 61 6c 53 69 7a 65 28 73 71 6c 69 74 65 33  rnalSize(sqlite3
1920: 5f 76 66 73 20 2a 70 56 66 73 29 7b 0a 20 20 72  _vfs *pVfs){.  r
1930: 65 74 75 72 6e 20 28 70 56 66 73 2d 3e 73 7a 4f  eturn (pVfs->szO
1940: 73 46 69 6c 65 2b 73 69 7a 65 6f 66 28 4a 6f 75  sFile+sizeof(Jou
1950: 72 6e 61 6c 46 69 6c 65 29 29 3b 0a 7d 0a 23 65  rnalFile));.}.#e
1960: 6e 64 69 66 0a                                   ndif.