/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 5d282b4fb2afdeefd0857357206510e72192302c:


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 23 69 66 64 65 66 20 5f 5f 43 59 47  h>..#ifdef __CYG
0240: 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20  WIN__.# include 
0250: 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23  <sys/cygwin.h>.#
0260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  endif../*.** Mac
0270: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0280: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0290: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
02a0: 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ads..*/.#if defi
02b0: 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20  ned(THREADSAFE) 
02c0: 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20  && THREADSAFE.# 
02d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 33  define SQLITE_W3
02e0: 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  2_THREADS 1.#end
02f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0300: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0310: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
0320: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0330: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0340: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  .h"../*.** Do no
0350: 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66  t include any of
0360: 20 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e   the File I/O in
0370: 74 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72  terface procedur
0380: 65 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c  es if the.** SQL
0390: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
03a0: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
03b0: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61   (indicating tha
03c0: 74 20 74 68 65 72 65 20 64 61 74 61 62 61 73 65  t there database
03d0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d  .** will be in-m
03e0: 65 6d 6f 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23  emory only).*/.#
03f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0400: 49 54 5f 44 49 53 4b 49 4f 0a 0a 2f 2a 0a 2a 2a  IT_DISKIO../*.**
0410: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
0420: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
0430: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
0440: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
0450: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
0460: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
0470: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
0480: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
0490: 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  5.** or WinNT..*
04a0: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
04b0: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
04c0: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
04d0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
04e0: 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win95..** 2:   O
04f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0500: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
0510: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
0520: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
0530: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
0540: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
0550: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
0560: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
0570: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
0580: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
0590: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
05a0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 0a 2f  _os_type = 0;../
05b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
05c0: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
05d0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
05e0: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
05f0: 20 6f 72 20 57 69 6e 58 50 2e 0a 2a 2a 20 52 65   or WinXP..** Re
0600: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
0610: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
0620: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
0630: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
0640: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
0650: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
0660: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
0670: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
0680: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
0690: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
06a0: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
06b0: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
06c0: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
06d0: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
06e0: 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e   win running Win
06f0: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
0700: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
0710: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
0720: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
0730: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
0740: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
0750: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
0760: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
0770: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
0780: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
0790: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
07a0: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ) API..*/.static
07b0: 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b   int isNT(void){
07c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f  .  if( sqlite3_o
07d0: 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  s_type==0 ){.   
07e0: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73   OSVERSIONINFO s
07f0: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
0800: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
0810: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
0820: 66 6f 29 3b 0a 20 20 20 20 47 65 74 56 65 72 73  fo);.    GetVers
0830: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
0840: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79     sqlite3_os_ty
0850: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61  pe = sInfo.dwPla
0860: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41  tformId==VER_PLA
0870: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f  TFORM_WIN32_NT ?
0880: 20 32 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 72 65   2 : 1;.  }.  re
0890: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f  turn sqlite3_os_
08a0: 74 79 70 65 3d 3d 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  type==2;.}../*.*
08b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
08c0: 38 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  8 string to UTF-
08d0: 33 32 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  32.  Space to ho
08e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
08f0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
0900: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
0910: 65 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74  eMalloc..*/.stat
0920: 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54 6f  ic WCHAR *utf8To
0930: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
0940: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
0950: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57    int nByte;.  W
0960: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e  CHAR *zWideFilen
0970: 61 6d 65 3b 0a 0a 20 20 69 66 28 20 21 69 73 4e  ame;..  if( !isN
0980: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T() ){.    retur
0990: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
09a0: 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
09b0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
09c0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
09d0: 2c 20 4e 55 4c 4c 2c 20 30 29 2a 73 69 7a 65 6f  , NULL, 0)*sizeo
09e0: 66 28 57 43 48 41 52 29 3b 0a 20 20 7a 57 69 64  f(WCHAR);.  zWid
09f0: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  eFilename = sqli
0a00: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  teMalloc( nByte*
0a10: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
0a20: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
0a30: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
0a40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
0a50: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
0a60: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
0a70: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
0a80: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
0a90: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
0aa0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
0ab0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
0ac0: 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 46 69  liteFree(zWideFi
0ad0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
0ae0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
0af0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
0b00: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
0b10: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46  *.** Convert UTF
0b20: 2d 33 32 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  -32 to UTF-8.  S
0b30: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
0b40: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
0b50: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
0b60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
0b70: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
0b80: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74  har *unicodeToUt
0b90: 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a  f8(const WCHAR *
0ba0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
0bb0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
0bc0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
0bd0: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
0be0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
0bf0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
0c00: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
0c10: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69   0, 0, 0);.  zFi
0c20: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d  lename = sqliteM
0c30: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
0c40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
0c50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
0c60: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
0c70: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
0c80: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
0c90: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
0ca0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
0cb0: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
0ce0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
0cf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
0d00: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
0d10: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
0d20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
0d30: 6e 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  name;.}.../*.** 
0d40: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
0d50: 20 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20   file.*/.static 
0d60: 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 63 6f  int winDelete(co
0d70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0d80: 61 6d 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a  ame){.  WCHAR *z
0d90: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
0da0: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
0db0: 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a  .  if( zWide ){.
0dc0: 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28      DeleteFileW(
0dd0: 7a 57 69 64 65 29 3b 0a 20 20 20 20 73 71 6c 69  zWide);.    sqli
0de0: 74 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20  teFree(zWide);. 
0df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 6c 65   }else{.    Dele
0e00: 74 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d  teFileA(zFilenam
0e10: 65 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  e);.  }.  TRACE2
0e20: 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c  ("DELETE \"%s\"\
0e30: 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  n", zFilename);.
0e40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0e50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
0e60: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
0e70: 6e 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74  named file exist
0e80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
0e90: 20 77 69 6e 46 69 6c 65 45 78 69 73 74 73 28 63   winFileExists(c
0ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0eb0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 65 78 69  name){.  int exi
0ec0: 73 74 73 20 3d 20 30 3b 0a 20 20 57 43 48 41 52  sts = 0;.  WCHAR
0ed0: 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f   *zWide = utf8To
0ee0: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
0ef0: 65 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20  e);.  if( zWide 
0f00: 29 7b 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20  ){.    exists = 
0f10: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
0f20: 73 57 28 7a 57 69 64 65 29 20 21 3d 20 30 78 66  sW(zWide) != 0xf
0f30: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 73 71 6c  fffffff;.    sql
0f40: 69 74 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a  iteFree(zWide);.
0f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 69    }else{.    exi
0f60: 73 74 73 20 3d 20 47 65 74 46 69 6c 65 41 74 74  sts = GetFileAtt
0f70: 72 69 62 75 74 65 73 41 28 7a 46 69 6c 65 6e 61  ributesA(zFilena
0f80: 6d 65 29 20 21 3d 20 30 78 66 66 66 66 66 66 66  me) != 0xfffffff
0f90: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
0fa0: 65 78 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  exists;.}../*.**
0fb0: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
0fc0: 20 61 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68   a file for both
0fd0: 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
0fe0: 74 69 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a  ting.  If that.*
0ff0: 2a 20 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65  * fails, try ope
1000: 6e 69 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c  ning it read-onl
1010: 79 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  y.  If the file 
1020: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a  does not exist,.
1030: 2a 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ** try to create
1040: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75   it..**.** On su
1050: 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20  ccess, a handle 
1060: 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c  for the open fil
1070: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
1080: 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61  *id.** and *pRea
1090: 64 6f 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20  donly is set to 
10a0: 30 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  0 if the file wa
10b0: 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  s opened for rea
10c0: 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74  ding and.** writ
10d0: 69 6e 67 20 6f 72 20 31 20 69 66 20 74 68 65 20  ing or 1 if the 
10e0: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
10f0: 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20  read-only.  The 
1100: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1110: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
1120: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
1130: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
1140: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
1150: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
1160: 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65  .** *id and *pRe
1170: 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64  adonly unchanged
1180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1190: 77 69 6e 4f 70 65 6e 52 65 61 64 57 72 69 74 65  winOpenReadWrite
11a0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
11b0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46  zFilename,.  OsF
11c0: 69 6c 65 20 2a 69 64 2c 0a 20 20 69 6e 74 20 2a  ile *id,.  int *
11d0: 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 48  pReadonly.){.  H
11e0: 41 4e 44 4c 45 20 68 3b 0a 20 20 57 43 48 41 52  ANDLE h;.  WCHAR
11f0: 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f   *zWide = utf8To
1200: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
1210: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69  e);.  assert( !i
1220: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69  d->isOpen );.  i
1230: 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20  f( zWide ){.    
1240: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
1250: 7a 57 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45  zWide,.       GE
1260: 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
1270: 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
1280: 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45     FILE_SHARE_RE
1290: 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
12a0: 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 4e 55  WRITE,.       NU
12b0: 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f  LL,.       OPEN_
12c0: 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 46  ALWAYS,.       F
12d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
12e0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
12f0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
1300: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
1310: 29 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 49 4e  );.    if( h==IN
1320: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1330: 55 45 20 29 7b 0a 20 20 20 20 20 20 68 20 3d 20  UE ){.      h = 
1340: 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57 69 64  CreateFileW(zWid
1350: 65 2c 0a 20 20 20 20 20 20 20 20 20 47 45 4e 45  e,.         GENE
1360: 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  RIC_READ,.      
1370: 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45     FILE_SHARE_RE
1380: 41 44 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c  AD,.         NUL
1390: 4c 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 45 4e  L,.         OPEN
13a0: 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20  _ALWAYS,.       
13b0: 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
13c0: 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46  _NORMAL | FILE_F
13d0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
13e0: 53 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  S,.         NULL
13f0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1400: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
1410: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
1420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1430: 65 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 20 20  e(zWide);.      
1440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1450: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
1460: 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e  }.      *pReadon
1470: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ly = 1;.    }els
1480: 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f  e{.      *pReado
1490: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nly = 0;.    }. 
14a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57     sqliteFree(zW
14b0: 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ide);.  }else{. 
14c0: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
14d0: 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  eA(zFilename,.  
14e0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
14f0: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1500: 45 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53  E,.       FILE_S
1510: 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1520: 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20  _SHARE_WRITE,.  
1530: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1540: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
1550: 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
1560: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
1570: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1580: 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55  CCESS,.       NU
1590: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  LL.    );.    if
15a0: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
15b0: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
15c0: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
15d0: 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  eA(zFilename,.  
15e0: 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52         GENERIC_R
15f0: 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 46 49  EAD,.         FI
1600: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c 0a 20  LE_SHARE_READ,. 
1610: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
1620: 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41         OPEN_ALWA
1630: 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c  YS,.         FIL
1640: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
1650: 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  AL | FILE_FLAG_R
1660: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20  ANDOM_ACCESS,.  
1670: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
1680: 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68    );.      if( h
1690: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
16a0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
16b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16c0: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
16d0: 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e  }.      *pReadon
16e0: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ly = 1;.    }els
16f0: 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f  e{.      *pReado
1700: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nly = 0;.    }. 
1710: 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a   }.  id->h = h;.
1720: 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d    id->locktype =
1730: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d 3e   NO_LOCK;.  id->
1740: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
1750: 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e   0;.  id->isOpen
1760: 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e   = 1;.  OpenCoun
1770: 74 65 72 28 2b 31 29 3b 0a 20 20 54 52 41 43 45  ter(+1);.  TRACE
1780: 33 28 22 4f 50 45 4e 20 52 2f 57 20 25 64 20 5c  3("OPEN R/W %d \
1790: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
17a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
17b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17c0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17d0: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
17e0: 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  e for exclusive 
17f0: 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70  access by this p
1800: 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66  rocess..** The f
1810: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ile will be open
1820: 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
1830: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
1840: 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20    To avoid.** a 
1850: 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69  potential securi
1860: 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ty problem, we d
1870: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
1880: 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20  file to have.** 
1890: 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74  previously exist
18a0: 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61  ed.  Nor do we a
18b0: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
18c0: 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a   be a symbolic.*
18d0: 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  * link..**.** If
18e0: 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65   delFlag is true
18f0: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61  , then make arra
1900: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f  ngements to auto
1910: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
1920: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65  .** the file whe
1930: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
1940: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
1950: 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  , write the file
1960: 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64   handle into *id
1970: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1980: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
1990: 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  failure, return 
19a0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
19b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19c0: 69 6e 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  inOpenExclusive(
19d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
19e0: 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69  ename, OsFile *i
19f0: 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b  d, int delFlag){
1a00: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 69  .  HANDLE h;.  i
1a10: 6e 74 20 66 69 6c 65 66 6c 61 67 73 3b 0a 20 20  nt fileflags;.  
1a20: 57 43 48 41 52 20 2a 7a 57 69 64 65 20 3d 20 75  WCHAR *zWide = u
1a30: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1a40: 6c 65 6e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72  lename);.  asser
1a50: 74 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29  t( !id->isOpen )
1a60: 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20  ;.  if( delFlag 
1a70: 29 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73  ){.    fileflags
1a80: 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
1a90: 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 46 49  E_TEMPORARY | FI
1aa0: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1ab0: 43 43 45 53 53 20 0a 20 20 20 20 20 20 20 20 20  CCESS .         
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
1ad0: 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
1ae0: 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 65 6c 73 65  N_CLOSE;.  }else
1af0: 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73 20  {.    fileflags 
1b00: 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
1b10: 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  OM_ACCESS;.  }. 
1b20: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20   if( zWide ){.  
1b30: 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65    h = CreateFile
1b40: 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20 20  W(zWide,.       
1b50: 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
1b60: 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20  ENERIC_WRITE,.  
1b70: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 4e       0,.       N
1b80: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43 52 45 41  ULL,.       CREA
1b90: 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20  TE_ALWAYS,.     
1ba0: 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20 20    fileflags,.   
1bb0: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
1bc0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1bd0: 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Wide);.  }else{.
1be0: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
1bf0: 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  leA(zFilename,. 
1c00: 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45        GENERIC_RE
1c10: 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
1c20: 54 45 2c 0a 20 20 20 20 20 20 20 30 2c 0a 20 20  TE,.       0,.  
1c30: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1c40: 20 20 43 52 45 41 54 45 5f 41 4c 57 41 59 53 2c    CREATE_ALWAYS,
1c50: 0a 20 20 20 20 20 20 20 66 69 6c 65 66 6c 61 67  .       fileflag
1c60: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
1c70: 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20     );.  }.  if( 
1c80: 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
1c90: 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 72  E_VALUE ){.    r
1ca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
1cb0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d  TOPEN;.  }.  id-
1cc0: 3e 68 20 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f  >h = h;.  id->lo
1cd0: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
1ce0: 3b 0a 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f  ;.  id->sharedLo
1cf0: 63 6b 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 64  ckByte = 0;.  id
1d00: 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  ->isOpen = 1;.  
1d10: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
1d20: 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20  .  TRACE3("OPEN 
1d30: 45 58 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  EX %d \"%s\"\n",
1d40: 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a   h, zFilename);.
1d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
1d70: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
1d80: 65 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ew file for read
1d90: 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a  -only access..**
1da0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
1db0: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
1dc0: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
1dd0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1de0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
1df0: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
1e00: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
1e10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1e20: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e  OpenReadOnly(con
1e30: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1e40: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 29 7b  me, OsFile *id){
1e50: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 57  .  HANDLE h;.  W
1e60: 43 48 41 52 20 2a 7a 57 69 64 65 20 3d 20 75 74  CHAR *zWide = ut
1e70: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
1e80: 65 6e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74  ename);.  assert
1e90: 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  ( !id->isOpen );
1ea0: 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a  .  if( zWide ){.
1eb0: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
1ec0: 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20  leW(zWide,.     
1ed0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a    GENERIC_READ,.
1ee0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
1ef0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50   NULL,.       OP
1f00: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20  EN_EXISTING,.   
1f10: 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
1f20: 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45  TE_NORMAL | FILE
1f30: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
1f40: 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  ESS,.       NULL
1f50: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1f60: 74 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20  teFree(zWide);. 
1f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20   }else{.    h = 
1f80: 43 72 65 61 74 65 46 69 6c 65 41 28 7a 46 69 6c  CreateFileA(zFil
1f90: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 47 45  ename,.       GE
1fa0: 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20  NERIC_READ,.    
1fb0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c     0,.       NUL
1fc0: 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45  L,.       OPEN_E
1fd0: 58 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20  XISTING,.       
1fe0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1ff0: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
2000: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
2010: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20  .       NULL.   
2020: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d   );.  }.  if( h=
2030: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
2040: 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74  VALUE ){.    ret
2050: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2060: 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68  PEN;.  }.  id->h
2070: 20 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b   = h;.  id->lock
2080: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
2090: 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b    id->sharedLock
20a0: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e  Byte = 0;.  id->
20b0: 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 4f 70  isOpen = 1;.  Op
20c0: 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
20d0: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 52 4f   TRACE3("OPEN RO
20e0: 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68   %d \"%s\"\n", h
20f0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
2120: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
2130: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2140: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
2150: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
2160: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
2170: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
2180: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
2190: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
21a0: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
21b0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
21c0: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
21d0: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
21e0: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
21f0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
2200: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2210: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
2220: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
2230: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
2240: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
2250: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
2260: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
2270: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2280: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
2290: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70   a previously op
22a0: 65 6e 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69  en file is at *i
22b0: 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20  d is.** updated 
22c0: 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72  with the new dir
22d0: 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
22e0: 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54  riptor and SQLIT
22f0: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
2300: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  ned..**.** On fa
2310: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
2320: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2330: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
2340: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e  leaves.** *id un
2350: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
2360: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 44 69  ic int winOpenDi
2370: 72 65 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74  rectory(.  const
2380: 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 2c   char *zDirname,
2390: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 0a 29 7b  .  OsFile *id.){
23a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
23c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   the following g
23d0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70  lobal variable p
23e0: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
23f0: 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a  g which is the.*
2400: 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  * name of a dire
2410: 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74  ctory, then that
2420: 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20   directory will 
2430: 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  be used to store
2440: 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69  .** temporary fi
2450: 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  les..*/.char *sq
2460: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2470: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
2480: 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
2490: 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
24a0: 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
24b0: 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
24c0: 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65  to.** hold at le
24d0: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
24e0: 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74  AME_SIZE charact
24f0: 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
2500: 6e 74 20 77 69 6e 54 65 6d 70 46 69 6c 65 4e 61  nt winTempFileNa
2510: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
2520: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
2530: 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
2540: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
2550: 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
2560: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
2570: 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
2580: 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69  0123456789";.  i
2590: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
25a0: 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45  zTempPath[SQLITE
25b0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
25c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
25d0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
25e0: 0a 20 20 20 20 73 74 72 6e 63 70 79 28 7a 54 65  .    strncpy(zTe
25f0: 6d 70 50 61 74 68 2c 20 73 71 6c 69 74 65 33 5f  mpPath, sqlite3_
2600: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20  temp_directory, 
2610: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
2620: 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20 7a 54  SIZE-30);.    zT
2630: 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54  empPath[SQLITE_T
2640: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 5d  EMPNAME_SIZE-30]
2650: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
2660: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
2670: 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
2680: 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74    WCHAR zWidePat
2690: 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h[SQLITE_TEMPNAM
26a0: 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 47 65 74  E_SIZE];.    Get
26b0: 54 65 6d 70 50 61 74 68 57 28 53 51 4c 49 54 45  TempPathW(SQLITE
26c0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33  _TEMPNAME_SIZE-3
26d0: 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  0, zWidePath);. 
26e0: 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63     zMulti = unic
26f0: 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
2700: 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
2710: 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 74  ulti ){.      st
2720: 72 6e 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c  rncpy(zTempPath,
2730: 20 7a 4d 75 6c 74 69 2c 20 53 51 4c 49 54 45 5f   zMulti, SQLITE_
2740: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
2750: 29 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 50 61  );.      zTempPa
2760: 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  th[SQLITE_TEMPNA
2770: 4d 45 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b  ME_SIZE-30] = 0;
2780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
2790: 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d  e(zMulti);.    }
27a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 47 65  .  }else{.    Ge
27b0: 74 54 65 6d 70 50 61 74 68 41 28 53 51 4c 49 54  tTempPathA(SQLIT
27c0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d  E_TEMPNAME_SIZE-
27d0: 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  30, zTempPath);.
27e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c    }.  for(i=strl
27f0: 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69  en(zTempPath); i
2800: 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b  >0 && zTempPath[
2810: 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29  i-1]=='\\'; i--)
2820: 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69  {}.  zTempPath[i
2830: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 3b 29  ] = 0;.  for(;;)
2840: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
2850: 75 66 2c 20 22 25 73 5c 5c 22 54 45 4d 50 5f 46  uf, "%s\\"TEMP_F
2860: 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d  ILE_PREFIX, zTem
2870: 70 50 61 74 68 29 3b 0a 20 20 20 20 6a 20 3d 20  pPath);.    j = 
2880: 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
2890: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
28a0: 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
28b0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
28c0: 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
28d0: 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
28e0: 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
28f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
2900: 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
2910: 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
2920: 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
2930: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 0;.    if( !sq
2940: 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 45 78 69  lite3Io.xFileExi
2950: 73 74 73 28 7a 42 75 66 29 20 29 20 62 72 65 61  sts(zBuf) ) brea
2960: 6b 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  k;.  }.  TRACE2(
2970: 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20  "TEMP FILENAME: 
2980: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
2990: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29a0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; .}../*.** Clos
29b0: 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
29c0: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
29d0: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
29e0: 69 66 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  if( id->isOpen )
29f0: 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 43 4c  {.    TRACE2("CL
2a00: 4f 53 45 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68  OSE %d\n", id->h
2a10: 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  );.    CloseHand
2a20: 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 20 20 4f  le(id->h);.    O
2a30: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
2a40: 20 20 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d      id->isOpen =
2a50: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2a60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a70: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
2a80: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
2a90: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
2aa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
2ab0: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
2ac0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
2ad0: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
2ae0: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
2af0: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2b10: 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Read(OsFile *id,
2b20: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
2b30: 20 61 6d 74 29 7b 0a 20 20 44 57 4f 52 44 20 67   amt){.  DWORD g
2b40: 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
2b50: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69  ->isOpen );.  Si
2b60: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
2b70: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
2b80: 52 41 43 45 33 28 22 52 45 41 44 20 25 64 20 6c  RACE3("READ %d l
2b90: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68  ock=%d\n", id->h
2ba0: 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b  , id->locktype);
2bb0: 0a 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65  .  if( !ReadFile
2bc0: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
2bd0: 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a 20  t, &got, 0) ){. 
2be0: 20 20 20 67 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a     got = 0;.  }.
2bf0: 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52    if( got==(DWOR
2c00: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  D)amt ){.    ret
2c10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2c30: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
2c40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  .  }.}../*.** Wr
2c50: 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
2c60: 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
2c70: 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2c80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
2c90: 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
2ca0: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
2cb0: 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
2cc0: 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
2cd0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73  OsFile *id, cons
2ce0: 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
2cf0: 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63  t amt){.  int rc
2d00: 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 77 72   = 0;.  DWORD wr
2d10: 6f 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ote;.  assert( i
2d20: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53  d->isOpen );.  S
2d30: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
2d40: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
2d50: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
2d60: 45 72 72 6f 72 3b 0a 20 20 54 52 41 43 45 33 28  Error;.  TRACE3(
2d70: 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25  "WRITE %d lock=%
2d80: 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 69 64 2d  d\n", id->h, id-
2d90: 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 61 73  >locktype);.  as
2da0: 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
2db0: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
2dc0: 20 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65   (rc = WriteFile
2dd0: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
2de0: 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21 3d  t, &wrote, 0))!=
2df0: 30 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a  0 && wrote>0 ){.
2e00: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
2e10: 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
2e20: 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
2e30: 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  e];.  }.  if( !r
2e40: 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72  c || amt>(int)wr
2e50: 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ote ){.    retur
2e60: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
2e70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2e80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e90: 53 6f 6d 65 20 6d 69 63 72 6f 73 6f 66 74 20 63  Some microsoft c
2ea0: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
2eb0: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
2ec0: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
2ed0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
2ee0: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
2ef0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
2f00: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
2f10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
2f20: 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72 69  ove the read/wri
2f30: 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61 20  te pointer in a 
2f40: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2f50: 69 6e 74 20 77 69 6e 53 65 65 6b 28 4f 73 46 69  int winSeek(OsFi
2f60: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
2f70: 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65  et){.  LONG uppe
2f80: 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 3e 3e  rBits = offset>>
2f90: 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72  32;.  LONG lower
2fa0: 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26 20  Bits = offset & 
2fb0: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 44 57  0xffffffff;.  DW
2fc0: 4f 52 44 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ORD rc;.  assert
2fd0: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
2fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2ff0: 53 54 0a 20 20 69 66 28 20 6f 66 66 73 65 74 20  ST.  if( offset 
3000: 29 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75  ) SimulateDiskfu
3010: 6c 6c 45 72 72 6f 72 0a 23 65 6e 64 69 66 0a 20  llError.#endif. 
3020: 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32   SEEK(offset/102
3030: 34 20 2b 20 31 29 3b 0a 20 20 72 63 20 3d 20 53  4 + 1);.  rc = S
3040: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 64  etFilePointer(id
3050: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
3060: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
3070: 5f 42 45 47 49 4e 29 3b 0a 20 20 54 52 41 43 45  _BEGIN);.  TRACE
3080: 33 28 22 53 45 45 4b 20 25 64 20 25 6c 6c 64 5c  3("SEEK %d %lld\
3090: 6e 22 2c 20 69 64 2d 3e 68 2c 20 6f 66 66 73 65  n", id->h, offse
30a0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e  t);.  if( rc==IN
30b0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
30c0: 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61 73  OINTER && GetLas
30d0: 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52  tError()!=NO_ERR
30e0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
30f0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
3100: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
3110: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
3120: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
3130: 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
3140: 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
3150: 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
3160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
3170: 6e 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64  nSync(OsFile *id
3180: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
3190: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69  .  assert( id->i
31a0: 73 4f 70 65 6e 20 29 3b 0a 20 20 54 52 41 43 45  sOpen );.  TRACE
31b0: 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d  3("SYNC %d lock=
31c0: 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 69 64  %d\n", id->h, id
31d0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69  ->locktype);.  i
31e0: 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66  f( FlushFileBuff
31f0: 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a 20 20  ers(id->h) ){.  
3200: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3210: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
3220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
3230: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
3240: 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69 72 65  ** Sync the dire
3250: 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20  ctory zDirname. 
3260: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
3270: 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  on operating sys
3280: 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68  tems other.** th
3290: 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 73 74 61 74  an UNIX..*/.stat
32a0: 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 44 69  ic int winSyncDi
32b0: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
32c0: 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20  ar *zDirname){. 
32d0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
32e0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
32f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
3310: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
3320: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
3330: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
3340: 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
3350: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
3360: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20   nByte){.  LONG 
3370: 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74  upperBits = nByt
3380: 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28  e>>32;.  assert(
3390: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20   id->isOpen );. 
33a0: 20 54 52 41 43 45 33 28 22 54 52 55 4e 43 41 54   TRACE3("TRUNCAT
33b0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 69 64  E %d %lld\n", id
33c0: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53  ->h, nByte);.  S
33d0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
33e0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
33f0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  SetFilePointer(i
3400: 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75 70  d->h, nByte, &up
3410: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
3420: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66  GIN);.  SetEndOf
3430: 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 72  File(id->h);.  r
3440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
3460: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
3470: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
3480: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
3490: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
34a0: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  e(OsFile *id, i6
34b0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f  4 *pSize){.  DWO
34c0: 52 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c 6f  RD upperBits, lo
34d0: 77 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65 72  werBits;.  asser
34e0: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
34f0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
3500: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
3510: 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ;.  lowerBits = 
3520: 47 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d 3e  GetFileSize(id->
3530: 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
3540: 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 69 36    *pSize = (((i6
3550: 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32  4)upperBits)<<32
3560: 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ) + lowerBits;. 
3570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3580: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
3590: 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ire a reader loc
35a0: 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  k..** Different 
35b0: 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65  API routines are
35c0: 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e   called dependin
35d0: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
35e0: 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57  not this.** is W
35f0: 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  in95 or WinNT..*
3600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
3610: 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  ReadLock(OsFile 
3620: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  *id){.  int res;
3630: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
3640: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
3650: 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ovlp;.    ovlp.O
3660: 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46  ffset = SHARED_F
3670: 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  IRST;.    ovlp.O
3680: 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20  ffsetHigh = 0;. 
3690: 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d     ovlp.hEvent =
36a0: 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f   0;.    res = Lo
36b0: 63 6b 46 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20  ckFileEx(id->h, 
36c0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
36d0: 4d 45 44 49 41 54 45 4c 59 2c 20 30 2c 20 53 48  MEDIATELY, 0, SH
36e0: 41 52 45 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c  ARED_SIZE,0,&ovl
36f0: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
3700: 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
3710: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
3720: 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b  izeof(lk), &lk);
3730: 0a 20 20 20 20 69 64 2d 3e 73 68 61 72 65 64 4c  .    id->sharedL
3740: 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  ockByte = (lk & 
3750: 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
3760: 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
3770: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
3780: 65 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f  e(id->h, SHARED_
3790: 46 49 52 53 54 2b 69 64 2d 3e 73 68 61 72 65 64  FIRST+id->shared
37a0: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
37b0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
37c0: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
37d0: 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
37e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c  /.static int unl
37f0: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69  ockReadLock(OsFi
3800: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
3810: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
3820: 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e   ){.    res = Un
3830: 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20  lockFile(id->h, 
3840: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
3850: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
3860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3870: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
3880: 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  id->h, SHARED_FI
3890: 52 53 54 20 2b 20 69 64 2d 3e 73 68 61 72 65 64  RST + id->shared
38a0: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
38b0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
38c0: 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   res;.}..#ifndef
38d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
38e0: 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a  ER_PRAGMAS./*.**
38f0: 20 43 68 65 63 6b 20 74 68 61 74 20 61 20 67 69   Check that a gi
3900: 76 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20  ven pathname is 
3910: 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
3920: 69 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a  is writable .**.
3930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
3940: 6e 49 73 44 69 72 57 72 69 74 61 62 6c 65 28 63  nIsDirWritable(c
3950: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a  har *zDirname){.
3960: 20 20 69 6e 74 20 66 69 6c 65 41 74 74 72 3b 0a    int fileAttr;.
3970: 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65 3b 0a    WCHAR *zWide;.
3980: 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d 3d    if( zDirname==
3990: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
39a0: 69 66 28 20 21 69 73 4e 54 28 29 20 26 26 20 73  if( !isNT() && s
39b0: 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3e  trlen(zDirname)>
39c0: 4d 41 58 5f 50 41 54 48 20 29 20 72 65 74 75 72  MAX_PATH ) retur
39d0: 6e 20 30 3b 0a 20 20 7a 57 69 64 65 20 3d 20 75  n 0;.  zWide = u
39e0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 44 69  tf8ToUnicode(zDi
39f0: 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 57  rname);.  if( zW
3a00: 69 64 65 20 29 7b 0a 20 20 20 20 66 69 6c 65 41  ide ){.    fileA
3a10: 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
3a20: 72 69 62 75 74 65 73 57 28 7a 57 69 64 65 29 3b  ributesW(zWide);
3a30: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3a40: 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zWide);.  }else{
3a50: 0a 20 20 20 20 66 69 6c 65 41 74 74 72 20 3d 20  .    fileAttr = 
3a60: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3a70: 73 41 28 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  sA(zDirname);.  
3a80: 7d 0a 20 20 69 66 28 20 66 69 6c 65 41 74 74 72  }.  if( fileAttr
3a90: 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66 20 29   == 0xffffffff )
3aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
3ab0: 20 28 66 69 6c 65 41 74 74 72 20 26 20 46 49 4c   (fileAttr & FIL
3ac0: 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
3ad0: 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45 5f 41  CTORY) != FILE_A
3ae0: 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
3af0: 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  RY ){.    return
3b00: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3b10: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
3b20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3b30: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f 2a  R_PRAGMAS */../*
3b40: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
3b50: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
3b60: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
3b70: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
3b80: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
3b90: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
3ba0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
3bb0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
3bc0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
3bd0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
3be0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
3bf0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
3c00: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
3c10: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
3c20: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
3c30: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
3c40: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
3c50: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
3c60: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
3c70: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
3c80: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
3c90: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
3ca0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
3cb0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
3cc0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
3cd0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
3ce0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
3cf0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
3d00: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
3d10: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
3d20: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
3d30: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
3d40: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
3d50: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
3d60: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
3d70: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
3d80: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
3d90: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
3da0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
3db0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
3dc0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
3dd0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
3de0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
3df0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3e00: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
3e10: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
3e20: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
3e30: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
3e40: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
3e50: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
3e60: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
3e70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
3e80: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
3e90: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
3ea0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
3eb0: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
3ec0: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
3ed0: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
3ee0: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
3ef0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3f00: 74 20 77 69 6e 4c 6f 63 6b 28 4f 73 46 69 6c 65  t winLock(OsFile
3f10: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
3f20: 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
3f30: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
3f40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
3f50: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
3f60: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
3f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
3f80: 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f 77 73  ult of a windows
3f90: 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
3fa0: 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
3fb0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 64         /* Set id
3fc0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
3fd0: 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
3fe0: 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
3ff0: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
4000: 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
4010: 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
4020: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
4030: 69 6d 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ime */..  assert
4040: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
4050: 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 25    TRACE5("LOCK %
4060: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
4070: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 64  n",.          id
4080: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 69  ->h, locktype, i
4090: 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 69 64 2d  d->locktype, id-
40a0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
40b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
40c0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
40d0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
40e0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
40f0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
4100: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
4110: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
4120: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
4130: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
4140: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
4150: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
4160: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
4170: 2f 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b  /.  if( id->lock
4180: 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
4190: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
41a0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
41b0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
41c0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
41d0: 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
41e0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c  .  assert( id->l
41f0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
4200: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
4210: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
4220: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
4230: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
4240: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
4250: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
4260: 43 4b 20 7c 7c 20 69 64 2d 3e 6c 6f 63 6b 74 79  CK || id->lockty
4270: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
4280: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
4290: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
42a0: 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
42b0: 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
42c0: 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
42d0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
42e0: 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
42f0: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
4300: 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
4310: 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
4320: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
4330: 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
4340: 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
4350: 70 65 20 3d 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  pe = id->locktyp
4360: 65 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63  e;.  if( id->loc
4370: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20  ktype==NO_LOCK. 
4380: 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
4390: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
43a0: 26 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  & id->locktype==
43b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20  RESERVED_LOCK). 
43c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
43d0: 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
43e0: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
43f0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
4400: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
4410: 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
4420: 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
4430: 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
4440: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
4450: 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  he pending lock 
4460: 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a  might be.      *
4470: 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  * held by anothe
4480: 72 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73  r reader process
4490: 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73   who will releas
44a0: 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79  e it momentarily
44b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
44c0: 20 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20 6e   TRACE2("could n
44d0: 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47  ot get a PENDING
44e0: 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22   lock. cnt=%d\n"
44f0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c  , cnt);.      Sl
4500: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
4510: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
4520: 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f   = res;.  }..  /
4530: 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
4540: 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
4550: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
4560: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
4570: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
4580: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  d->locktype==NO_
4590: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
45a0: 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 69 64  = getReadLock(id
45b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
45c0: 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
45d0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
45e0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
45f0: 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
4600: 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  ERVED lock.  */.
4610: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
4620: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
4630: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
4640: 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  rt( id->locktype
4650: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
4660: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
4670: 69 6c 65 28 69 64 2d 3e 68 2c 20 52 45 53 45 52  ile(id->h, RESER
4680: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
4690: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
46a0: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
46b0: 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
46c0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
46d0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
46e0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
46f0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
4700: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
4710: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
4720: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
4730: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
4740: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
4750: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
4760: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
4770: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
4780: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
4790: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
47a0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
47b0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53   id->locktype>=S
47c0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
47d0: 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
47e0: 61 64 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 20 20  adLock(id);.    
47f0: 54 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c 6f  TRACE2("unreadlo
4800: 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29  ck = %d\n", res)
4810: 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b  ;.    res = Lock
4820: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52  File(id->h, SHAR
4830: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
4840: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
4850: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
4860: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
4870: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
4880: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4890: 20 20 54 52 41 43 45 32 28 22 65 72 72 6f 72 2d    TRACE2("error-
48a0: 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 47 65  code = %d\n", Ge
48b0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
48c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
48d0: 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
48e0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
48f0: 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
4900: 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
4910: 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
4920: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
4930: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
4940: 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
4950: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55  ED_LOCK ){.    U
4960: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
4970: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
4980: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
4990: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
49a0: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
49b0: 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
49c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
49d0: 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
49e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
49f0: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
4a00: 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
4a10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a20: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
4a30: 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 46 41   TRACE4("LOCK FA
4a40: 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
4a50: 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
4a60: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 0a 20 20 20 20  \n", id->h,.    
4a70: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c         locktype,
4a80: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 3b 0a 20   newLocktype);. 
4a90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
4aa0: 55 53 59 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c  USY;.  }.  id->l
4ab0: 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63  ocktype = newLoc
4ac0: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
4ad0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
4ae0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
4af0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
4b00: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
4b10: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
4b20: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
4b30: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
4b40: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
4b50: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
4b60: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
4b70: 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
4b80: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
4b90: 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
4ba0: 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  vedLock(OsFile *
4bb0: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  id){.  int rc;. 
4bc0: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f   assert( id->isO
4bd0: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 69 64 2d  pen );.  if( id-
4be0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
4bf0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
4c00: 72 63 20 3d 20 31 3b 0a 20 20 20 20 54 52 41 43  rc = 1;.    TRAC
4c10: 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E3("TEST WR-LOCK
4c20: 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e   %d %d (local)\n
4c30: 22 2c 20 69 64 2d 3e 68 2c 20 72 63 29 3b 0a 20  ", id->h, rc);. 
4c40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
4c50: 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c   LockFile(id->h,
4c60: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
4c70: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
4c80: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e  ( rc ){.      Un
4c90: 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20  lockFile(id->h, 
4ca0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
4cb0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
4cc0: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
4cd0: 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52   TRACE3("TEST WR
4ce0: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d  -LOCK %d %d (rem
4cf0: 6f 74 65 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  ote)\n", id->h, 
4d00: 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
4d10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
4d20: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
4d30: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
4d40: 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
4d50: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
4d60: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
4d70: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
4d80: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
4d90: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
4da0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
4db0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4dc0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
4dd0: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
4de0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
4df0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
4e00: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
4e10: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
4e20: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
4e30: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
4e40: 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
4e50: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
4e60: 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
4e70: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4e80: 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
4e90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4ea0: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
4eb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
4ec0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
4ed0: 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
4ee0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
4ef0: 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
4f00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4f10: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  OK;.  assert( id
4f20: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 61 73  ->isOpen );.  as
4f30: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
4f40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
4f50: 20 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20   TRACE5("UNLOCK 
4f60: 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
4f70: 25 64 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c  %d)\n", id->h, l
4f80: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
4f90: 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c     id->locktype,
4fa0: 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42   id->sharedLockB
4fb0: 79 74 65 29 3b 0a 20 20 74 79 70 65 20 3d 20 69  yte);.  type = i
4fc0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  d->locktype;.  i
4fd0: 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
4fe0: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55  VE_LOCK ){.    U
4ff0: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
5000: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
5010: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
5020: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
5030: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
5040: 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
5050: 28 69 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  (id) ){.      /*
5060: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
5070: 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
5080: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
5090: 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
50a0: 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
50b0: 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
50c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
50d0: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ERR;.    }.  }. 
50e0: 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52   if( type>=RESER
50f0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
5100: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
5110: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
5120: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
5130: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
5140: 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
5150: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
5160: 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63     unlockReadLoc
5170: 6b 28 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  k(id);.  }.  if(
5180: 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
5190: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
51a0: 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 50 45 4e  kFile(id->h, PEN
51b0: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
51c0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c   0);.  }.  id->l
51d0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
51e0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
51f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
5200: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
5210: 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
5220: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
5230: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
5240: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
5250: 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61  me stored in spa
5260: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
5270: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
5280: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
5290: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
52a0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
52b0: 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 6f  ing this space o
52c0: 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20  nce it.** is no 
52d0: 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
52e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
52f0: 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63  inFullPathname(c
5300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
5310: 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  tive){.  char *z
5320: 4e 6f 74 55 73 65 64 3b 0a 20 20 63 68 61 72 20  NotUsed;.  char 
5330: 2a 7a 46 75 6c 6c 3b 0a 20 20 57 43 48 41 52 20  *zFull;.  WCHAR 
5340: 2a 7a 57 69 64 65 3b 0a 20 20 69 6e 74 20 6e 42  *zWide;.  int nB
5350: 79 74 65 3b 0a 23 69 66 64 65 66 20 5f 5f 43 59  yte;.#ifdef __CY
5360: 47 57 49 4e 5f 5f 0a 20 20 6e 42 79 74 65 20 3d  GWIN__.  nByte =
5370: 20 73 74 72 6c 65 6e 28 7a 52 65 6c 61 74 69 76   strlen(zRelativ
5380: 65 29 20 2b 20 4d 41 58 5f 50 41 54 48 20 2b 20  e) + MAX_PATH + 
5390: 31 30 30 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20  1001;.  zFull = 
53a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
53b0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  yte );.  if( zFu
53c0: 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ll==0 ) return 0
53d0: 3b 0a 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63  ;.  if( cygwin_c
53e0: 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33  onv_to_full_win3
53f0: 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65  2_path(zRelative
5400: 2c 20 7a 46 75 6c 6c 29 20 29 20 72 65 74 75 72  , zFull) ) retur
5410: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 7a 57 69  n 0;.#else.  zWi
5420: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
5430: 64 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  de(zRelative);. 
5440: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20   if( zWide ){.  
5450: 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 2c 20    WCHAR *zTemp, 
5460: 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a 20 20 20 20  *zNotUsedW;.    
5470: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
5480: 61 74 68 4e 61 6d 65 57 28 7a 57 69 64 65 2c 20  athNameW(zWide, 
5490: 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 57  0, 0, &zNotUsedW
54a0: 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54 65 6d 70  ) + 1;.    zTemp
54b0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
54c0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
54d0: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
54e0: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 20 72 65  f( zTemp==0 ) re
54f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 47 65 74 46  turn 0;.    GetF
5500: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69  ullPathNameW(zWi
5510: 64 65 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  de, nByte, zTemp
5520: 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29 3b 0a 20  , &zNotUsedW);. 
5530: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57     sqliteFree(zW
5540: 69 64 65 29 3b 0a 20 20 20 20 7a 46 75 6c 6c 20  ide);.    zFull 
5550: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
5560: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
5570: 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  teFree(zTemp);. 
5580: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 42 79 74   }else{.    nByt
5590: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
55a0: 61 6d 65 41 28 7a 52 65 6c 61 74 69 76 65 2c 20  ameA(zRelative, 
55b0: 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  0, 0, &zNotUsed)
55c0: 20 2b 20 31 3b 0a 20 20 20 20 7a 46 75 6c 6c 20   + 1;.    zFull 
55d0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
55e0: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 46 75  nByte*sizeof(zFu
55f0: 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  ll[0]) );.    if
5600: 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74  ( zFull==0 ) ret
5610: 75 72 6e 20 30 3b 0a 20 20 20 20 47 65 74 46 75  urn 0;.    GetFu
5620: 6c 6c 50 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c  llPathNameA(zRel
5630: 61 74 69 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46  ative, nByte, zF
5640: 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  ull, &zNotUsed);
5650: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
5660: 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f  turn zFull;.}../
5670: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
5680: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
5690: 64 65 66 69 6e 65 73 20 61 6c 6c 20 6f 66 20 74  defines all of t
56a0: 68 65 20 49 2f 4f 20 72 6f 75 74 69 6e 65 73 2e  he I/O routines.
56b0: 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74  .*/.struct sqlit
56c0: 65 33 49 6f 56 74 62 6c 20 73 71 6c 69 74 65 33  e3IoVtbl sqlite3
56d0: 49 6f 20 3d 20 7b 0a 20 20 77 69 6e 44 65 6c 65  Io = {.  winDele
56e0: 74 65 2c 0a 20 20 77 69 6e 46 69 6c 65 45 78 69  te,.  winFileExi
56f0: 73 74 73 2c 0a 20 20 77 69 6e 4f 70 65 6e 52 65  sts,.  winOpenRe
5700: 61 64 57 72 69 74 65 2c 0a 20 20 77 69 6e 4f 70  adWrite,.  winOp
5710: 65 6e 45 78 63 6c 75 73 69 76 65 2c 0a 20 20 77  enExclusive,.  w
5720: 69 6e 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 0a  inOpenReadOnly,.
5730: 20 20 77 69 6e 4f 70 65 6e 44 69 72 65 63 74 6f    winOpenDirecto
5740: 72 79 2c 0a 20 20 77 69 6e 53 79 6e 63 44 69 72  ry,.  winSyncDir
5750: 65 63 74 6f 72 79 2c 0a 20 20 77 69 6e 54 65 6d  ectory,.  winTem
5760: 70 46 69 6c 65 4e 61 6d 65 2c 0a 20 20 77 69 6e  pFileName,.  win
5770: 49 73 44 69 72 57 72 69 74 61 62 6c 65 2c 0a 20  IsDirWritable,. 
5780: 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e   winClose,.  win
5790: 52 65 61 64 2c 0a 20 20 77 69 6e 57 72 69 74 65  Read,.  winWrite
57a0: 2c 0a 20 20 77 69 6e 53 65 65 6b 2c 0a 20 20 77  ,.  winSeek,.  w
57b0: 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 54 72 75  inSync,.  winTru
57c0: 6e 63 61 74 65 2c 0a 20 20 77 69 6e 46 69 6c 65  ncate,.  winFile
57d0: 53 69 7a 65 2c 0a 20 20 77 69 6e 46 75 6c 6c 50  Size,.  winFullP
57e0: 61 74 68 6e 61 6d 65 2c 0a 20 20 77 69 6e 4c 6f  athname,.  winLo
57f0: 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c  ck,.  winUnlock,
5800: 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
5810: 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 23 65 6e  vedLock,.};..#en
5820: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5830: 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a  IT_DISKIO */./**
5840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65  *********.** Eve
5890: 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20 64 65  rything above de
58a0: 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20 49 2f  als with file I/
58b0: 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20 74  O.  Everything t
58c0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65 61 6c  hat follows deal
58d0: 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65 72 20  s.** with other 
58e0: 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61 73 70  miscellanous asp
58f0: 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72  ects of the oper
5900: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
5910: 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  erface.*********
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5960: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ***/../*.** Get 
5970: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73  information to s
5980: 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e  eed the random n
5990: 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  umber generator.
59a0: 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73    The seed.** is
59b0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
59c0: 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35  e buffer zBuf[25
59d0: 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  6].  The calling
59e0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a   function must.*
59f0: 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66 66 69  * supply a suffi
5a00: 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75  ciently large bu
5a10: 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ffer..*/.int sql
5a20: 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64  ite3OsRandomSeed
5a30: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
5a40: 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
5a50: 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
5a60: 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
5a70: 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
5a80: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
5a90: 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
5aa0: 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
5ab0: 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
5ac0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
5ad0: 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
5ae0: 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
5af0: 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
5b00: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
5b10: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
5b20: 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
5b30: 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
5b40: 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
5b50: 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
5b60: 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
5b70: 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
5b80: 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
5b90: 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
5ba0: 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
5bb0: 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
5bc0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
5bd0: 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
5be0: 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
5bf0: 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
5c00: 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
5c10: 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
5c20: 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
5c30: 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
5c40: 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
5c50: 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
5c60: 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
5c70: 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
5c80: 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.* This makes 
5c90: 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
5ca0: 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
5cb0: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
5cc0: 2c 20 32 35 36 29 3b 0a 20 20 47 65 74 53 79 73  , 256);.  GetSys
5cd0: 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53 54 45  temTime((LPSYSTE
5ce0: 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20 20 72  MTIME)zBuf);.  r
5cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
5d10: 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
5d20: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
5d30: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
5d40: 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
5d50: 69 74 65 33 4f 73 53 6c 65 65 70 28 69 6e 74 20  ite3OsSleep(int 
5d60: 6d 73 29 7b 0a 20 20 53 6c 65 65 70 28 6d 73 29  ms){.  Sleep(ms)
5d70: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a 7d  ;.  return ms;.}
5d80: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76  ../*.** Static v
5d90: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f  ariables used fo
5da0: 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f  r thread synchro
5db0: 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  nization.*/.stat
5dc0: 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d  ic int inMutex =
5dd0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
5de0: 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20  E_W32_THREADS.  
5df0: 73 74 61 74 69 63 20 43 52 49 54 49 43 41 4c 5f  static CRITICAL_
5e00: 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65 6e 64  SECTION cs;.#end
5e10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
5e20: 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f 66 20  llowing pair of 
5e30: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
5e40: 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  t mutual exclusi
5e50: 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d  on for.** multi-
5e60: 74 68 72 65 61 64 65 64 20 70 72 6f 63 65 73 73  threaded process
5e70: 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  es.  Only a sing
5e80: 6c 65 20 74 68 72 65 61 64 20 69 73 20 61 6c 6c  le thread is all
5e90: 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75  owed to.** execu
5ea0: 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 69 73  ted code that is
5eb0: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 45   surrounded by E
5ec0: 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e 64 20  nterMutex() and 
5ed0: 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a  LeaveMutex()..**
5ee0: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20  .** SQLite uses 
5ef0: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d 75  only a single Mu
5f00: 74 65 78 2e 20 20 54 68 65 72 65 20 69 73 20 6e  tex.  There is n
5f10: 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63 61 6c  ot much critical
5f20: 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77 68 61  .** code and wha
5f30: 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65 20 69  t little there i
5f40: 73 20 65 78 65 63 75 74 65 73 20 71 75 69 63 6b  s executes quick
5f50: 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74 20 62  ly and without b
5f60: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  locking..*/.void
5f70: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
5f80: 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66 20 53  utex(){.#ifdef S
5f90: 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44  QLITE_W32_THREAD
5fa0: 53 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  S.  static int i
5fb0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77 68 69  sInit = 0;.  whi
5fc0: 6c 65 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20  le( !isInit ){. 
5fd0: 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c     static long l
5fe0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ock = 0;.    if(
5ff0: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e 63 72   InterlockedIncr
6000: 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d 31 20  ement(&lock)==1 
6010: 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69 61 6c  ){.      Initial
6020: 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 74 69  izeCriticalSecti
6030: 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 20 20 69  on(&cs);.      i
6040: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  sInit = 1;.    }
6050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c 65 65  else{.      Slee
6060: 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p(1);.    }.  }.
6070: 20 20 45 6e 74 65 72 43 72 69 74 69 63 61 6c 53    EnterCriticalS
6080: 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e  ection(&cs);.#en
6090: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 21 69  dif.  assert( !i
60a0: 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75  nMutex );.  inMu
60b0: 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20  tex = 1;.}.void 
60c0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
60d0: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
60e0: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
60f0: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
6100: 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52  f SQLITE_W32_THR
6110: 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72 69 74  EADS.  LeaveCrit
6120: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29  icalSection(&cs)
6130: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
6140: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
6150: 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
6160: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
6170: 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68  alue, becomes th
6180: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75  e result.** retu
6190: 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  rned from sqlite
61a0: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
61b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
61c0: 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  for testing..*/.
61d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
61e0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
61f0: 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
6200: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
6210: 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
6220: 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
6230: 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
6240: 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
6250: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
6260: 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
6270: 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
6280: 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
6290: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
62a0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
62b0: 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
62c0: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
62d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 75  .int sqlite3OsCu
62e0: 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65  rrentTime(double
62f0: 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49 4c 45   *prNow){.  FILE
6300: 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49  TIME ft;.  /* FI
6310: 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
6320: 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
6330: 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
6340: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20  the number of . 
6350: 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f      100-nanoseco
6360: 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e  nd intervals sin
6370: 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36  ce January 1, 16
6380: 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33  01 (= JD 2305813
6390: 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f 75  .5). .  */.  dou
63a0: 62 6c 65 20 6e 6f 77 3b 0a 20 20 47 65 74 53 79  ble now;.  GetSy
63b0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
63c0: 6d 65 28 20 26 66 74 20 29 3b 0a 20 20 6e 6f 77  me( &ft );.  now
63d0: 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64   = ((double)ft.d
63e0: 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a  wHighDateTime) *
63f0: 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a   4294967296.0; .
6400: 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20    *prNow = (now 
6410: 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  + ft.dwLowDateTi
6420: 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30 30 30  me)/864000000000
6430: 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a  .0 + 2305813.5;.
6440: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
6450: 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
6460: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
6470: 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71  .    *prNow = sq
6480: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
6490: 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34  me/86400.0 + 244
64a0: 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64  0587.5;.  }.#end
64b0: 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  if.  return 0;.}
64c0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  ..#endif /* OS_W
64d0: 49 4e 20 2a 2f 0a                                IN */.