/ Hex Artifact Content
Login

Artifact 39525c414e57ca3f18d860d40d6d38df85689522:


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 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
01d0: 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 66 20 4f  ude "os.h".#if O
01e0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20  S_WIN           
01f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65      /* This file
0200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e   is used for win
0210: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69  dows only */..#i
0220: 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65 2e  nclude <winbase.
0230: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  h>../*.** Macros
0240: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
0250: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
0260: 74 20 74 6f 20 75 73 65 20 74 68 72 65 61 64 73  t to use threads
0270: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
0280: 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  (THREADSAFE) && 
0290: 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65 66  THREADSAFE.# def
02a0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  ine SQLITE_W32_T
02b0: 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a  HREADS 1.#endif.
02c0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
02d0: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
02e0: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
02f0: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
0300: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
0310: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
0320: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
0330: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 44 65  .int sqlite3OsDe
0340: 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20  lete(const char 
0350: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 44  *zFilename){.  D
0360: 65 6c 65 74 65 46 69 6c 65 41 28 7a 46 69 6c 65  eleteFileA(zFile
0370: 6e 61 6d 65 29 3b 0a 20 20 54 52 41 43 45 32 28  name);.  TRACE2(
0380: 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e  "DELETE \"%s\"\n
0390: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
03a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
03b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
03c0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
03d0: 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73  amed file exists
03e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
03f0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e  OsFileExists(con
0400: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0410: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 47 65  me){.  return Ge
0420: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
0430: 28 7a 46 69 6c 65 6e 61 6d 65 29 20 21 3d 20 30  (zFilename) != 0
0440: 78 66 66 66 66 66 66 66 66 3b 0a 7d 0a 0a 2f 2a  xffffffff;.}../*
0450: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
0460: 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20 62  pen a file for b
0470: 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20  oth reading and 
0480: 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68 61  writing.  If tha
0490: 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79 20  t.** fails, try 
04a0: 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64 2d  opening it read-
04b0: 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66 69  only.  If the fi
04c0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
04d0: 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72 65  t,.** try to cre
04e0: 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ate it..**.** On
04f0: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
0500: 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20  le for the open 
0510: 66 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e 20  file is written 
0520: 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70  to *id.** and *p
0530: 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74 20  Readonly is set 
0540: 74 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c 65  to 0 if the file
0550: 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20   was opened for 
0560: 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77  reading and.** w
0570: 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20 74  riting or 1 if t
0580: 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
0590: 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54  ed read-only.  T
05a0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
05b0: 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  rns.** SQLITE_OK
05c0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
05d0: 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  re, the function
05e0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
05f0: 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61  CANTOPEN and lea
0600: 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a  ves.** *id and *
0610: 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e  pReadonly unchan
0620: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
0630: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
0640: 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te(.  const char
0650: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f   *zFilename,.  O
0660: 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 69 6e 74  sFile *id,.  int
0670: 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20   *pReadonly.){. 
0680: 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 61 73 73   HANDLE h;.  ass
0690: 65 72 74 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e  ert( !id->isOpen
06a0: 20 29 3b 0a 20 20 68 20 3d 20 43 72 65 61 74 65   );.  h = Create
06b0: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
06c0: 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45  .     GENERIC_RE
06d0: 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
06e0: 54 45 2c 0a 20 20 20 20 20 46 49 4c 45 5f 53 48  TE,.     FILE_SH
06f0: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
0700: 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20  SHARE_WRITE,.   
0710: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45    NULL,.     OPE
0720: 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 46  N_ALWAYS,.     F
0730: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
0740: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
0750: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
0760: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20       NULL.  );. 
0770: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
0780: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
0790: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
07a0: 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  leA(zFilename,. 
07b0: 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45        GENERIC_RE
07c0: 41 44 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f  AD,.       FILE_
07d0: 53 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20  SHARE_READ,.    
07e0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
07f0: 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20  OPEN_ALWAYS,.   
0800: 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
0810: 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45  TE_NORMAL | FILE
0820: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
0830: 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  ESS,.       NULL
0840: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
0850: 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
0860: 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
0870: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
0880: 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
0890: 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20     *pReadonly = 
08a0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
08b0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  *pReadonly = 0;.
08c0: 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b    }.  id->h = h;
08d0: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20  .  id->locktype 
08e0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d  = NO_LOCK;.  id-
08f0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
0900: 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65  = 0;.  id->isOpe
0910: 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f 75  n = 1;.  OpenCou
0920: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 52 41 43  nter(+1);.  TRAC
0930: 45 33 28 22 4f 50 45 4e 20 52 2f 57 20 25 64 20  E3("OPEN R/W %d 
0940: 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46  \"%s\"\n", h, zF
0950: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  ilename);.  retu
0960: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0970: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
0980: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
0990: 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  le for exclusive
09a0: 20 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20   access by this 
09b0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20  process..** The 
09c0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65  file will be ope
09d0: 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ned for both rea
09e0: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
09f0: 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61  .  To avoid.** a
0a00: 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72   potential secur
0a10: 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  ity problem, we 
0a20: 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  do not allow the
0a30: 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a   file to have.**
0a40: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
0a50: 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20  ted.  Nor do we 
0a60: 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74  allow the file t
0a70: 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a  o be a symbolic.
0a80: 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ** link..**.** I
0a90: 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75  f delFlag is tru
0aa0: 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72  e, then make arr
0ab0: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74  angements to aut
0ac0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
0ad0: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68  e.** the file wh
0ae0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
0af0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
0b00: 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  s, write the fil
0b10: 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69  e handle into *i
0b20: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  d and return SQL
0b30: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
0b40: 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e   failure, return
0b50: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
0b60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0b70: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
0b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0b90: 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69  ename, OsFile *i
0ba0: 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b  d, int delFlag){
0bb0: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 69  .  HANDLE h;.  i
0bc0: 6e 74 20 66 69 6c 65 66 6c 61 67 73 3b 0a 20 20  nt fileflags;.  
0bd0: 61 73 73 65 72 74 28 20 21 69 64 2d 3e 69 73 4f  assert( !id->isO
0be0: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 64 65 6c  pen );.  if( del
0bf0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 66 69 6c 65  Flag ){.    file
0c00: 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 41 54 54  flags = FILE_ATT
0c10: 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
0c20: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   | FILE_FLAG_RAN
0c30: 44 4f 4d 5f 41 43 43 45 53 53 20 0a 20 20 20 20  DOM_ACCESS .    
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
0c60: 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 20 20  ETE_ON_CLOSE;.  
0c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 69 6c 65 66  }else{.    filef
0c80: 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47  lags = FILE_FLAG
0c90: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
0ca0: 20 20 7d 0a 20 20 68 20 3d 20 43 72 65 61 74 65    }.  h = Create
0cb0: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
0cc0: 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45  .     GENERIC_RE
0cd0: 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
0ce0: 54 45 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  TE,.     0,.    
0cf0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 43 52 45 41   NULL,.     CREA
0d00: 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20  TE_ALWAYS,.     
0d10: 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20 20 20 20  fileflags,.     
0d20: 4e 55 4c 4c 0a 20 20 29 3b 0a 20 20 69 66 28 20  NULL.  );.  if( 
0d30: 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
0d40: 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 72  E_VALUE ){.    r
0d50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
0d60: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d  TOPEN;.  }.  id-
0d70: 3e 68 20 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f  >h = h;.  id->lo
0d80: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
0d90: 3b 0a 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f  ;.  id->sharedLo
0da0: 63 6b 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 64  ckByte = 0;.  id
0db0: 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  ->isOpen = 1;.  
0dc0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
0dd0: 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20  .  TRACE3("OPEN 
0de0: 45 58 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  EX %d \"%s\"\n",
0df0: 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a   h, zFilename);.
0e00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0e10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
0e20: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
0e30: 65 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ew file for read
0e40: 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a  -only access..**
0e50: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
0e60: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
0e70: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
0e80: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
0e90: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
0ea0: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
0eb0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
0ec0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f  /.int sqlite3OsO
0ed0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73  penReadOnly(cons
0ee0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
0ef0: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  e, OsFile *id){.
0f00: 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 61 73    HANDLE h;.  as
0f10: 73 65 72 74 28 20 21 69 64 2d 3e 69 73 4f 70 65  sert( !id->isOpe
0f20: 6e 20 29 3b 0a 20 20 68 20 3d 20 43 72 65 61 74  n );.  h = Creat
0f30: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65  eFileA(zFilename
0f40: 2c 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52  ,.     GENERIC_R
0f50: 45 41 44 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20  EAD,.     0,.   
0f60: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45    NULL,.     OPE
0f70: 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20  N_EXISTING,.    
0f80: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
0f90: 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c  NORMAL | FILE_FL
0fa0: 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
0fb0: 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b  ,.     NULL.  );
0fc0: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
0fd0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
0fe0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0ff0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
1000: 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20  }.  id->h = h;. 
1010: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20   id->locktype = 
1020: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d 3e 73  NO_LOCK;.  id->s
1030: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
1040: 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20  0;.  id->isOpen 
1050: 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  = 1;.  OpenCount
1060: 65 72 28 2b 31 29 3b 0a 20 20 54 52 41 43 45 33  er(+1);.  TRACE3
1070: 28 22 4f 50 45 4e 20 52 4f 20 25 64 20 5c 22 25  ("OPEN RO %d \"%
1080: 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65  s\"\n", h, zFile
1090: 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  name);.  return 
10a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10b0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
10c0: 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
10d0: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
10e0: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
10f0: 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e  tains a.** file.
1100: 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63    This file desc
1110: 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73  riptor can be us
1120: 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68  ed to fsync() th
1130: 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69  e directory.** i
1140: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1150: 73 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f  sure the creatio
1160: 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20  n of a new file 
1170: 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  is actually writ
1180: 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ten.** to disk..
1190: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11a0: 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69  ne is only meani
11b0: 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20  ngful for Unix. 
11c0: 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75   It is a no-op u
11d0: 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20  nder.** windows 
11e0: 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f  since windows do
11f0: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68  es not support h
1200: 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a  ard links..**.**
1210: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
1220: 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65 76  andle for a prev
1230: 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65  iously open file
1240: 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a   is at *id is.**
1250: 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
1260: 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20  e new directory 
1270: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1280: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
1290: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
12a0: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
12b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
12c0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54  urns SQLITE_CANT
12d0: 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a  OPEN and leaves.
12e0: 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64  ** *id unchanged
12f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1300: 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
1310: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1320: 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c  Dirname,.  OsFil
1330: 65 20 2a 69 64 0a 29 7b 0a 20 20 72 65 74 75 72  e *id.){.  retur
1340: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1350: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c  /*.** If the fol
1360: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
1370: 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  riable points to
1380: 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20   a string which 
1390: 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  is the.** name o
13a0: 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74  f a directory, t
13b0: 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f  hen that directo
13c0: 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ry will be used 
13d0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70  to store.** temp
13e0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2f 0a  orary files..*/.
13f0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65  char *sqlite3_te
1400: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  mp_directory = 0
1410: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
1420: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1430: 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
1440: 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
1450: 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
1460: 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  ld at least SQLI
1470: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
1480: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1490: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 65 6d  int sqlite3OsTem
14a0: 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a  pFileName(char *
14b0: 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
14c0: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
14d0: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
14e0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
14f0: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
1500: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1510: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
1520: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
1530: 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68    char zTempPath
1540: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
1550: 5f 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20 73 71  _SIZE];.  if( sq
1560: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1570: 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 74 72 6e  tory ){.    strn
1580: 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 73  cpy(zTempPath, s
1590: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
15a0: 63 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f 54 45  ctory, SQLITE_TE
15b0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b  MPNAME_SIZE-30);
15c0: 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 53  .    zTempPath[S
15d0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
15e0: 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 7d  IZE-30] = 0;.  }
15f0: 65 6c 73 65 7b 0a 20 20 20 20 47 65 74 54 65 6d  else{.    GetTem
1600: 70 50 61 74 68 41 28 53 51 4c 49 54 45 5f 54 45  pPathA(SQLITE_TE
1610: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20  MPNAME_SIZE-30, 
1620: 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a  zTempPath);.  }.
1630: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
1640: 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26  TempPath); i>0 &
1650: 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d  & zTempPath[i-1]
1660: 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20  =='\\'; i--){}. 
1670: 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20   zTempPath[i] = 
1680: 30 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  0;.  for(;;){.  
1690: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
16a0: 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f  "%s\\"TEMP_FILE_
16b0: 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74  PREFIX, zTempPat
16c0: 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  h);.    j = strl
16d0: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
16e0: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
16f0: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
1700: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
1710: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1720: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
1730: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
1740: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
1750: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
1760: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
1770: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
1780: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
1790: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 42  3OsFileExists(zB
17a0: 75 66 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  uf) ) break;.  }
17b0: 0a 20 20 54 52 41 43 45 32 28 22 54 45 4d 50 20  .  TRACE2("TEMP 
17c0: 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c  FILENAME: %s\n",
17d0: 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   zBuf);.  return
17e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
17f0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
1800: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1810: 65 33 4f 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65  e3OsClose(OsFile
1820: 20 2a 69 64 29 7b 0a 20 20 69 66 28 20 69 64 2d   *id){.  if( id-
1830: 3e 69 73 4f 70 65 6e 20 29 7b 0a 20 20 20 20 54  >isOpen ){.    T
1840: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
1850: 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 20 20  n", id->h);.    
1860: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 69 64 2d 3e  CloseHandle(id->
1870: 68 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  h);.    OpenCoun
1880: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 69 64 2d  ter(-1);.    id-
1890: 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  >isOpen = 0;.  }
18a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
18c0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
18d0: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
18e0: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
18f0: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
1900: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
1910: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
1920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
1930: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1940: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73   wrong..*/.int s
1950: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 4f 73 46  qlite3OsRead(OsF
1960: 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70  ile *id, void *p
1970: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
1980: 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20 20 61 73   DWORD got;.  as
1990: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
19a0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
19b0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
19c0: 52 52 29 3b 0a 20 20 54 52 41 43 45 33 28 22 52  RR);.  TRACE3("R
19d0: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
19e0: 22 2c 20 69 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f  ", id->h, id->lo
19f0: 63 6b 74 79 70 65 29 3b 0a 20 20 69 66 28 20 21  cktype);.  if( !
1a00: 52 65 61 64 46 69 6c 65 28 69 64 2d 3e 68 2c 20  ReadFile(id->h, 
1a10: 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c  pBuf, amt, &got,
1a20: 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d   0) ){.    got =
1a30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f   0;.  }.  if( go
1a40: 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  t==(DWORD)amt ){
1a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a60: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a80: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a  E_IOERR;.  }.}..
1a90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1aa0: 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1ab0: 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1ac0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1ad0: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1ae0: 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1af0: 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1b00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
1b10: 73 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69  sWrite(OsFile *i
1b20: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
1b30: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
1b40: 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
1b50: 20 77 72 6f 74 65 3b 0a 20 20 61 73 73 65 72 74   wrote;.  assert
1b60: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
1b70: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b80: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
1b90: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1ba0: 75 6c 6c 45 72 72 6f 72 3b 0a 20 20 54 52 41 43  ullError;.  TRAC
1bb0: 45 33 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63  E3("WRITE %d loc
1bc0: 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  k=%d\n", id->h, 
1bd0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  id->locktype);. 
1be0: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
1bf0: 20 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65   (rc = WriteFile
1c00: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
1c10: 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21 3d  t, &wrote, 0))!=
1c20: 30 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a  0 && wrote>0 ){.
1c30: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1c40: 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
1c50: 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
1c60: 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  e];.  }.  if( !r
1c70: 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72  c || amt>(int)wr
1c80: 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ote ){.    retur
1c90: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1ca0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1cb0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1cc0: 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72  Move the read/wr
1cd0: 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61  ite pointer in a
1ce0: 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   file..*/.int sq
1cf0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 4f 73 46 69  lite3OsSeek(OsFi
1d00: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1d10: 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65  et){.  LONG uppe
1d20: 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 3e 3e  rBits = offset>>
1d30: 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72  32;.  LONG lower
1d40: 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26 20  Bits = offset & 
1d50: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 44 57  0xffffffff;.  DW
1d60: 4f 52 44 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ORD rc;.  assert
1d70: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
1d80: 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30    SEEK(offset/10
1d90: 32 34 20 2b 20 31 29 3b 0a 20 20 72 63 20 3d 20  24 + 1);.  rc = 
1da0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  SetFilePointer(i
1db0: 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  d->h, lowerBits,
1dc0: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
1dd0: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 54 52 41 43  E_BEGIN);.  TRAC
1de0: 45 33 28 22 53 45 45 4b 20 25 64 20 25 6c 6c 64  E3("SEEK %d %lld
1df0: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6f 66 66 73  \n", id->h, offs
1e00: 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  et);.  return SQ
1e10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
1e30: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
1e40: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
1e50: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
1e60: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1e70: 33 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  3OsSync(OsFile *
1e80: 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  id){.  assert( i
1e90: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 54  d->isOpen );.  T
1ea0: 52 41 43 45 33 28 22 53 59 4e 43 20 25 64 20 6c  RACE3("SYNC %d l
1eb0: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68  ock=%d\n", id->h
1ec0: 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b  , id->locktype);
1ed0: 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65  .  if( FlushFile
1ee0: 42 75 66 66 65 72 73 28 69 64 2d 3e 68 29 20 29  Buffers(id->h) )
1ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f00: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f20: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a  TE_IOERR;.  }.}.
1f30: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1f40: 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61  directory zDirna
1f50: 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  me. This is a no
1f60: 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67  -op on operating
1f70: 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a   systems other.*
1f80: 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a  * than UNIX..*/.
1f90: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  int sqlite3OsSyn
1fa0: 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  cDirectory(const
1fb0: 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29   char *zDirname)
1fc0: 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  {.  SimulateIOEr
1fd0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1ff0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2000: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
2010: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
2020: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  fied size.*/.int
2030: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
2040: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  te(OsFile *id, i
2050: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e  64 nByte){.  LON
2060: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42  G upperBits = nB
2070: 79 74 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72  yte>>32;.  asser
2080: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
2090: 0a 20 20 54 52 41 43 45 33 28 22 54 52 55 4e 43  .  TRACE3("TRUNC
20a0: 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20  ATE %d %lld\n", 
20b0: 69 64 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20  id->h, nByte);. 
20c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
20d0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
20e0: 20 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72    SetFilePointer
20f0: 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26  (id->h, nByte, &
2100: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
2110: 42 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64  BEGIN);.  SetEnd
2120: 4f 66 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a 20  OfFile(id->h);. 
2130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2140: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  K;.}../*.** Dete
2150: 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
2160: 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
2170: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e 74   in bytes.*/.int
2180: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
2190: 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ze(OsFile *id, i
21a0: 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57  64 *pSize){.  DW
21b0: 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c  ORD upperBits, l
21c0: 6f 77 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65  owerBits;.  asse
21d0: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
21e0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
21f0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
2200: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
2210: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d   GetFileSize(id-
2220: 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
2230: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 69  .  *pSize = (((i
2240: 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
2250: 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
2260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2270: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
2280: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
2290: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
22a0: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
22b0: 54 2c 20 57 69 6e 32 4b 20 6f 72 20 57 69 6e 58  T, Win2K or WinX
22c0: 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  P..** Return fal
22d0: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
22e0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
22f0: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
2300: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
2310: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
2320: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
2330: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
2340: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
2350: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
2360: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
2370: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
2380: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
2390: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
23a0: 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72 75 6e   call it win run
23b0: 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45  ning Win95/98/ME
23c0: 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  .  A call to.** 
23d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23e0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
23f0: 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73  e if the host is
2400: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a   Win95/98/ME or.
2410: 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  ** WinNT/2K/XP s
2420: 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b  o that we will k
2430: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
2440: 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79  ot we can safely
2450: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63   call.** the Loc
2460: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a  kFileEx() API..*
2470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
2480: 54 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  T(void){.  stati
2490: 63 20 69 6e 74 20 6f 73 54 79 70 65 20 3d 20 30  c int osType = 0
24a0: 3b 20 20 20 2f 2a 20 30 3d 75 6e 6b 6e 6f 77 6e  ;   /* 0=unknown
24b0: 20 31 3d 77 69 6e 39 35 20 32 3d 77 69 6e 4e 54   1=win95 2=winNT
24c0: 20 2a 2f 0a 20 20 69 66 28 20 6f 73 54 79 70 65   */.  if( osType
24d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 56 45 52  ==0 ){.    OSVER
24e0: 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a  SIONINFO sInfo;.
24f0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
2500: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
2510: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
2520: 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28     GetVersionEx(
2530: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 54  &sInfo);.    osT
2540: 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c  ype = sInfo.dwPl
2550: 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c  atformId==VER_PL
2560: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20  ATFORM_WIN32_NT 
2570: 3f 20 32 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 72  ? 2 : 1;.  }.  r
2580: 65 74 75 72 6e 20 6f 73 54 79 70 65 3d 3d 32 3b  eturn osType==2;
2590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
25a0: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
25b0: 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
25c0: 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
25d0: 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
25e0: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
25f0: 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
2600: 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  95 or WinNT..*/.
2610: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
2620: 61 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  adLock(OsFile *i
2630: 64 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  d){.  int res;. 
2640: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
2650: 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
2660: 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  lp;.    ovlp.Off
2670: 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  set = SHARED_FIR
2680: 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ST;.    ovlp.Off
2690: 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20  setHigh = 0;.   
26a0: 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30   ovlp.hEvent = 0
26b0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b  ;.    res = Lock
26c0: 46 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c 4f  FileEx(id->h, LO
26d0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
26e0: 44 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41 52  DIATELY, 0, SHAR
26f0: 45 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70 29  ED_SIZE,0,&ovlp)
2700: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2710: 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
2720: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
2730: 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
2740: 20 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63     id->sharedLoc
2750: 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78  kByte = (lk & 0x
2760: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
2770: 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
2780: 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28   res = LockFile(
2790: 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  id->h, SHARED_FI
27a0: 52 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c 6f  RST+id->sharedLo
27b0: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
27c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27d0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
27e0: 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
27f0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63  static int unloc
2800: 6b 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c 65  kReadLock(OsFile
2810: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 65 73   *id){.  int res
2820: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
2830: 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f  {.    res = Unlo
2840: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48  ckFile(id->h, SH
2850: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
2860: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
2870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73    }else{.    res
2880: 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64   = UnlockFile(id
2890: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
28a0: 54 20 2b 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f  T + id->sharedLo
28b0: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
28c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28d0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  es;.}../*.** Che
28e0: 63 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20  ck that a given 
28f0: 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69  pathname is a di
2900: 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77  rectory and is w
2910: 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69  ritable .**.*/.i
2920: 6e 74 20 73 71 6c 69 74 65 33 4f 73 49 73 44 69  nt sqlite3OsIsDi
2930: 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a  rWritable(char *
2940: 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 66 69 6c  zBuf){.  int fil
2950: 65 41 74 74 72 3b 0a 20 20 69 66 28 21 20 7a 42  eAttr;.  if(! zB
2960: 75 66 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  uf ) return 0;. 
2970: 20 69 66 28 21 20 69 73 4e 54 28 29 20 26 26 20   if(! isNT() && 
2980: 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3e 20 4d  strlen(zBuf) > M
2990: 41 58 5f 50 41 54 48 20 29 20 72 65 74 75 72 6e  AX_PATH ) return
29a0: 20 30 3b 0a 20 20 66 69 6c 65 41 74 74 72 20 3d   0;.  fileAttr =
29b0: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
29c0: 65 73 41 28 7a 42 75 66 29 3b 0a 20 20 69 66 28  esA(zBuf);.  if(
29d0: 20 66 69 6c 65 41 74 74 72 20 3d 3d 20 30 78 66   fileAttr == 0xf
29e0: 66 66 66 66 66 66 66 20 29 20 72 65 74 75 72 6e  fffffff ) return
29f0: 20 30 3b 0a 20 20 69 66 28 20 28 66 69 6c 65 41   0;.  if( (fileA
2a00: 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
2a10: 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20  BUTE_DIRECTORY) 
2a20: 21 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54  != FILE_ATTRIBUT
2a30: 45 5f 44 49 52 45 43 54 4f 52 59 20 29 20 72 65  E_DIRECTORY ) re
2a40: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2a50: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   1;.}.../*.** Lo
2a60: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
2a70: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
2a80: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2a90: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
2aa0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
2ab0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
2ac0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
2ad0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
2ae0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
2af0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
2b00: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
2b10: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
2b20: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
2b30: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
2b40: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
2b50: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
2b60: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
2b70: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
2b80: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
2b90: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
2ba0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
2bb0: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
2bc0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
2bd0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
2be0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
2bf0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
2c00: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
2c10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
2c20: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
2c30: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
2c40: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
2c50: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
2c60: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
2c70: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
2c80: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
2c90: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
2ca0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
2cb0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
2cc0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
2cd0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
2ce0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
2cf0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
2d00: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
2d10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2d20: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
2d30: 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 73 71 6c  a lock.  The sql
2d40: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 72  ite3OsUnlock() r
2d50: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
2d60: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
2d70: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
2d80: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
2d90: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
2da0: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
2db0: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
2dc0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
2dd0: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
2de0: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
2df0: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
2e00: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
2e10: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
2e20: 65 33 4f 73 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  e3OsLock(OsFile 
2e30: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
2e40: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2e50: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20  QLITE_OK;    /* 
2e60: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
2e70: 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a   subroutines */.
2e80: 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
2e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2ea0: 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f 77 73 20  lt of a windows 
2eb0: 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69  lock call */.  i
2ec0: 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20  nt newLocktype; 
2ed0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 64 2d        /* Set id-
2ee0: 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
2ef0: 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
2f00: 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
2f10: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
2f20: 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
2f30: 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
2f40: 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
2f50: 6d 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  me */..  assert(
2f60: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20   id->isOpen );. 
2f70: 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 25 64   TRACE5("LOCK %d
2f80: 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
2f90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 64 2d  ",.          id-
2fa0: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 69 64  >h, locktype, id
2fb0: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 69 64 2d 3e  ->locktype, id->
2fc0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b  sharedLockByte);
2fd0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2fe0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
2ff0: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
3000: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
3010: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
3020: 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
3030: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
3040: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
3050: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
3060: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
3070: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
3080: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
3090: 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 74  .  if( id->lockt
30a0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
30b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30c0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
30d0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
30e0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
30f0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
3100: 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f    assert( id->lo
3110: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
3120: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
3130: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
3140: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
3150: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
3160: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
3170: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
3180: 4b 20 7c 7c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  K || id->locktyp
3190: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
31a0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
31b0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
31c0: 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
31d0: 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
31e0: 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
31f0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
3200: 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
3210: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
3220: 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
3230: 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
3240: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
3250: 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
3260: 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
3270: 65 20 3d 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  e = id->locktype
3280: 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b  ;.  if( id->lock
3290: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20  type==NO_LOCK.  
32a0: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
32b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
32c0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52   id->locktype==R
32d0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20  ESERVED_LOCK).  
32e0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
32f0: 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
3300: 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
3310: 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c   LockFile(id->h,
3320: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
3330: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
3340: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
3350: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
3360: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
3370: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d  e pending lock m
3380: 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a  ight be.      **
3390: 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
33a0: 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20   reader process 
33b0: 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  who will release
33c0: 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e   it momentarily.
33d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33e0: 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f  TRACE2("could no
33f0: 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20  t get a PENDING 
3400: 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c  lock. cnt=%d\n",
3410: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c 65   cnt);.      Sle
3420: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
3430: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
3440: 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = res;.  }..  /*
3450: 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
3460: 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
3470: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
3480: 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
3490: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  {.    assert( id
34a0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
34b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
34c0: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 69 64 29   getReadLock(id)
34d0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
34e0: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
34f0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
3500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3510: 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
3520: 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
3530: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
3540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
3550: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
3560: 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d  t( id->locktype=
3570: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
3580: 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69      res = LockFi
3590: 6c 65 28 69 64 2d 3e 68 2c 20 52 45 53 45 52 56  le(id->h, RESERV
35a0: 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
35b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
35c0: 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
35d0: 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
35e0: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OCK;.    }.  }..
35f0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50    /* Acquire a P
3600: 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f  ENDING lock.  */
3610: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
3620: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
3630: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65  && res ){.    ne
3640: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  wLocktype = PEND
3650: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f  ING_LOCK;.    go
3660: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
3670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
3680: 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
3690: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
36a0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
36b0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
36c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
36d0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  id->locktype>=SH
36e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
36f0: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
3700: 64 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 20 20 54  dLock(id);.    T
3710: 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c 6f 63  RACE2("unreadloc
3720: 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 3b  k = %d\n", res);
3730: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
3740: 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52 45  ile(id->h, SHARE
3750: 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
3760: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
3770: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
3780: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
3790: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
37a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37b0: 20 54 52 41 43 45 32 28 22 65 72 72 6f 72 2d 63   TRACE2("error-c
37c0: 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 47 65 74  ode = %d\n", Get
37d0: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20  LastError());.  
37e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
37f0: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
3800: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
3810: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
3820: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
3830: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
3840: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
3850: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
3860: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
3870: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  D_LOCK ){.    Un
3880: 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20  lockFile(id->h, 
3890: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
38a0: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
38b0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
38c0: 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
38d0: 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
38e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
38f0: 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
3900: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
3910: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
3920: 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
3930: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
3940: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
3950: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 46 41 49  TRACE4("LOCK FAI
3960: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
3970: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
3980: 6e 22 2c 20 69 64 2d 3e 68 2c 0a 20 20 20 20 20  n", id->h,.     
3990: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20        locktype, 
39a0: 6e 65 77 4c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  newLocktype);.  
39b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
39c0: 53 59 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f  SY;.  }.  id->lo
39d0: 63 6b 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63 6b  cktype = newLock
39e0: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
39f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
3a00: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
3a10: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
3a20: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
3a30: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
3a40: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
3a50: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
3a60: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
3a70: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
3a80: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
3a90: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
3aa0: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
3ab0: 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
3ac0: 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  dLock(OsFile *id
3ad0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
3ae0: 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65  ssert( id->isOpe
3af0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c  n );.  if( id->l
3b00: 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
3b10: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
3b20: 20 3d 20 31 3b 0a 20 20 20 20 54 52 41 43 45 33   = 1;.    TRACE3
3b30: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
3b40: 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
3b50: 20 69 64 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d   id->h, rc);.  }
3b60: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c  else{.    rc = L
3b70: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52  ockFile(id->h, R
3b80: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
3b90: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
3ba0: 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f  rc ){.      Unlo
3bb0: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52 45  ckFile(id->h, RE
3bc0: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
3bd0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
3be0: 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 54   rc = !rc;.    T
3bf0: 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c  RACE3("TEST WR-L
3c00: 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74  OCK %d %d (remot
3c10: 65 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 72 63  e)\n", id->h, rc
3c20: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3c30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
3c40: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
3c50: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
3c60: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
3c70: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
3c80: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
3c90: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
3ca0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
3cb0: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
3cc0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
3cd0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
3ce0: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
3cf0: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
3d00: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
3d10: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
3d20: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
3d30: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
3d40: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
3d50: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
3d60: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
3d70: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
3d80: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
3d90: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
3da0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
3db0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
3dc0: 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
3dd0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
3de0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  int sqlite3OsUnl
3df0: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
3e00: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
3e10: 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 69 6e 74   int type;.  int
3e20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3e30: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69  .  assert( id->i
3e40: 73 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65 72  sOpen );.  asser
3e50: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
3e60: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 54 52  RED_LOCK );.  TR
3e70: 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE5("UNLOCK %d 
3e80: 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
3e90: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b  \n", id->h, lock
3ea0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
3eb0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 69 64  id->locktype, id
3ec0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
3ed0: 29 3b 0a 20 20 74 79 70 65 20 3d 20 69 64 2d 3e  );.  type = id->
3ee0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
3ef0: 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
3f00: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
3f10: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48  ckFile(id->h, SH
3f20: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
3f30: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
3f40: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
3f50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
3f60: 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 69 64   !getReadLock(id
3f70: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
3f80: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
3f90: 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
3fa0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
3fb0: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
3fc0: 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
3fd0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
3fe0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
3ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4000: 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  ( type>=RESERVED
4010: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
4020: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52  ockFile(id->h, R
4030: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
4040: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
4050: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
4060: 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
4070: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
4080: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 69  unlockReadLock(i
4090: 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  d);.  }.  if( ty
40a0: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
40b0: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
40c0: 6c 65 28 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e  le(id->h, PENDIN
40d0: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
40e0: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b  ;.  }.  id->lock
40f0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
4100: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4110: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72  ./*.** Get infor
4120: 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74  mation to seed t
4130: 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
4140: 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65   generator.  The
4150: 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74   seed.** is writ
4160: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ten into the buf
4170: 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20  fer zBuf[256].  
4180: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
4190: 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70  tion must.** sup
41a0: 70 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74  ply a sufficient
41b0: 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e  ly large buffer.
41c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
41d0: 73 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  sRandomSeed(char
41e0: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65   *zBuf){.  /* We
41f0: 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
4200: 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
4210: 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
4220: 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
4230: 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
4240: 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
4250: 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
4260: 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
4270: 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
4280: 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
4290: 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
42a0: 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
42b0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
42c0: 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
42d0: 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
42e0: 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
42f0: 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
4300: 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
4310: 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
4320: 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
4330: 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
4340: 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
4350: 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
4360: 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
4370: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
4380: 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
4390: 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
43a0: 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
43b0: 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
43c0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
43d0: 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
43e0: 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
43f0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
4400: 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
4410: 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
4420: 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 2a 20  mber sequence.* 
4430: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
4440: 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
4450: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
4460: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36  set(zBuf, 0, 256
4470: 29 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  );.  GetSystemTi
4480: 6d 65 28 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  me((LPSYSTEMTIME
4490: 29 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e  )zBuf);.  return
44a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
44b0: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
44c0: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
44d0: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
44e0: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
44f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
4500: 73 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  sSleep(int ms){.
4510: 20 20 53 6c 65 65 70 28 6d 73 29 3b 0a 20 20 72    Sleep(ms);.  r
4520: 65 74 75 72 6e 20 6d 73 3b 0a 7d 0a 0a 2f 2a 0a  eturn ms;.}../*.
4530: 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69 61 62  ** Static variab
4540: 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74 68 72  les used for thr
4550: 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74  ead synchronizat
4560: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
4570: 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23  t inMutex = 0;.#
4580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32  ifdef SQLITE_W32
4590: 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69  _THREADS.  stati
45a0: 63 20 43 52 49 54 49 43 41 4c 5f 53 45 43 54 49  c CRITICAL_SECTI
45b0: 4f 4e 20 63 73 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ON cs;.#endif../
45c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
45d0: 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69  ng pair of routi
45e0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74  ne implement mut
45f0: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f  ual exclusion fo
4600: 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  r.** multi-threa
4610: 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20  ded processes.  
4620: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68  Only a single th
4630: 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20  read is allowed 
4640: 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63  to.** executed c
4650: 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72  ode that is surr
4660: 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d  ounded by EnterM
4670: 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65  utex() and Leave
4680: 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53  Mutex()..**.** S
4690: 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20  QLite uses only 
46a0: 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20  a single Mutex. 
46b0: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   There is not mu
46c0: 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63  ch critical.** c
46d0: 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74  ode and what lit
46e0: 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65  tle there is exe
46f0: 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e  cutes quickly an
4700: 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69  d without blocki
4710: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
4720: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
4730: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
4740: 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 73  _W32_THREADS.  s
4750: 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74  tatic int isInit
4760: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
4770: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 74  isInit ){.    st
4780: 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d  atic long lock =
4790: 20 30 3b 0a 20 20 20 20 69 66 28 20 49 6e 74 65   0;.    if( Inte
47a0: 72 6c 6f 63 6b 65 64 49 6e 63 72 65 6d 65 6e 74  rlockedIncrement
47b0: 28 26 6c 6f 63 6b 29 3d 3d 31 20 29 7b 0a 20 20  (&lock)==1 ){.  
47c0: 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 72      InitializeCr
47d0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
47e0: 73 29 3b 0a 20 20 20 20 20 20 69 73 49 6e 69 74  s);.      isInit
47f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
4800: 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b  .      Sleep(1);
4810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 45 6e 74  .    }.  }.  Ent
4820: 65 72 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f  erCriticalSectio
4830: 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66 0a 20  n(&cs);.#endif. 
4840: 20 61 73 73 65 72 74 28 20 21 69 6e 4d 75 74 65   assert( !inMute
4850: 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d  x );.  inMutex =
4860: 20 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   1;.}.void sqlit
4870: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
4880: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75  {.  assert( inMu
4890: 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78  tex );.  inMutex
48a0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
48b0: 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a  ITE_W32_THREADS.
48c0: 20 20 4c 65 61 76 65 43 72 69 74 69 63 61 6c 53    LeaveCriticalS
48d0: 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e  ection(&cs);.#en
48e0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  dif.}../*.** Tur
48f0: 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
4900: 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
4910: 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  l pathname.  Ret
4920: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
4930: 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74   to the full pat
4940: 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20  hname stored in 
4950: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
4960: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4970: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  ()..** The calli
4980: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ng function is r
4990: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
49a0: 72 65 65 69 6e 67 20 74 68 69 73 20 73 70 61 63  reeing this spac
49b0: 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20  e once it.** is 
49c0: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64  no longer needed
49d0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
49e0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
49f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
4a00: 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20  lative){.  char 
4a10: 2a 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 63 68 61  *zNotUsed;.  cha
4a20: 72 20 2a 7a 46 75 6c 6c 3b 0a 20 20 69 6e 74 20  r *zFull;.  int 
4a30: 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74 65 20 3d  nByte;.  nByte =
4a40: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
4a50: 41 28 7a 52 65 6c 61 74 69 76 65 2c 20 30 2c 20  A(zRelative, 0, 
4a60: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 20 2b 20  0, &zNotUsed) + 
4a70: 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 73 71 6c  1;.  zFull = sql
4a80: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
4a90: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   );.  if( zFull=
4aa0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ab0: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
4ac0: 41 28 7a 52 65 6c 61 74 69 76 65 2c 20 6e 42 79  A(zRelative, nBy
4ad0: 74 65 2c 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f 74  te, zFull, &zNot
4ae0: 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
4af0: 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zFull;.}../*.** 
4b00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
4b10: 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
4b20: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
4b30: 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ue, becomes the 
4b40: 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e  result.** return
4b50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  ed from sqlite3O
4b60: 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20  sCurrentTime(). 
4b70: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
4b80: 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  r testing..*/.#i
4b90: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4ba0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
4bb0: 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
4bc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
4bd0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
4be0: 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
4bf0: 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
4c00: 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
4c10: 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
4c20: 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
4c30: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
4c40: 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
4c50: 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
4c60: 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
4c70: 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
4c80: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
4c90: 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  nt sqlite3OsCurr
4ca0: 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a  entTime(double *
4cb0: 70 72 4e 6f 77 29 7b 0a 20 20 46 49 4c 45 54 49  prNow){.  FILETI
4cc0: 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45  ME ft;.  /* FILE
4cd0: 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
4ce0: 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
4cf0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
4d00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  e number of .   
4d10: 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64    100-nanosecond
4d20: 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65   intervals since
4d30: 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31   January 1, 1601
4d40: 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35   (= JD 2305813.5
4d50: 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62 6c  ). .  */.  doubl
4d60: 65 20 6e 6f 77 3b 0a 20 20 47 65 74 53 79 73 74  e now;.  GetSyst
4d70: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4d80: 28 20 26 66 74 20 29 3b 0a 20 20 6e 6f 77 20 3d  ( &ft );.  now =
4d90: 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48   ((double)ft.dwH
4da0: 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34  ighDateTime) * 4
4db0: 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20  294967296.0; .  
4dc0: 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20  *prNow = (now + 
4dd0: 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
4de0: 29 2f 38 36 34 30 30 30 30 30 30 30 30 30 2e 30  )/864000000000.0
4df0: 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 69   + 2305813.5;.#i
4e00: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4e10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
4e20: 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
4e30: 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
4e40: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
4e50: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
4e60: 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
4e70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4e80: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  /*.** Find the t
4e90: 69 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ime that the fil
4ea0: 65 20 77 61 73 20 6c 61 73 74 20 6d 6f 64 69 66  e was last modif
4eb0: 69 65 64 2e 20 20 57 72 69 74 65 20 74 68 65 0a  ied.  Write the.
4ec0: 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
4ed0: 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
4ee0: 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
4ef0: 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
4f00: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 53   and.** return S
4f10: 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
4f20: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
4f30: 66 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69  f the modificati
4f40: 6f 6e 0a 2a 2a 20 74 69 6d 65 20 63 61 6e 6e 6f  on.** time canno
4f50: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
4f60: 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  nt sqlite3OsFile
4f70: 4d 6f 64 54 69 6d 65 28 4f 73 46 69 6c 65 20 2a  ModTime(OsFile *
4f80: 69 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4d 54  id, double *prMT
4f90: 69 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ime){.  int rc;.
4fa0: 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
4fb0: 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
4fc0: 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
4fd0: 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
4fe0: 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
4ff0: 20 6f 66 20 0a 20 20 2a 2a 20 31 30 30 2d 6e 61   of .  ** 100-na
5000: 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
5010: 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
5020: 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
5030: 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
5040: 0a 20 20 69 66 28 20 47 65 74 46 69 6c 65 54 69  .  if( GetFileTi
5050: 6d 65 28 69 64 2d 3e 68 2c 20 30 2c 20 30 2c 20  me(id->h, 0, 0, 
5060: 26 66 74 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  &ft) ){.    doub
5070: 6c 65 20 74 3b 0a 20 20 20 20 74 20 3d 20 28 28  le t;.    t = ((
5080: 64 6f 75 62 6c 65 29 66 74 2e 64 77 48 69 67 68  double)ft.dwHigh
5090: 44 61 74 65 54 69 6d 65 29 20 2a 20 34 32 39 34  DateTime) * 4294
50a0: 39 36 37 32 39 36 2e 30 3b 20 0a 20 20 20 20 2a  967296.0; .    *
50b0: 70 72 4d 54 69 6d 65 20 3d 20 28 74 20 2b 20 66  prMTime = (t + f
50c0: 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
50d0: 2f 38 36 34 30 30 30 30 30 30 30 30 30 2e 30 20  /864000000000.0 
50e0: 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a 20 20 20  + 2305813.5;.   
50f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5100: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
5110: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5120: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5130: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
5140: 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.