/ Hex Artifact Content
Login

Artifact 54181eb73cb4783c4241feca9eaa490768b39008:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
01c0: 2e 68 22 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .h"          /* 
01d0: 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 74 6f  Must be first to
01e0: 20 65 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69   enable large fi
01f0: 6c 65 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69  le support */.#i
0200: 66 20 4f 53 5f 57 49 4e 20 20 20 20 20 20 20 20  f OS_WIN        
0210: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0220: 69 6c 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ile is used for 
0230: 77 69 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a  windows only */.
0240: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0250: 49 6e 74 2e 68 22 0a 0a 23 69 6e 63 6c 75 64 65  Int.h"..#include
0260: 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 0a 2f 2a   <winbase.h>../*
0270: 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65 64 20  .** Macros used 
0280: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
0290: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75  ther or not to u
02a0: 73 65 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 23  se threads..*/.#
02b0: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
02c0: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
02d0: 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20 53 51  SAFE.# define SQ
02e0: 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53  LITE_W32_THREADS
02f0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
0300: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
0310: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
0320: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
0330: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
0340: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
0350: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
0360: 65 64 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73  ed file.*/.int s
0370: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 63  qlite3OsDelete(c
0380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0390: 6e 61 6d 65 29 7b 0a 20 20 44 65 6c 65 74 65 46  name){.  DeleteF
03a0: 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  ileA(zFilename);
03b0: 0a 20 20 54 52 41 43 45 32 28 22 44 45 4c 45 54  .  TRACE2("DELET
03c0: 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  E \"%s\"\n", zFi
03d0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
03e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
03f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0400: 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
0410: 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ile exists..*/.i
0420: 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  nt sqlite3OsFile
0430: 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61  Exists(const cha
0440: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
0450: 20 72 65 74 75 72 6e 20 47 65 74 46 69 6c 65 41   return GetFileA
0460: 74 74 72 69 62 75 74 65 73 41 28 7a 46 69 6c 65  ttributesA(zFile
0470: 6e 61 6d 65 29 20 21 3d 20 30 78 66 66 66 66 66  name) != 0xfffff
0480: 66 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  fff;.}../*.** At
0490: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
04a0: 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65  file for both re
04b0: 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
04c0: 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66  g.  If that.** f
04d0: 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e  ails, try openin
04e0: 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  g it read-only. 
04f0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   If the file doe
0500: 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20  s not exist,.** 
0510: 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74  try to create it
0520: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
0530: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
0540: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69   the open file i
0550: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64  s written to *id
0560: 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  .** and *pReadon
0570: 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  ly is set to 0 i
0580: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  f the file was o
0590: 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e  pened for readin
05a0: 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67  g and.** writing
05b0: 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c   or 1 if the fil
05c0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
05d0: 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e  d-only.  The fun
05e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
05f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
0600: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
0610: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
0620: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
0630: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
0640: 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f   *id and *pReado
0650: 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  nly unchanged..*
0660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f  /.int sqlite3OsO
0670: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
0680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0690: 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20  ename,.  OsFile 
06a0: 2a 69 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61  *id,.  int *pRea
06b0: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 48 41 4e 44 4c  donly.){.  HANDL
06c0: 45 20 68 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E h;.  assert( !
06d0: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
06e0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
06f0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
0700: 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
0710: 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20  ENERIC_WRITE,.  
0720: 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45     FILE_SHARE_RE
0730: 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
0740: 57 52 49 54 45 2c 0a 20 20 20 20 20 4e 55 4c 4c  WRITE,.     NULL
0750: 2c 0a 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41  ,.     OPEN_ALWA
0760: 59 53 2c 0a 20 20 20 20 20 46 49 4c 45 5f 41 54  YS,.     FILE_AT
0770: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
0780: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
0790: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 4e  M_ACCESS,.     N
07a0: 55 4c 4c 0a 20 20 29 3b 0a 20 20 69 66 28 20 68  ULL.  );.  if( h
07b0: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
07c0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 68 20  _VALUE ){.    h 
07d0: 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 7a 46  = CreateFileA(zF
07e0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
07f0: 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20  GENERIC_READ,.  
0800: 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f       FILE_SHARE_
0810: 52 45 41 44 2c 0a 20 20 20 20 20 20 20 4e 55 4c  READ,.       NUL
0820: 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41  L,.       OPEN_A
0830: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49  LWAYS,.       FI
0840: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
0850: 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f  MAL | FILE_FLAG_
0860: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20  RANDOM_ACCESS,. 
0870: 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29        NULL.    )
0880: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56  ;.    if( h==INV
0890: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
08a0: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
08b0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
08c0: 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  N;.    }.    *pR
08d0: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadonly = 1;.  }
08e0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64  else{.    *pRead
08f0: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  only = 0;.  }.  
0900: 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 64 2d  id->h = h;.  id-
0910: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
0920: 4f 43 4b 3b 0a 20 20 69 64 2d 3e 73 68 61 72 65  OCK;.  id->share
0930: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b 0a 20  dLockByte = 0;. 
0940: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b   id->isOpen = 1;
0950: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
0960: 31 29 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50  1);.  TRACE3("OP
0970: 45 4e 20 52 2f 57 20 25 64 20 5c 22 25 73 5c 22  EN R/W %d \"%s\"
0980: 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
0990: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
09a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
09b0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
09c0: 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72  n a new file for
09d0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
09e0: 73 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  s by this proces
09f0: 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77  s..** The file w
0a00: 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f  ill be opened fo
0a10: 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
0a20: 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20  nd writing.  To 
0a30: 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e  avoid.** a poten
0a40: 74 69 61 6c 20 73 65 63 75 72 69 74 79 20 70 72  tial security pr
0a50: 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74  oblem, we do not
0a60: 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20   allow the file 
0a70: 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  to have.** previ
0a80: 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20  ously existed.  
0a90: 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20  Nor do we allow 
0aa0: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61  the file to be a
0ab0: 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e   symbolic.** lin
0ac0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46  k..**.** If delF
0ad0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
0ae0: 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  n make arrangeme
0af0: 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  nts to automatic
0b00: 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74  ally delete.** t
0b10: 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  he file when it 
0b20: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
0b30: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
0b40: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
0b50: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
0b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0b70: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
0b80: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
0b90: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
0ba0: 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  nt sqlite3OsOpen
0bb0: 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20  Exclusive(const 
0bc0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
0bd0: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74   OsFile *id, int
0be0: 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 48 41 4e   delFlag){.  HAN
0bf0: 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66 69 6c  DLE h;.  int fil
0c00: 65 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72 74  eflags;.  assert
0c10: 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  ( !id->isOpen );
0c20: 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29  .  if( delFlag )
0c30: 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73 20  {.    fileflags 
0c40: 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
0c50: 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c  _TEMPORARY | FIL
0c60: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
0c70: 43 45 53 53 20 0a 20 20 20 20 20 20 20 20 20 20  CESS .          
0c80: 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
0c90: 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
0ca0: 5f 43 4c 4f 53 45 3b 0a 20 20 7d 65 6c 73 65 7b  _CLOSE;.  }else{
0cb0: 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73 20 3d  .    fileflags =
0cc0: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
0cd0: 4d 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  M_ACCESS;.  }.  
0ce0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
0cf0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
0d00: 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
0d10: 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20  ENERIC_WRITE,.  
0d20: 20 20 20 30 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c     0,.     NULL,
0d30: 0a 20 20 20 20 20 43 52 45 41 54 45 5f 41 4c 57  .     CREATE_ALW
0d40: 41 59 53 2c 0a 20 20 20 20 20 66 69 6c 65 66 6c  AYS,.     filefl
0d50: 61 67 73 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20  ags,.     NULL. 
0d60: 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56   );.  if( h==INV
0d70: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
0d80: 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
0d90: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
0da0: 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68  .  }.  id->h = h
0db0: 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  ;.  id->locktype
0dc0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64   = NO_LOCK;.  id
0dd0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
0de0: 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70   = 0;.  id->isOp
0df0: 65 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f  en = 1;.  OpenCo
0e00: 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 52 41  unter(+1);.  TRA
0e10: 43 45 33 28 22 4f 50 45 4e 20 45 58 20 25 64 20  CE3("OPEN EX %d 
0e20: 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46  \"%s\"\n", h, zF
0e30: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  ilename);.  retu
0e40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0e50: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
0e60: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
0e70: 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  e for read-only 
0e80: 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  access..**.** On
0e90: 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20   success, write 
0ea0: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
0eb0: 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74  into *id and ret
0ec0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
0ed0: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
0ee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
0ef0: 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20  ANTOPEN..*/.int 
0f00: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
0f10: 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72  dOnly(const char
0f20: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46   *zFilename, OsF
0f30: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 48 41 4e 44  ile *id){.  HAND
0f40: 4c 45 20 68 3b 0a 20 20 61 73 73 65 72 74 28 20  LE h;.  assert( 
0f50: 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20  !id->isOpen );. 
0f60: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41   h = CreateFileA
0f70: 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  (zFilename,.    
0f80: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20   GENERIC_READ,. 
0f90: 20 20 20 20 30 2c 0a 20 20 20 20 20 4e 55 4c 4c      0,.     NULL
0fa0: 2c 0a 20 20 20 20 20 4f 50 45 4e 5f 45 58 49 53  ,.     OPEN_EXIS
0fb0: 54 49 4e 47 2c 0a 20 20 20 20 20 46 49 4c 45 5f  TING,.     FILE_
0fc0: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
0fd0: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   | FILE_FLAG_RAN
0fe0: 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20  DOM_ACCESS,.    
0ff0: 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20 20 69 66 28   NULL.  );.  if(
1000: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
1010: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1020: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1030: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64  NTOPEN;.  }.  id
1040: 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c  ->h = h;.  id->l
1050: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
1060: 4b 3b 0a 20 20 69 64 2d 3e 73 68 61 72 65 64 4c  K;.  id->sharedL
1070: 6f 63 6b 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  ockByte = 0;.  i
1080: 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20  d->isOpen = 1;. 
1090: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
10a0: 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  ;.  TRACE3("OPEN
10b0: 20 52 4f 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22   RO %d \"%s\"\n"
10c0: 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  , h, zFilename);
10d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
10f0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
1100: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1110: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1120: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1130: 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54 68 69 73  a.** file.  This
1140: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1150: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1160: 66 73 79 6e 63 28 29 20 74 68 65 20 64 69 72 65  fsync() the dire
1170: 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65  ctory.** in orde
1180: 72 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  r to make sure t
1190: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 61  he creation of a
11a0: 20 6e 65 77 20 66 69 6c 65 20 69 73 20 61 63 74   new file is act
11b0: 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a  ually written.**
11c0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
11d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11e0: 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20  only meaningful 
11f0: 66 6f 72 20 55 6e 69 78 2e 20 20 49 74 20 69 73  for Unix.  It is
1200: 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a   a no-op under.*
1210: 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e 63 65 20  * windows since 
1220: 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74  windows does not
1230: 20 73 75 70 70 6f 72 74 20 68 61 72 64 20 6c 69   support hard li
1240: 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  nks..**.** On su
1250: 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20  ccess, a handle 
1260: 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
1270: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 61 74   open file is at
1280: 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70 64 61 74   *id is.** updat
1290: 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ed with the new 
12a0: 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
12b0: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 53 51  escriptor and SQ
12c0: 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65  LITE_OK is.** re
12d0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  turned..**.** On
12e0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
12f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
1300: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
1310: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
1320: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
1330: 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  nt sqlite3OsOpen
1340: 44 69 72 65 63 74 6f 72 79 28 0a 20 20 63 6f 6e  Directory(.  con
1350: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
1360: 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 0a  e,.  OsFile *id.
1370: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
1380: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1390: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
13a0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
13b0: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
13c0: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
13d0: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
13e0: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
13f0: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
1400: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
1410: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
1420: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
1430: 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1440: 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1450: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1460: 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1470: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1480: 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1490: 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74  23456789";.  int
14a0: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54   i, j;.  char zT
14b0: 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54  empPath[SQLITE_T
14c0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
14d0: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 53 51   GetTempPathA(SQ
14e0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
14f0: 5a 45 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  ZE-30, zTempPath
1500: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  );.  for(i=strle
1510: 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e  n(zTempPath); i>
1520: 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
1530: 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
1540: 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
1550: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b   = 0;.  for(;;){
1560: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
1570: 66 2c 20 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49  f, "%s\\"TEMP_FI
1580: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70  LE_PREFIX, zTemp
1590: 50 61 74 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73  Path);.    j = s
15a0: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
15b0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
15c0: 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
15d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15e0: 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
15f0: 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
1600: 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
1610: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
1620: 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
1630: 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
1640: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
1650: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   0;.    if( !sql
1660: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
1670: 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b 0a  (zBuf) ) break;.
1680: 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 54 45    }.  TRACE2("TE
1690: 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c  MP FILENAME: %s\
16a0: 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74  n", zBuf);.  ret
16b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
16c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
16d0: 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   file..*/.int sq
16e0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 4f 73 46  lite3OsClose(OsF
16f0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 66 28 20  ile *id){.  if( 
1700: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 7b 0a 20 20  id->isOpen ){.  
1710: 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
1720: 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20  %d\n", id->h);. 
1730: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 69     CloseHandle(i
1740: 64 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65 6e 43  d->h);.    OpenC
1750: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20  ounter(-1);.    
1760: 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  id->isOpen = 0;.
1770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1780: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1790: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
17a0: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
17b0: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
17c0: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
17d0: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
17e0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
17f0: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
1800: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1810: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 69 6e  .** wrong..*/.in
1820: 74 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  t sqlite3OsRead(
1830: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64  OsFile *id, void
1840: 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29   *pBuf, int amt)
1850: 7b 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20  {.  DWORD got;. 
1860: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f   assert( id->isO
1870: 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  pen );.  Simulat
1880: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
1890: 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45 33  IOERR);.  TRACE3
18a0: 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25  ("READ %d lock=%
18b0: 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 69 64 2d  d\n", id->h, id-
18c0: 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69 66  >locktype);.  if
18d0: 28 20 21 52 65 61 64 46 69 6c 65 28 69 64 2d 3e  ( !ReadFile(id->
18e0: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67  h, pBuf, amt, &g
18f0: 6f 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f  ot, 0) ){.    go
1900: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
1910: 20 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74   got==(DWORD)amt
1920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1930: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1940: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
1950: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
1960: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
1970: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
1980: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
1990: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19a0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
19b0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
19c0: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
19d0: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
19e0: 65 33 4f 73 57 72 69 74 65 28 4f 73 46 69 6c 65  e3OsWrite(OsFile
19f0: 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64   *id, const void
1a00: 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29   *pBuf, int amt)
1a10: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  {.  int rc;.  DW
1a20: 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73  ORD wrote;.  ass
1a30: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
1a40: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a50: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1a60: 52 29 3b 0a 20 20 54 52 41 43 45 33 28 22 57 52  R);.  TRACE3("WR
1a70: 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  ITE %d lock=%d\n
1a80: 22 2c 20 69 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f  ", id->h, id->lo
1a90: 63 6b 74 79 70 65 29 3b 0a 20 20 77 68 69 6c 65  cktype);.  while
1aa0: 28 20 61 6d 74 3e 30 20 26 26 20 28 72 63 20 3d  ( amt>0 && (rc =
1ab0: 20 57 72 69 74 65 46 69 6c 65 28 69 64 2d 3e 68   WriteFile(id->h
1ac0: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 77 72  , pBuf, amt, &wr
1ad0: 6f 74 65 2c 20 30 29 29 21 3d 30 20 26 26 20 77  ote, 0))!=0 && w
1ae0: 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d  rote>0 ){.    am
1af0: 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1b00: 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
1b10: 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
1b20: 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c 20 61  }.  if( !rc || a
1b30: 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20 29 7b  mt>(int)wrote ){
1b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b50: 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_FULL;.  }.  r
1b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1b80: 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f  he read/write po
1b90: 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e  inter in a file.
1ba0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
1bb0: 73 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64  sSeek(OsFile *id
1bc0: 2c 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 29 7b  , off_t offset){
1bd0: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
1be0: 73 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a  s = offset>>32;.
1bf0: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
1c00: 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66 66   = offset & 0xff
1c10: 66 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44 20  ffffff;.  DWORD 
1c20: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
1c30: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 45  ->isOpen );.  SE
1c40: 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b  EK(offset/1024 +
1c50: 20 31 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46   1);.  rc = SetF
1c60: 69 6c 65 50 6f 69 6e 74 65 72 28 69 64 2d 3e 68  ilePointer(id->h
1c70: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
1c80: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
1c90: 47 49 4e 29 3b 0a 20 20 54 52 41 43 45 33 28 22  GIN);.  TRACE3("
1ca0: 53 45 45 4b 20 25 64 20 25 6c 6c 64 5c 6e 22 2c  SEEK %d %lld\n",
1cb0: 20 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 29 3b   id->h, offset);
1cc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cd0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1ce0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1cf0: 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1d00: 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1d10: 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1d20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53  /.int sqlite3OsS
1d30: 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b  ync(OsFile *id){
1d40: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69  .  assert( id->i
1d50: 73 4f 70 65 6e 20 29 3b 0a 20 20 54 52 41 43 45  sOpen );.  TRACE
1d60: 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d  3("SYNC %d lock=
1d70: 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 69 64  %d\n", id->h, id
1d80: 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69  ->locktype);.  i
1d90: 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66  f( FlushFileBuff
1da0: 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a 20 20  ers(id->h) ){.  
1db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dc0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1dd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1de0: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
1df0: 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69 72 65  ** Sync the dire
1e00: 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20  ctory zDirname. 
1e10: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1e20: 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  on operating sys
1e30: 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68  tems other.** th
1e40: 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e 74 20  an UNIX..*/.int 
1e50: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 72  sqlite3OsSyncDir
1e60: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1e70: 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20 20  r *zDirname){.  
1e80: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1e90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
1ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
1ec0: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1ed0: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1ee0: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
1ef0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 4f  ite3OsTruncate(O
1f00: 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f 74  sFile *id, off_t
1f10: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20   nByte){.  LONG 
1f20: 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74  upperBits = nByt
1f30: 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28  e>>32;.  assert(
1f40: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20   id->isOpen );. 
1f50: 20 54 52 41 43 45 33 28 22 54 52 55 4e 43 41 54   TRACE3("TRUNCAT
1f60: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 69 64  E %d %lld\n", id
1f70: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53  ->h, nByte);.  S
1f80: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
1f90: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
1fa0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  SetFilePointer(i
1fb0: 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75 70  d->h, nByte, &up
1fc0: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
1fd0: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66  GIN);.  SetEndOf
1fe0: 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 72  File(id->h);.  r
1ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2010: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
2020: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
2030: 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e 74 20 73  n bytes.*/.int s
2040: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
2050: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66  (OsFile *id, off
2060: 5f 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57  _t *pSize){.  DW
2070: 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c  ORD upperBits, l
2080: 6f 77 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65  owerBits;.  asse
2090: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
20a0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
20b0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
20c0: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
20d0: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d   GetFileSize(id-
20e0: 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
20f0: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 6f  .  *pSize = (((o
2100: 66 66 5f 74 29 75 70 70 65 72 42 69 74 73 29 3c  ff_t)upperBits)<
2110: 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
2120: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2130: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2140: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
2150: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
2160: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
2170: 6e 4e 54 2c 20 57 69 6e 32 4b 20 6f 72 20 57 69  nNT, Win2K or Wi
2180: 6e 58 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  nXP..** Return f
2190: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
21a0: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
21b0: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
21c0: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
21d0: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
21e0: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
21f0: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
2200: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
2210: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
2220: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
2230: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
2240: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
2250: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
2260: 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72  't call it win r
2270: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
2280: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
2290: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
22a0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
22b0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
22c0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
22d0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
22e0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
22f0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
2300: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
2310: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
2320: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
2330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2340: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sNT(void){.  sta
2350: 74 69 63 20 69 6e 74 20 6f 73 54 79 70 65 20 3d  tic int osType =
2360: 20 30 3b 20 20 20 2f 2a 20 30 3d 75 6e 6b 6e 6f   0;   /* 0=unkno
2370: 77 6e 20 31 3d 77 69 6e 39 35 20 32 3d 77 69 6e  wn 1=win95 2=win
2380: 4e 54 20 2a 2f 0a 20 20 69 66 28 20 6f 73 54 79  NT */.  if( osTy
2390: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 56  pe==0 ){.    OSV
23a0: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
23b0: 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53  ;.    sInfo.dwOS
23c0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
23d0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
23e0: 0a 20 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45  .    GetVersionE
23f0: 78 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  x(&sInfo);.    o
2400: 73 54 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  sType = sInfo.dw
2410: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
2420: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
2430: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 7d 0a 20  T ? 2 : 1;.  }. 
2440: 20 72 65 74 75 72 6e 20 6f 73 54 79 70 65 3d 3d   return osType==
2450: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  2;.}../*.** Acqu
2460: 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ire a reader loc
2470: 6b 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  k on the range o
2480: 66 20 62 79 74 65 73 20 66 72 6f 6d 20 69 42 79  f bytes from iBy
2490: 74 65 2e 2e 2e 69 42 79 74 65 2b 6e 42 79 74 65  te...iByte+nByte
24a0: 2d 31 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  -1..** Different
24b0: 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
24c0: 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
24d0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
24e0: 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
24f0: 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win95 or WinNT..
2500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
2510: 74 52 65 61 64 4c 6f 63 6b 28 48 41 4e 44 4c 45  tReadLock(HANDLE
2520: 20 68 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74   h, unsigned int
2530: 20 69 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   iByte, unsigned
2540: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
2550: 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
2560: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
2570: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
2580: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 69   ovlp.Offset = i
2590: 42 79 74 65 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  Byte;.    ovlp.O
25a0: 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20  ffsetHigh = 0;. 
25b0: 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d     ovlp.hEvent =
25c0: 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f   0;.    res = Lo
25d0: 63 6b 46 69 6c 65 45 78 28 68 2c 20 4c 4f 43 4b  ckFileEx(h, LOCK
25e0: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
25f0: 41 54 45 4c 59 2c 20 30 2c 20 6e 42 79 74 65 2c  ATELY, 0, nByte,
2600: 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65   0, &ovlp);.  }e
2610: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 4c  lse{.    res = L
2620: 6f 63 6b 46 69 6c 65 28 68 2c 20 69 42 79 74 65  ockFile(h, iByte
2630: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
2640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
2650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
2660: 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
2670: 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52  atic int unlockR
2680: 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  eadLock(OsFile *
2690: 69 64 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  id){.  int res;.
26a0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
26b0: 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b      res = Unlock
26c0: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52  File(id->h, SHAR
26d0: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
26e0: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d  }else{.    res =
2700: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   UnlockFile(id->
2710: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  h, SHARED_FIRST 
2720: 2b 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  + id->sharedLock
2730: 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
2740: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
2750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
2760: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
2770: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
2780: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
2790: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
27a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
27b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
27c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
27d0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
27e0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
27f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
2800: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
2810: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
2820: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
2830: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
2840: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
2850: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
2860: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
2870: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
2880: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
2890: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
28a0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
28b0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
28c0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
28d0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
28e0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
28f0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
2900: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
2910: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
2920: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
2930: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
2940: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
2950: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
2960: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
2970: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
2980: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
2990: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
29a0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
29b0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
29c0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
29d0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
29e0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
29f0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
2a00: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
2a10: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
2a20: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
2a30: 6f 63 6b 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ock.  The sqlite
2a40: 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  3OsUnlock() rout
2a50: 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c  ine.** erases al
2a60: 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20  l locks at once 
2a70: 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69  and returns us i
2a80: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f  mmediately to lo
2a90: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
2aa0: 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
2ab0: 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68  ible to lower th
2ac0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
2ad0: 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69  one step at a ti
2ae0: 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74  me.  You.** must
2af0: 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20   go straight to 
2b00: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
2b10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
2b20: 73 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  sLock(OsFile *id
2b30: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
2b40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b50: 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
2b60: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
2b70: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
2b80: 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
2b90: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
2ba0: 6f 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63  of a windows loc
2bb0: 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
2bc0: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
2bd0: 20 20 20 2f 2a 20 53 65 74 20 69 64 2d 3e 6c 6f     /* Set id->lo
2be0: 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76  cktype to this v
2bf0: 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74  alue before exit
2c00: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74  ing */.  int got
2c10: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
2c20: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63  /* True if we ac
2c30: 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47  quired a PENDING
2c40: 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20   lock this time 
2c50: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
2c60: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 54 52  ->isOpen );.  TR
2c70: 41 43 45 35 28 22 4c 4f 43 4b 20 25 64 20 25 64  ACE5("LOCK %d %d
2c80: 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a   was %d(%d)\n",.
2c90: 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c            id->h,
2ca0: 20 6c 6f 63 6b 74 79 70 65 2c 20 69 64 2d 3e 6c   locktype, id->l
2cb0: 6f 63 6b 74 79 70 65 2c 20 69 64 2d 3e 73 68 61  ocktype, id->sha
2cc0: 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20  redLockByte);.. 
2cd0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2ce0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
2cf0: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
2d00: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
2d10: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
2d20: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
2d30: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
2d40: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
2d50: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
2d60: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
2d70: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
2d80: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
2d90: 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  if( id->locktype
2da0: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
2db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dc0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
2dd0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
2de0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
2df0: 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
2e00: 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74  ssert( id->lockt
2e10: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
2e20: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
2e30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2e40: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
2e50: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
2e60: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
2e70: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
2e80: 7c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  | id->locktype==
2e90: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
2ea0: 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
2eb0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
2ec0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
2ed0: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
2ee0: 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
2ef0: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
2f00: 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
2f10: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
2f20: 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
2f30: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
2f40: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
2f50: 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
2f60: 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
2f70: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20   id->locktype;. 
2f80: 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70   if( id->locktyp
2f90: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c  e==NO_LOCK.   ||
2fa0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
2fb0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 69 64  USIVE_LOCK && id
2fc0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
2fd0: 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  RVED_LOCK).  ){.
2fe0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
2ff0: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
3000: 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f  ->0 && (res = Lo
3010: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 50 45  ckFile(id->h, PE
3020: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
3030: 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
3040: 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
3050: 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
3060: 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70  ing lock.  The p
3070: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68  ending lock migh
3080: 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65  t be.      ** he
3090: 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65  ld by another re
30a0: 61 64 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f  ader process who
30b0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74   will release it
30c0: 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20   momentarily..  
30d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41      */.      TRA
30e0: 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67  CE2("could not g
30f0: 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  et a PENDING loc
3100: 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e  k. cnt=%d\n", cn
3110: 74 29 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28  t);.      Sleep(
3120: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
3130: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
3140: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  es;.  }..  /* Ac
3150: 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
3160: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
3170: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
3180: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
3190: 20 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c     assert( id->l
31a0: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
31b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4e 54   );.    if( isNT
31c0: 28 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  () ){.      res 
31d0: 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 69 64  = getReadLock(id
31e0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
31f0: 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  T, SHARED_SIZE);
3200: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3210: 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 20 20    int lk;.      
3220: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
3230: 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
3240: 6b 29 3b 0a 20 20 20 20 20 20 69 64 2d 3e 73 68  k);.      id->sh
3250: 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
3260: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
3270: 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
3280: 31 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  1);.      res = 
3290: 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20  LockFile(id->h, 
32a0: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 69 64 2d  SHARED_FIRST+id-
32b0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
32c0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
32d0: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
32e0: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
32f0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
3300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3310: 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
3320: 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
3330: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
3340: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
3350: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
3360: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  ( id->locktype==
3370: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
3380: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
3390: 65 28 69 64 2d 3e 68 2c 20 52 45 53 45 52 56 45  e(id->h, RESERVE
33a0: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
33b0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
33c0: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
33d0: 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
33e0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  CK;.    }.  }.. 
33f0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
3400: 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
3410: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
3420: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
3430: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
3440: 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
3450: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
3460: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
3470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
3480: 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
3490: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
34a0: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
34b0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
34c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
34d0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  d->locktype>=SHA
34e0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
34f0: 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64  res = unlockRead
3500: 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 20 20 54 52  Lock(id);.    TR
3510: 41 43 45 32 28 22 75 6e 72 65 61 64 6c 6f 63 6b  ACE2("unreadlock
3520: 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 3b 0a   = %d\n", res);.
3530: 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69      res = LockFi
3540: 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44  le(id->h, SHARED
3550: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
3560: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
3570: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
3580: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
3590: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
35a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35b0: 54 52 41 43 45 32 28 22 65 72 72 6f 72 2d 63 6f  TRACE2("error-co
35c0: 64 65 20 3d 20 25 64 5c 6e 22 2c 20 47 65 74 4c  de = %d\n", GetL
35d0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
35e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
35f0: 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61  we are holding a
3600: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
3610: 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72  at ought to be r
3620: 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20  eleased, then.  
3630: 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f  ** release it no
3640: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f  w..  */.  if( go
3650: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20  tPendingLock && 
3660: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
3670: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
3680: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 50  ockFile(id->h, P
3690: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
36a0: 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
36b0: 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
36c0: 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
36d0: 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
36e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
36f0: 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
3700: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
3710: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
3720: 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
3730: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
3740: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
3750: 52 41 43 45 34 28 22 4c 4f 43 4b 20 46 41 49 4c  RACE4("LOCK FAIL
3760: 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72  ED %d trying for
3770: 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e   %d but got %d\n
3780: 22 2c 20 69 64 2d 3e 68 2c 0a 20 20 20 20 20 20  ", id->h,.      
3790: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e       locktype, n
37a0: 65 77 4c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  ewLocktype);.   
37b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
37c0: 59 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63  Y;.  }.  id->loc
37d0: 6b 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74  ktype = newLockt
37e0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
37f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3800: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
3810: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
3820: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
3830: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
3840: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
3850: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
3860: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
3870: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
3880: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
3890: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
38a0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
38b0: 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
38c0: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
38d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
38e0: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
38f0: 20 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f   );.  if( id->lo
3900: 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
3910: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  _LOCK ){.    rc 
3920: 3d 20 31 3b 0a 20 20 20 20 54 52 41 43 45 33 28  = 1;.    TRACE3(
3930: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
3940: 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20   %d (local)\n", 
3950: 69 64 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65  id->h, rc);.  }e
3960: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f  lse{.    rc = Lo
3970: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52 45  ckFile(id->h, RE
3980: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
3990: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
39a0: 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63  c ){.      Unloc
39b0: 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52 45 53  kFile(id->h, RES
39c0: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
39d0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
39e0: 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 54 52  rc = !rc;.    TR
39f0: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
3a00: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
3a10: 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 72 63 29  )\n", id->h, rc)
3a20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3a30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
3a40: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
3a50: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
3a60: 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
3a70: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
3a80: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
3a90: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
3aa0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
3ab0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
3ac0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
3ad0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
3ae0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
3af0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
3b00: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
3b10: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
3b20: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
3b30: 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
3b40: 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
3b50: 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 2e 0a  outine to fail..
3b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
3b70: 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
3b80: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
3b90: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 74 79 70 65  {.  int rc, type
3ba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  ;.  assert( id->
3bb0: 69 73 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65  isOpen );.  asse
3bc0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
3bd0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 54  ARED_LOCK );.  T
3be0: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25 64  RACE5("UNLOCK %d
3bf0: 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64   to %d was %d(%d
3c00: 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63  )\n", id->h, loc
3c10: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
3c20: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 69   id->locktype, i
3c30: 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  d->sharedLockByt
3c40: 65 29 3b 0a 20 20 74 79 70 65 20 3d 20 69 64 2d  e);.  type = id-
3c50: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
3c60: 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
3c70: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
3c80: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53  ockFile(id->h, S
3c90: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
3ca0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
3cb0: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
3cc0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
3cd0: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
3ce0: 28 69 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  (id->h, RESERVED
3cf0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
3d00: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
3d10: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ype==NO_LOCK && 
3d20: 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
3d30: 4b 20 26 26 20 74 79 70 65 3c 45 58 43 4c 55 53  K && type<EXCLUS
3d40: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
3d50: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 69  unlockReadLock(i
3d60: 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  d);.  }.  if( ty
3d70: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
3d80: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
3d90: 6c 65 28 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e  le(id->h, PENDIN
3da0: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
3db0: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b  ;.  }.  id->lock
3dc0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
3dd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3de0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
3df0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  t information to
3e00: 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   seed the random
3e10: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
3e20: 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20  r.  The seed.** 
3e30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
3e40: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b  the buffer zBuf[
3e50: 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69  256].  The calli
3e60: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
3e70: 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66  .** supply a suf
3e80: 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20  ficiently large 
3e90: 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  buffer..*/.int s
3ea0: 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65  qlite3OsRandomSe
3eb0: 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  ed(char *zBuf){.
3ec0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
3ed0: 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
3ee0: 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
3ef0: 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
3f00: 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
3f10: 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
3f20: 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
3f30: 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
3f40: 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
3f50: 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
3f60: 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
3f70: 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
3f80: 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
3f90: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
3fa0: 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
3fb0: 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
3fc0: 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
3fd0: 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
3fe0: 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
3ff0: 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
4000: 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
4010: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
4020: 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
4030: 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
4040: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
4050: 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
4060: 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
4070: 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
4080: 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
4090: 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
40a0: 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
40b0: 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
40c0: 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
40d0: 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
40e0: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
40f0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
4100: 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65  ence.* This make
4110: 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
4120: 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
4130: 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
4140: 20 30 2c 20 32 35 36 29 3b 0a 20 20 47 65 74 53   0, 256);.  GetS
4150: 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53  ystemTime((LPSYS
4160: 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20  TEMTIME)zBuf);. 
4170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
4190: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
41a0: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
41b0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
41c0: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
41d0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 69 6e  qlite3OsSleep(in
41e0: 74 20 6d 73 29 7b 0a 20 20 53 6c 65 65 70 28 6d  t ms){.  Sleep(m
41f0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  s);.  return ms;
4200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63  .}../*.** Static
4210: 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20   variables used 
4220: 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68  for thread synch
4230: 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74  ronization.*/.st
4240: 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78  atic int inMutex
4250: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
4260: 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a  ITE_W32_THREADS.
4270: 20 20 73 74 61 74 69 63 20 43 52 49 54 49 43 41    static CRITICA
4280: 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65  L_SECTION cs;.#e
4290: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
42a0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f  following pair o
42b0: 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  f routine implem
42c0: 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75  ent mutual exclu
42d0: 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74  sion for.** mult
42e0: 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65  i-threaded proce
42f0: 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69  sses.  Only a si
4300: 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61  ngle thread is a
4310: 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65  llowed to.** exe
4320: 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  cuted code that 
4330: 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  is surrounded by
4340: 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e   EnterMutex() an
4350: 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a  d LeaveMutex()..
4360: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
4370: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
4380: 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73  Mutex.  There is
4390: 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63   not much critic
43a0: 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77  al.** code and w
43b0: 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65  hat little there
43c0: 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69   is executes qui
43d0: 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74  ckly and without
43e0: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f   blocking..*/.vo
43f0: 69 64 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  id sqlite3OsEnte
4400: 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66  rMutex(){.#ifdef
4410: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
4420: 41 44 53 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ADS.  static int
4430: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77   isInit = 0;.  w
4440: 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 29 7b  hile( !isInit ){
4450: 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67  .    static long
4460: 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69   lock = 0;.    i
4470: 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e  f( InterlockedIn
4480: 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d  crement(&lock)==
4490: 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69  1 ){.      Initi
44a0: 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63  alizeCriticalSec
44b0: 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 20  tion(&cs);.     
44c0: 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20   isInit = 1;.   
44d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c   }else{.      Sl
44e0: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
44f0: 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69 63 61  }.  EnterCritica
4500: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23  lSection(&cs);.#
4510: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
4520: 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e  !inMutex );.  in
4530: 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69  Mutex = 1;.}.voi
4540: 64 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65  d sqlite3OsLeave
4550: 4d 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72  Mutex(){.  asser
4560: 74 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20  t( inMutex );.  
4570: 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66  inMutex = 0;.#if
4580: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  def SQLITE_W32_T
4590: 48 52 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72  HREADS.  LeaveCr
45a0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
45b0: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  s);.#endif.}../*
45c0: 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
45d0: 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
45e0: 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
45f0: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
4600: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  nter.** to the f
4610: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f  ull pathname sto
4620: 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74  red in space obt
4630: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4640: 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68  eMalloc()..** Th
4650: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
4660: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
4670: 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
4680: 69 73 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74  is space once it
4690: 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
46a0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72   needed..*/.char
46b0: 20 2a 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50   *sqlite3OsFullP
46c0: 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  athname(const ch
46d0: 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a  ar *zRelative){.
46e0: 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64    char *zNotUsed
46f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 3b  ;.  char *zFull;
4700: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
4710: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
4720: 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69  athNameA(zRelati
4730: 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55  ve, 0, 0, &zNotU
4740: 73 65 64 29 20 2b 20 31 3b 0a 20 20 7a 46 75 6c  sed) + 1;.  zFul
4750: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
4760: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
4770: 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75   zFull==0 ) retu
4780: 72 6e 20 30 3b 0a 20 20 47 65 74 46 75 6c 6c 50  rn 0;.  GetFullP
4790: 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69  athNameA(zRelati
47a0: 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75 6c 6c  ve, nByte, zFull
47b0: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
47c0: 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a  return zFull;.}.
47d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
47e0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
47f0: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
4800: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
4810: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
4820: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
4830: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
4840: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
4850: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
4860: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
4870: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
4880: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
4890: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
48a0: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
48b0: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
48c0: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
48d0: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
48e0: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
48f0: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
4900: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
4910: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
4920: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
4930: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
4940: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
4950: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
4960: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4970: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 64  3OsCurrentTime(d
4980: 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
4990: 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
49a0: 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
49b0: 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
49c0: 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
49d0: 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
49e0: 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
49f0: 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
4a00: 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
4a10: 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
4a20: 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
4a30: 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20    double now;.  
4a40: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
4a50: 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
4a60: 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65    now = ((double
4a70: 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
4a80: 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39 36  me) * 4294967296
4a90: 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  .0; .  *prNow = 
4aa0: 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44  (now + ft.dwLowD
4ab0: 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30  ateTime)/8640000
4ac0: 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31  00000.0 + 230581
4ad0: 33 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  3.5;.#ifdef SQLI
4ae0: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
4af0: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
4b00: 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  me ){.    *prNow
4b10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65   = sqlite3_curre
4b20: 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20  nt_time/86400.0 
4b30: 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d  + 2440587.5;.  }
4b40: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4b50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
4b60: 64 20 74 68 65 20 74 69 6d 65 20 74 68 61 74 20  d the time that 
4b70: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6c 61 73  the file was las
4b80: 74 20 6d 6f 64 69 66 69 65 64 2e 20 20 57 72 69  t modified.  Wri
4b90: 74 65 20 74 68 65 0a 2a 2a 20 6d 6f 64 69 66 69  te the.** modifi
4ba0: 63 61 74 69 6f 6e 20 74 69 6d 65 20 61 6e 64 20  cation time and 
4bb0: 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
4bc0: 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
4bd0: 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
4be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
4bf0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4c00: 45 52 52 4f 52 20 69 66 20 74 68 65 20 6d 6f 64  ERROR if the mod
4c10: 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 69 6d  ification.** tim
4c20: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
4c30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4c40: 33 4f 73 46 69 6c 65 4d 6f 64 54 69 6d 65 28 4f  3OsFileModTime(O
4c50: 73 46 69 6c 65 20 2a 69 64 2c 20 64 6f 75 62 6c  sFile *id, doubl
4c60: 65 20 2a 70 72 4d 54 69 6d 65 29 7b 0a 20 20 69  e *prMTime){.  i
4c70: 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 54 49 4d  nt rc;.  FILETIM
4c80: 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45 54  E ft;.  /* FILET
4c90: 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
4ca0: 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
4cb0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
4cc0: 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 2a 2a   number of .  **
4cd0: 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
4ce0: 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
4cf0: 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
4d00: 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
4d10: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 47 65  . .  */.  if( Ge
4d20: 74 46 69 6c 65 54 69 6d 65 28 69 64 2d 3e 68 2c  tFileTime(id->h,
4d30: 20 30 2c 20 30 2c 20 26 66 74 29 20 29 7b 0a 20   0, 0, &ft) ){. 
4d40: 20 20 20 64 6f 75 62 6c 65 20 74 3b 0a 20 20 20     double t;.   
4d50: 20 74 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74   t = ((double)ft
4d60: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
4d70: 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b   * 4294967296.0;
4d80: 20 0a 20 20 20 20 2a 70 72 4d 54 69 6d 65 20 3d   .    *prMTime =
4d90: 20 28 74 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61   (t + ft.dwLowDa
4da0: 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30  teTime)/86400000
4db0: 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33  0000.0 + 2305813
4dc0: 2e 35 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  .5;.    rc = SQL
4dd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
4de0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4df0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
4e00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
4e10: 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 20 2a 2f 0a  if /* OS_WIN */.