/ Hex Artifact Content
Login

Artifact 5771f4b7d20b03b26ae332404cc58c088ef1b010:


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 69 6e 74 20 73 71 6c   file.*/.int sql
0d60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 63 6f 6e  ite3OsDelete(con
0d70: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0d80: 6d 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a 57  me){.  WCHAR *zW
0d90: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
0da0: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
0db0: 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20    if( zWide ){. 
0dc0: 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a     DeleteFileW(z
0dd0: 57 69 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Wide);.    sqlit
0de0: 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20  eFree(zWide);.  
0df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 6c 65 74  }else{.    Delet
0e00: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65  eFileA(zFilename
0e10: 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  );.  }.  TRACE2(
0e20: 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e  "DELETE \"%s\"\n
0e30: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
0e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0e50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
0e60: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
0e70: 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73  amed file exists
0e80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0e90: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e  OsFileExists(con
0ea0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0eb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 65 78 69 73 74  me){.  int exist
0ec0: 73 20 3d 20 30 3b 0a 20 20 57 43 48 41 52 20 2a  s = 0;.  WCHAR *
0ed0: 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  zWide = utf8ToUn
0ee0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
0ef0: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b  ;.  if( zWide ){
0f00: 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65  .    exists = Ge
0f10: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
0f20: 28 7a 57 69 64 65 29 20 21 3d 20 30 78 66 66 66  (zWide) != 0xfff
0f30: 66 66 66 66 66 3b 0a 20 20 20 20 73 71 6c 69 74  fffff;.    sqlit
0f40: 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20  eFree(zWide);.  
0f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 69 73 74  }else{.    exist
0f60: 73 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  s = GetFileAttri
0f70: 62 75 74 65 73 41 28 7a 46 69 6c 65 6e 61 6d 65  butesA(zFilename
0f80: 29 20 21 3d 20 30 78 66 66 66 66 66 66 66 66 3b  ) != 0xffffffff;
0f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78  .  }.  return ex
0fa0: 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ists;.}../*.** A
0fb0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
0fc0: 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72   file for both r
0fd0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
0fe0: 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20  ng.  If that.** 
0ff0: 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69  fails, try openi
1000: 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  ng it read-only.
1010: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f    If the file do
1020: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a  es not exist,.**
1030: 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69   try to create i
1040: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  t..**.** On succ
1050: 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f  ess, a handle fo
1060: 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  r the open file 
1070: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69  is written to *i
1080: 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f  d.** and *pReado
1090: 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20  nly is set to 0 
10a0: 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  if the file was 
10b0: 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69  opened for readi
10c0: 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e  ng and.** writin
10d0: 67 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69  g or 1 if the fi
10e0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
10f0: 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75  ad-only.  The fu
1100: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
1110: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  * SQLITE_OK..**.
1120: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74  ** On failure, t
1130: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1140: 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rns SQLITE_CANTO
1150: 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a  PEN and leaves.*
1160: 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64  * *id and *pRead
1170: 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a  only unchanged..
1180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
1190: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20  OpenReadWrite(. 
11a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
11b0: 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65  lename,.  OsFile
11c0: 20 2a 69 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65   *id,.  int *pRe
11d0: 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 48 41 4e 44  adonly.){.  HAND
11e0: 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a  LE h;.  WCHAR *z
11f0: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
1200: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
1210: 0a 20 20 61 73 73 65 72 74 28 20 21 69 64 2d 3e  .  assert( !id->
1220: 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20  isOpen );.  if( 
1230: 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20 3d  zWide ){.    h =
1240: 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57 69   CreateFileW(zWi
1250: 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52  de,.       GENER
1260: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
1270: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  C_WRITE,.       
1280: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
1290: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
12a0: 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c  TE,.       NULL,
12b0: 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57  .       OPEN_ALW
12c0: 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45  AYS,.       FILE
12d0: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
12e0: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
12f0: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
1300: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
1310: 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c      if( h==INVAL
1320: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1330: 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65  ){.      h = Cre
1340: 61 74 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a  ateFileW(zWide,.
1350: 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49 43           GENERIC
1360: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1370: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c  FILE_SHARE_READ,
1380: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  .         NULL,.
1390: 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c           OPEN_AL
13a0: 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46  WAYS,.         F
13b0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
13c0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
13d0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
13e0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20           NULL.  
13f0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
1400: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
1410: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1420: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1430: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Wide);.        r
1440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
1450: 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  TOPEN;.      }. 
1460: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20       *pReadonly 
1470: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1480: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79        *pReadonly
1490: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65  sqliteFree(zWide
14b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14c0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
14d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
14e0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
14f0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
1500: 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52         FILE_SHAR
1510: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
1520: 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  ARE_WRITE,.     
1530: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f    NULL,.       O
1540: 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
1550: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
1560: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
1570: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
1580: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
1590: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 68      );.    if( h
15a0: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
15b0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
15c0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
15d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
15e0: 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44      GENERIC_READ
15f0: 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f  ,.         FILE_
1600: 53 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20  SHARE_READ,.    
1610: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1620: 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c      OPEN_ALWAYS,
1630: 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41  .         FILE_A
1640: 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20  TTRIBUTE_NORMAL 
1650: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  | FILE_FLAG_RAND
1660: 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20  OM_ACCESS,.     
1670: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29      NULL.      )
1680: 3b 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49  ;.      if( h==I
1690: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
16a0: 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LUE ){.        r
16b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
16c0: 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  TOPEN;.      }. 
16d0: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20       *pReadonly 
16e0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
16f0: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79        *pReadonly
1700: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1710: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69    id->h = h;.  i
1720: 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  d->locktype = NO
1730: 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d 3e 73 68 61  _LOCK;.  id->sha
1740: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b  redLockByte = 0;
1750: 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
1760: 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  1;.  OpenCounter
1770: 28 2b 31 29 3b 0a 20 20 54 52 41 43 45 33 28 22  (+1);.  TRACE3("
1780: 4f 50 45 4e 20 52 2f 57 20 25 64 20 5c 22 25 73  OPEN R/W %d \"%s
1790: 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  \"\n", h, zFilen
17a0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ame);.  return S
17b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
17c0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
17d0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
17e0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
17f0: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
1800: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
1810: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1820: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
1830: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
1840: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
1850: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
1860: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
1870: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
1880: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
1890: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
18a0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
18b0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
18c0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
18d0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
18e0: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
18f0: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
1900: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
1910: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
1920: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
1930: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
1940: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
1950: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
1960: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
1970: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1980: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
1990: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
19a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
19b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70  .int sqlite3OsOp
19c0: 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73  enExclusive(cons
19d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
19e0: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  e, OsFile *id, i
19f0: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 48  nt delFlag){.  H
1a00: 41 4e 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66  ANDLE h;.  int f
1a10: 69 6c 65 66 6c 61 67 73 3b 0a 20 20 57 43 48 41  ileflags;.  WCHA
1a20: 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54  R *zWide = utf8T
1a30: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
1a40: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  me);.  assert( !
1a50: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
1a60: 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20  if( delFlag ){. 
1a70: 20 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46     fileflags = F
1a80: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
1a90: 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46  MPORARY | FILE_F
1aa0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
1ab0: 53 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S .             
1ac0: 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
1ad0: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
1ae0: 4f 53 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OSE;.  }else{.  
1af0: 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46 49    fileflags = FI
1b00: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1b10: 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 28  CCESS;.  }.  if(
1b20: 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20   zWide ){.    h 
1b30: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57  = CreateFileW(zW
1b40: 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45  ide,.       GENE
1b50: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
1b60: 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20  IC_WRITE,.      
1b70: 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c   0,.       NULL,
1b80: 0a 20 20 20 20 20 20 20 43 52 45 41 54 45 5f 41  .       CREATE_A
1b90: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 66 69  LWAYS,.       fi
1ba0: 6c 65 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  leflags,.       
1bb0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20  NULL.    );.    
1bc0: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65  sqliteFree(zWide
1bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1be0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
1bf0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
1c00: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
1c10: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
1c20: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
1c30: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43 52   NULL,.       CR
1c40: 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20  EATE_ALWAYS,.   
1c50: 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20      fileflags,. 
1c60: 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29        NULL.    )
1c70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49  ;.  }.  if( h==I
1c80: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1c90: 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LUE ){.    retur
1ca0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
1cb0: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d  N;.  }.  id->h =
1cc0: 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79   h;.  id->lockty
1cd0: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
1ce0: 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  id->sharedLockBy
1cf0: 74 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73  te = 0;.  id->is
1d00: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e  Open = 1;.  Open
1d10: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54  Counter(+1);.  T
1d20: 52 41 43 45 33 28 22 4f 50 45 4e 20 45 58 20 25  RACE3("OPEN EX %
1d30: 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20  d \"%s\"\n", h, 
1d40: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65  zFilename);.  re
1d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1d70: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
1d80: 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c  ile for read-onl
1d90: 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  y access..**.** 
1da0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74  On success, writ
1db0: 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  e the file handl
1dc0: 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72  e into *id and r
1dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1de0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
1df0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
1e00: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e  _CANTOPEN..*/.in
1e10: 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  t sqlite3OsOpenR
1e20: 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68  eadOnly(const ch
1e30: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  ar *zFilename, O
1e40: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 48 41  sFile *id){.  HA
1e50: 4e 44 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20  NDLE h;.  WCHAR 
1e60: 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55  *zWide = utf8ToU
1e70: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
1e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 64  );.  assert( !id
1e90: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66  ->isOpen );.  if
1ea0: 28 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68  ( zWide ){.    h
1eb0: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a   = CreateFileW(z
1ec0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e  Wide,.       GEN
1ed0: 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20  ERIC_READ,.     
1ee0: 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c    0,.       NULL
1ef0: 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45 58  ,.       OPEN_EX
1f00: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20 46  ISTING,.       F
1f10: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
1f20: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
1f30: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
1f40: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
1f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1f60: 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73  e(zWide);.  }els
1f70: 65 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  e{.    h = Creat
1f80: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65  eFileA(zFilename
1f90: 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43  ,.       GENERIC
1fa0: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30 2c  _READ,.       0,
1fb0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
1fc0: 20 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 49       OPEN_EXISTI
1fd0: 4e 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f  NG,.       FILE_
1fe0: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
1ff0: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   | FILE_FLAG_RAN
2000: 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20  DOM_ACCESS,.    
2010: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20     NULL.    );. 
2020: 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41   }.  if( h==INVA
2030: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
2040: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2050: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
2060: 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b    }.  id->h = h;
2070: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20  .  id->locktype 
2080: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d  = NO_LOCK;.  id-
2090: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
20a0: 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65  = 0;.  id->isOpe
20b0: 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f 75  n = 1;.  OpenCou
20c0: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 52 41 43  nter(+1);.  TRAC
20d0: 45 33 28 22 4f 50 45 4e 20 52 4f 20 25 64 20 5c  E3("OPEN RO %d \
20e0: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
20f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
2100: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2110: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
2120: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   open a file des
2130: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
2140: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
2150: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c  ontains a.** fil
2160: 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65  e.  This file de
2170: 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20  scriptor can be 
2180: 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20  used to fsync() 
2190: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
21a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
21b0: 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74  e sure the creat
21c0: 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c  ion of a new fil
21d0: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72  e is actually wr
21e0: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b  itten.** to disk
21f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2200: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61  tine is only mea
2210: 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78  ningful for Unix
2220: 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70  .  It is a no-op
2230: 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77   under.** window
2240: 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20  s since windows 
2250: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
2260: 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a   hard links..**.
2270: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61  ** On success, a
2280: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72   handle for a pr
2290: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69  eviously open fi
22a0: 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a  le is at *id is.
22b0: 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20  ** updated with 
22c0: 74 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72  the new director
22d0: 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
22e0: 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  r and SQLITE_OK 
22f0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
2300: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
2310: 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
2320: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41  eturns SQLITE_CA
2330: 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65  NTOPEN and leave
2340: 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67  s.** *id unchang
2350: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2360: 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e3OsOpenDirector
2370: 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  y(.  const char 
2380: 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46  *zDirname,.  OsF
2390: 69 6c 65 20 2a 69 64 0a 29 7b 0a 20 20 72 65 74  ile *id.){.  ret
23a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
23c0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
23d0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
23e0: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
23f0: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
2400: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
2410: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
2420: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
2430: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65  d to store.** te
2440: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
2450: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
2460: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
2470: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74   0;../*.** Creat
2480: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
2490: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
24a0: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
24b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
24c0: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
24d0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
24e0: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
24f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54  /.int sqlite3OsT
2500: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72  empFileName(char
2510: 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
2520: 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
2530: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
2540: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2550: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
2560: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
2570: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
2580: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
2590: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61  ;.  char zTempPa
25a0: 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  th[SQLITE_TEMPNA
25b0: 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20  ME_SIZE];.  if( 
25c0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
25d0: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 74  ectory ){.    st
25e0: 72 6e 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c  rncpy(zTempPath,
25f0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
2600: 72 65 63 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f  rectory, SQLITE_
2610: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
2620: 29 3b 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68  );.    zTempPath
2630: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
2640: 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20  _SIZE-30] = 0;. 
2650: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28   }else if( isNT(
2660: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
2670: 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52  Multi;.    WCHAR
2680: 20 7a 57 69 64 65 50 61 74 68 5b 53 51 4c 49 54   zWidePath[SQLIT
2690: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
26a0: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
26b0: 68 57 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  hW(SQLITE_TEMPNA
26c0: 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 57 69 64  ME_SIZE-30, zWid
26d0: 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
26e0: 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
26f0: 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
2700: 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
2710: 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a  .      strncpy(z
2720: 54 65 6d 70 50 61 74 68 2c 20 7a 4d 75 6c 74 69  TempPath, zMulti
2730: 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  , SQLITE_TEMPNAM
2740: 45 5f 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20  E_SIZE-30);.    
2750: 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49    zTempPath[SQLI
2760: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
2770: 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  -30] = 0;.      
2780: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 75 6c 74  sqliteFree(zMult
2790: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
27a0: 65 7b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61  e{.    GetTempPa
27b0: 74 68 41 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e  thA(SQLITE_TEMPN
27c0: 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65  AME_SIZE-30, zTe
27d0: 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 66  mpPath);.  }.  f
27e0: 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d  or(i=strlen(zTem
27f0: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
2800: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
2810: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
2820: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
2830: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73    for(;;){.    s
2840: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73  printf(zBuf, "%s
2850: 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  \\"TEMP_FILE_PRE
2860: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b  FIX, zTempPath);
2870: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
2880: 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
2890: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  e3Randomness(15,
28a0: 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
28b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
28c0: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
28d0: 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
28e0: 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
28f0: 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
2900: 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
2910: 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
2920: 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
2930: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73    if( !sqlite3Os
2940: 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75 66 29  FileExists(zBuf)
2950: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2960: 54 52 41 43 45 32 28 22 54 45 4d 50 20 46 49 4c  TRACE2("TEMP FIL
2970: 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42  ENAME: %s\n", zB
2980: 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  uf);.  return SQ
2990: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
29a0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
29b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
29c0: 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 69  sClose(OsFile *i
29d0: 64 29 7b 0a 20 20 69 66 28 20 69 64 2d 3e 69 73  d){.  if( id->is
29e0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 54 52 41 43  Open ){.    TRAC
29f0: 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
2a00: 20 69 64 2d 3e 68 29 3b 0a 20 20 20 20 43 6c 6f   id->h);.    Clo
2a10: 73 65 48 61 6e 64 6c 65 28 69 64 2d 3e 68 29 3b  seHandle(id->h);
2a20: 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
2a30: 28 2d 31 29 3b 0a 20 20 20 20 69 64 2d 3e 69 73  (-1);.    id->is
2a40: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
2a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
2a70: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
2a80: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
2a90: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2aa0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
2ab0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
2ac0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
2ad0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
2ae0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
2af0: 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ong..*/.int sqli
2b00: 74 65 33 4f 73 52 65 61 64 28 4f 73 46 69 6c 65  te3OsRead(OsFile
2b10: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66   *id, void *pBuf
2b20: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57  , int amt){.  DW
2b30: 4f 52 44 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  ORD got;.  asser
2b40: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
2b50: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2b60: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
2b70: 3b 0a 20 20 54 52 41 43 45 33 28 22 52 45 41 44  ;.  TRACE3("READ
2b80: 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20   %d lock=%d\n", 
2b90: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74  id->h, id->lockt
2ba0: 79 70 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61  ype);.  if( !Rea
2bb0: 64 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75  dFile(id->h, pBu
2bc0: 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29  f, amt, &got, 0)
2bd0: 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b   ){.    got = 0;
2be0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d  .  }.  if( got==
2bf0: 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
2c00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c10: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2c30: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
2c40: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
2c50: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
2c60: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
2c70: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
2c80: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
2c90: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
2ca0: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
2cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72  .int sqlite3OsWr
2cc0: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ite(OsFile *id, 
2cd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
2ce0: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e  , int amt){.  in
2cf0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
2d00: 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73 65 72  D wrote;.  asser
2d10: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
2d20: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2d30: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
2d40: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
2d50: 66 75 6c 6c 45 72 72 6f 72 3b 0a 20 20 54 52 41  fullError;.  TRA
2d60: 43 45 33 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE3("WRITE %d lo
2d70: 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c  ck=%d\n", id->h,
2d80: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a   id->locktype);.
2d90: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
2da0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  );.  while( amt>
2db0: 30 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65  0 && (rc = Write
2dc0: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  File(id->h, pBuf
2dd0: 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30  , amt, &wrote, 0
2de0: 29 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e 30  ))!=0 && wrote>0
2df0: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
2e00: 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
2e10: 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
2e20: 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66  wrote];.  }.  if
2e30: 28 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e  ( !rc || amt>(in
2e40: 74 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72  t)wrote ){.    r
2e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
2e60: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
2e70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e80: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61  .** Move the rea
2e90: 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20  d/write pointer 
2ea0: 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  in a file..*/.in
2eb0: 74 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  t sqlite3OsSeek(
2ec0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  OsFile *id, i64 
2ed0: 6f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  offset){.  LONG 
2ee0: 75 70 70 65 72 42 69 74 73 20 3d 20 6f 66 66 73  upperBits = offs
2ef0: 65 74 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c  et>>32;.  LONG l
2f00: 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65  owerBits = offse
2f10: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a  t & 0xffffffff;.
2f20: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 61 73    DWORD rc;.  as
2f30: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
2f40: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
2f50: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66 66  E_TEST.  if( off
2f60: 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44 69  set ) SimulateDi
2f70: 73 6b 66 75 6c 6c 45 72 72 6f 72 0a 23 65 6e 64  skfullError.#end
2f80: 69 66 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74  if.  SEEK(offset
2f90: 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20 20 72 63  /1024 + 1);.  rc
2fa0: 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   = SetFilePointe
2fb0: 72 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  r(id->h, lowerBi
2fc0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
2fd0: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 54  FILE_BEGIN);.  T
2fe0: 52 41 43 45 33 28 22 53 45 45 4b 20 25 64 20 25  RACE3("SEEK %d %
2ff0: 6c 6c 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6f  lld\n", id->h, o
3000: 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e  ffset);.  return
3010: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3020: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
3030: 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
3040: 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
3050: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
3060: 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
3070: 69 74 65 33 4f 73 53 79 6e 63 28 4f 73 46 69 6c  ite3OsSync(OsFil
3080: 65 20 2a 69 64 2c 20 69 6e 74 20 64 61 74 61 4f  e *id, int dataO
3090: 6e 6c 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nly){.  assert( 
30a0: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
30b0: 54 52 41 43 45 33 28 22 53 59 4e 43 20 25 64 20  TRACE3("SYNC %d 
30c0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e  lock=%d\n", id->
30d0: 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29  h, id->locktype)
30e0: 3b 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69 6c  ;.  if( FlushFil
30f0: 65 42 75 66 66 65 72 73 28 69 64 2d 3e 68 29 20  eBuffers(id->h) 
3100: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
3110: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
3120: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3130: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d  ITE_IOERR;.  }.}
3140: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
3150: 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72 6e   directory zDirn
3160: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e  ame. This is a n
3170: 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e  o-op on operatin
3180: 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72 0a  g systems other.
3190: 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2f  ** than UNIX..*/
31a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 79  .int sqlite3OsSy
31b0: 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  ncDirectory(cons
31c0: 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65  t char *zDirname
31d0: 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ){.  SimulateIOE
31e0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
31f0: 52 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  R);.  return SQL
3200: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3210: 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
3220: 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
3230: 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e  ified size.*/.in
3240: 74 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  t sqlite3OsTrunc
3250: 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ate(OsFile *id, 
3260: 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f  i64 nByte){.  LO
3270: 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 6e  NG upperBits = n
3280: 42 79 74 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65  Byte>>32;.  asse
3290: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
32a0: 3b 0a 20 20 54 52 41 43 45 33 28 22 54 52 55 4e  ;.  TRACE3("TRUN
32b0: 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c  CATE %d %lld\n",
32c0: 20 69 64 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a   id->h, nByte);.
32d0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
32e0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
32f0: 0a 20 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  .  SetFilePointe
3300: 72 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  r(id->h, nByte, 
3310: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
3320: 5f 42 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e  _BEGIN);.  SetEn
3330: 64 4f 66 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a  dOfFile(id->h);.
3340: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3350: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  OK;.}../*.** Det
3360: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
3370: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
3380: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e  e in bytes.*/.in
3390: 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  t sqlite3OsFileS
33a0: 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ize(OsFile *id, 
33b0: 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44  i64 *pSize){.  D
33c0: 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c 20  WORD upperBits, 
33d0: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 61 73 73  lowerBits;.  ass
33e0: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
33f0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
3400: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
3410: 52 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20  R);.  lowerBits 
3420: 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69 64  = GetFileSize(id
3430: 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29  ->h, &upperBits)
3440: 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28  ;.  *pSize = (((
3450: 69 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c  i64)upperBits)<<
3460: 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b  32) + lowerBits;
3470: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3480: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
3490: 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
34a0: 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
34b0: 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
34c0: 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
34d0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
34e0: 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
34f0: 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e   Win95 or WinNT.
3500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
3510: 65 74 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c  etReadLock(OsFil
3520: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 65  e *id){.  int re
3530: 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  s;.  if( isNT() 
3540: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
3550: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70  D ovlp;.    ovlp
3560: 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44  .Offset = SHARED
3570: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70  _FIRST;.    ovlp
3580: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b  .OffsetHigh = 0;
3590: 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74  .    ovlp.hEvent
35a0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20   = 0;.    res = 
35b0: 4c 6f 63 6b 46 69 6c 65 45 78 28 69 64 2d 3e 68  LockFileEx(id->h
35c0: 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  , LOCKFILE_FAIL_
35d0: 49 4d 4d 45 44 49 41 54 45 4c 59 2c 20 30 2c 20  IMMEDIATELY, 0, 
35e0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 30 2c 26 6f  SHARED_SIZE,0,&o
35f0: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
3600: 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73     int lk;.    s
3610: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
3620: 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
3630: 29 3b 0a 20 20 20 20 69 64 2d 3e 73 68 61 72 65  );.    id->share
3640: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20  dLockByte = (lk 
3650: 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53  & 0x7fffffff)%(S
3660: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
3670: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
3680: 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52 45  ile(id->h, SHARE
3690: 44 5f 46 49 52 53 54 2b 69 64 2d 3e 73 68 61 72  D_FIRST+id->shar
36a0: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
36b0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
36c0: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
36d0: 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
36f0: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 4f 73  nlockReadLock(Os
3700: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
3710: 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
3720: 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
3730: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
3740: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
3750: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
3760: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
3770: 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c   res = UnlockFil
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 20 2b 20 69 64 2d 3e 73 68 61 72  FIRST + id->shar
37a0: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
37b0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
37c0: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e 64  rn res;.}..#ifnd
37d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
37e0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a  AGER_PRAGMAS./*.
37f0: 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 20  ** Check that a 
3800: 67 69 76 65 6e 20 70 61 74 68 6e 61 6d 65 20 69  given pathname i
3810: 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  s a directory an
3820: 64 20 69 73 20 77 72 69 74 61 62 6c 65 20 0a 2a  d is writable .*
3830: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
3840: 4f 73 49 73 44 69 72 57 72 69 74 61 62 6c 65 28  OsIsDirWritable(
3850: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
3860: 0a 20 20 69 6e 74 20 66 69 6c 65 41 74 74 72 3b  .  int fileAttr;
3870: 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65 3b  .  WCHAR *zWide;
3880: 0a 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d  .  if( zDirname=
3890: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
38a0: 20 69 66 28 20 21 69 73 4e 54 28 29 20 26 26 20   if( !isNT() && 
38b0: 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
38c0: 3e 4d 41 58 5f 50 41 54 48 20 29 20 72 65 74 75  >MAX_PATH ) retu
38d0: 72 6e 20 30 3b 0a 20 20 7a 57 69 64 65 20 3d 20  rn 0;.  zWide = 
38e0: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 44  utf8ToUnicode(zD
38f0: 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  irname);.  if( z
3900: 57 69 64 65 20 29 7b 0a 20 20 20 20 66 69 6c 65  Wide ){.    file
3910: 41 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74  Attr = GetFileAt
3920: 74 72 69 62 75 74 65 73 57 28 7a 57 69 64 65 29  tributesW(zWide)
3930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3940: 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65  (zWide);.  }else
3950: 7b 0a 20 20 20 20 66 69 6c 65 41 74 74 72 20 3d  {.    fileAttr =
3960: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
3970: 65 73 41 28 7a 44 69 72 6e 61 6d 65 29 3b 0a 20  esA(zDirname);. 
3980: 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 41 74 74   }.  if( fileAtt
3990: 72 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66 20  r == 0xffffffff 
39a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
39b0: 28 20 28 66 69 6c 65 41 74 74 72 20 26 20 46 49  ( (fileAttr & FI
39c0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
39d0: 45 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45 5f  ECTORY) != FILE_
39e0: 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
39f0: 4f 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ORY ){.    retur
3a00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
3a10: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
3a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
3a30: 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f  ER_PRAGMAS */../
3a40: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
3a50: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
3a60: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
3a70: 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
3a80: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
3a90: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
3aa0: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
3ab0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
3ac0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
3ad0: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
3ae0: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
3af0: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
3b00: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
3b10: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
3b20: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
3b30: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
3b40: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
3b50: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
3b60: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
3b70: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
3b80: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
3b90: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
3ba0: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
3bb0: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
3bc0: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
3bd0: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
3be0: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
3bf0: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
3c00: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
3c10: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
3c20: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
3c30: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
3c40: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
3c50: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
3c60: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
3c70: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
3c80: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
3c90: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
3ca0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
3cb0: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
3cc0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
3cd0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
3ce0: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
3cf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3d00: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
3d10: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
3d20: 54 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  The sqlite3OsUnl
3d30: 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
3d40: 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
3d50: 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
3d60: 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
3d70: 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
3d80: 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
3d90: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
3da0: 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
3db0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
3dc0: 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
3dd0: 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
3de0: 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
3df0: 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 69 6e  g level 0..*/.in
3e00: 74 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  t sqlite3OsLock(
3e10: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
3e20: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
3e30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3e40: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
3e50: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
3e60: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
3e70: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
3e80: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77  /* Result of a w
3e90: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
3ea0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
3eb0: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
3ec0: 53 65 74 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  Set id->locktype
3ed0: 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62   to this value b
3ee0: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
3ef0: 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e  .  int gotPendin
3f00: 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75  gLock = 0;/* Tru
3f10: 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64  e if we acquired
3f20: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
3f30: 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 0a 20 20  this time */..  
3f40: 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70  assert( id->isOp
3f50: 65 6e 20 29 3b 0a 20 20 54 52 41 43 45 35 28 22  en );.  TRACE5("
3f60: 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25  LOCK %d %d was %
3f70: 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  d(%d)\n",.      
3f80: 20 20 20 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b 74      id->h, lockt
3f90: 79 70 65 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  ype, id->locktyp
3fa0: 65 2c 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63  e, id->sharedLoc
3fb0: 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  kByte);..  /* If
3fc0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
3fd0: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
3fe0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
3ff0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
4000: 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
4010: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
4020: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
4030: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
4040: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
4050: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
4060: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
4070: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 64  t..  */.  if( id
4080: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
4090: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
40a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
40b0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
40c0: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
40d0: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
40e0: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
40f0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e   id->locktype!=N
4100: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
4110: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
4120: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
4130: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
4140: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
4150: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
4160: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e  VED_LOCK || id->
4170: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
4180: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  _LOCK );..  /* L
4190: 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f  ock the PENDING_
41a0: 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20  LOCK byte if we 
41b0: 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  need to acquire 
41c0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f  a PENDING lock o
41d0: 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20  r.  ** a SHARED 
41e0: 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65  lock.  If we are
41f0: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
4200: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63  RED lock, the ac
4210: 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a  quisition of.  *
4220: 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  * the PENDING_LO
4230: 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f  CK byte is tempo
4240: 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77  rary..  */.  new
4250: 4c 6f 63 6b 74 79 70 65 20 3d 20 69 64 2d 3e 6c  Locktype = id->l
4260: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 69  ocktype;.  if( i
4270: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  d->locktype==NO_
4280: 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b  LOCK.   || (lock
4290: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
42a0: 4c 4f 43 4b 20 26 26 20 69 64 2d 3e 6c 6f 63 6b  LOCK && id->lock
42b0: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
42c0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
42d0: 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77  t cnt = 3;.    w
42e0: 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26  hile( cnt-->0 &&
42f0: 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65   (res = LockFile
4300: 28 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  (id->h, PENDING_
4310: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
4320: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
4330: 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
4340: 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
4350: 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e 67  ck.  The pending
4360: 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a 20   lock might be. 
4370: 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20       ** held by 
4380: 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20 70  another reader p
4390: 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c 20  rocess who will 
43a0: 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e  release it momen
43b0: 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  tarily..      */
43c0: 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 63  .      TRACE2("c
43d0: 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
43e0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
43f0: 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20  =%d\n", cnt);.  
4400: 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20      Sleep(1);.  
4410: 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69    }.    gotPendi
4420: 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20  ngLock = res;.  
4430: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
4440: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20  a shared lock.  
4450: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
4460: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
4470: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
4480: 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  ert( id->locktyp
4490: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
44a0: 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
44b0: 6f 63 6b 28 69 64 29 3b 0a 20 20 20 20 69 66 28  ock(id);.    if(
44c0: 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
44d0: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
44e0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
44f0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
4500: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
4510: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
4520: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
4530: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
4540: 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f    assert( id->lo
4550: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
4560: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
4570: 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c   LockFile(id->h,
4580: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
4590: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
45a0: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
45b0: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
45c0: 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
45d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
45e0: 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
45f0: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
4600: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
4610: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
4620: 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  .    newLocktype
4630: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
4640: 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
4650: 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ock = 0;.  }..  
4660: 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
4670: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a  CLUSIVE lock.  *
4680: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
4690: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
46a0: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
46b0: 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74  ssert( id->lockt
46c0: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
46d0: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e   );.    res = un
46e0: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 69 64 29  lockReadLock(id)
46f0: 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 75 6e  ;.    TRACE2("un
4700: 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
4710: 2c 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20  , res);.    res 
4720: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
4730: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
4740: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
4750: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
4760: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
4770: 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
4780: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
4790: 7b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  {.      TRACE2("
47a0: 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c  error-code = %d\
47b0: 6e 22 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72  n", GetLastError
47c0: 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ());.    }.  }..
47d0: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
47e0: 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
47f0: 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
4800: 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
4810: 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
4820: 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
4830: 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
4840: 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
4850: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
4860: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
4870: 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  id->h, PENDING_B
4880: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
4890: 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
48a0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
48b0: 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69   lock has held i
48c0: 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
48d0: 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20  iptor then.  ** 
48e0: 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  return the appro
48f0: 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f  priate result co
4900: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  de..  */.  if( r
4910: 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  es ){.    rc = S
4920: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
4930: 65 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22 4c  e{.    TRACE4("L
4940: 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72  OCK FAILED %d tr
4950: 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20  ying for %d but 
4960: 67 6f 74 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68  got %d\n", id->h
4970: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
4980: 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
4990: 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  pe);.    rc = SQ
49a0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
49b0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20   id->locktype = 
49c0: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  newLocktype;.  r
49d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
49e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
49f0: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
4a00: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
4a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
4a20: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
4a30: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
4a40: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
4a50: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
4a60: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
4a70: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
4a80: 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e  wise zero..*/.in
4a90: 74 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  t sqlite3OsCheck
4aa0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46  ReservedLock(OsF
4ab0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
4ac0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
4ad0: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66  ->isOpen );.  if
4ae0: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  ( id->locktype>=
4af0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
4b00: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
4b10: 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52   TRACE3("TEST WR
4b20: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63  -LOCK %d %d (loc
4b30: 61 6c 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 72  al)\n", id->h, r
4b40: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  c);.  }else{.   
4b50: 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69   rc = LockFile(i
4b60: 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  d->h, RESERVED_B
4b70: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
4b80: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
4b90: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64     UnlockFile(id
4ba0: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
4bb0: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
4bc0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
4bd0: 3b 0a 20 20 20 20 54 52 41 43 45 33 28 22 54 45  ;.    TRACE3("TE
4be0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
4bf0: 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 69 64   (remote)\n", id
4c00: 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ->h, rc);.  }.  
4c10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4c20: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
4c30: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
4c40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
4c50: 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  d to locktype.  
4c60: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
4c70: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
4c80: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
4c90: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
4ca0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
4cb0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
4cc0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
4cd0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
4ce0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
4cf0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
4d00: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
4d10: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  -op..**.** It is
4d20: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
4d30: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
4d40: 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65  o fail if the se
4d50: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
4d60: 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66   is NO_LOCK.  If
4d70: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4d80: 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c  ment is SHARED_L
4d90: 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OCK then this ro
4da0: 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72  utine.** might r
4db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
4dc0: 52 52 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  RR;.*/.int sqlit
4dd0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c  e3OsUnlock(OsFil
4de0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
4df0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
4e00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4e10: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
4e20: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
4e30: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
4e40: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
4e50: 29 3b 0a 20 20 54 52 41 43 45 35 28 22 55 4e 4c  );.  TRACE5("UNL
4e60: 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73  OCK %d to %d was
4e70: 20 25 64 28 25 64 29 5c 6e 22 2c 20 69 64 2d 3e   %d(%d)\n", id->
4e80: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
4e90: 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74         id->lockt
4ea0: 79 70 65 2c 20 69 64 2d 3e 73 68 61 72 65 64 4c  ype, id->sharedL
4eb0: 6f 63 6b 42 79 74 65 29 3b 0a 20 20 74 79 70 65  ockByte);.  type
4ec0: 20 3d 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3b   = id->locktype;
4ed0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
4ee0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
4ef0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64     UnlockFile(id
4f00: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
4f10: 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
4f20: 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
4f30: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
4f40: 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64  LOCK && !getRead
4f50: 4c 6f 63 6b 28 69 64 29 20 29 7b 0a 20 20 20 20  Lock(id) ){.    
4f60: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
4f70: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
4f80: 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
4f90: 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
4fa0: 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
4fb0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
4fc0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4fd0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
4fe0: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
4ff0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
5000: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69      UnlockFile(i
5010: 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  d->h, RESERVED_B
5020: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
5030: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
5040: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
5050: 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
5060: 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
5070: 64 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 7d 0a 20  dLock(id);.  }. 
5080: 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
5090: 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55  NG_LOCK ){.    U
50a0: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
50b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
50c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
50d0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  d->locktype = lo
50e0: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
50f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75   rc;.}../*.** Tu
5100: 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
5110: 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
5120: 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  ll pathname.  Re
5130: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
5140: 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70 61  * to the full pa
5150: 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69 6e  thname stored in
5160: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
5170: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5180: 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  c()..** The call
5190: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
51a0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
51b0: 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70 61  freeing this spa
51c0: 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73  ce once it.** is
51d0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65   no longer neede
51e0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
51f0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
5200: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52  e(const char *zR
5210: 65 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72  elative){.  char
5220: 20 2a 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 63 68   *zNotUsed;.  ch
5230: 61 72 20 2a 7a 46 75 6c 6c 3b 0a 20 20 57 43 48  ar *zFull;.  WCH
5240: 41 52 20 2a 7a 57 69 64 65 3b 0a 20 20 69 6e 74  AR *zWide;.  int
5250: 20 6e 42 79 74 65 3b 0a 23 69 66 64 65 66 20 5f   nByte;.#ifdef _
5260: 5f 43 59 47 57 49 4e 5f 5f 0a 20 20 6e 42 79 74  _CYGWIN__.  nByt
5270: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 6c 61  e = strlen(zRela
5280: 74 69 76 65 29 20 2b 20 4d 41 58 5f 50 41 54 48  tive) + MAX_PATH
5290: 20 2b 20 31 30 30 31 3b 0a 20 20 7a 46 75 6c 6c   + 1001;.  zFull
52a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
52b0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
52c0: 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  zFull==0 ) retur
52d0: 6e 20 30 3b 0a 20 20 69 66 28 20 63 79 67 77 69  n 0;.  if( cygwi
52e0: 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77  n_conv_to_full_w
52f0: 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74  in32_path(zRelat
5300: 69 76 65 2c 20 7a 46 75 6c 6c 29 20 29 20 72 65  ive, zFull) ) re
5310: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
5320: 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  zWide = utf8ToUn
5330: 69 63 6f 64 65 28 7a 52 65 6c 61 74 69 76 65 29  icode(zRelative)
5340: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b  ;.  if( zWide ){
5350: 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d  .    WCHAR *zTem
5360: 70 2c 20 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a 20  p, *zNotUsedW;. 
5370: 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75     nByte = GetFu
5380: 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69 64  llPathNameW(zWid
5390: 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  e, 0, 0, &zNotUs
53a0: 65 64 57 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54  edW) + 1;.    zT
53b0: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
53c0: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
53d0: 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
53e0: 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
53f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 47   return 0;.    G
5400: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
5410: 7a 57 69 64 65 2c 20 6e 42 79 74 65 2c 20 7a 54  zWide, nByte, zT
5420: 65 6d 70 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29  emp, &zNotUsedW)
5430: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5440: 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 7a 46 75  (zWide);.    zFu
5450: 6c 6c 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ll = unicodeToUt
5460: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
5470: 71 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70 29  qliteFree(zTemp)
5480: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
5490: 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61  Byte = GetFullPa
54a0: 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69 76  thNameA(zRelativ
54b0: 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  e, 0, 0, &zNotUs
54c0: 65 64 29 20 2b 20 31 3b 0a 20 20 20 20 7a 46 75  ed) + 1;.    zFu
54d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
54e0: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
54f0: 7a 46 75 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20 20  zFull[0]) );.   
5500: 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20   if( zFull==0 ) 
5510: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 47 65  return 0;.    Ge
5520: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 7a  tFullPathNameA(z
5530: 52 65 6c 61 74 69 76 65 2c 20 6e 42 79 74 65 2c  Relative, nByte,
5540: 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65   zFull, &zNotUse
5550: 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
5560: 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d   return zFull;.}
5570: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5580: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
5590: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
55a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
55e0: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f  * Everything abo
55f0: 76 65 20 64 65 61 6c 73 20 77 69 74 68 20 66 69  ve deals with fi
5600: 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68  le I/O.  Everyth
5610: 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ing that follows
5620: 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f   deals.** with o
5630: 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75  ther miscellanou
5640: 73 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65  s aspects of the
5650: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
5660: 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a  m interface.****
5670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56b0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
56c0: 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Get information
56d0: 20 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e   to seed the ran
56e0: 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
56f0: 61 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a  ator.  The seed.
5700: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ** is written in
5710: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42  to the buffer zB
5720: 75 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61  uf[256].  The ca
5730: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
5740: 75 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20  ust.** supply a 
5750: 73 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72  sufficiently lar
5760: 67 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e  ge buffer..*/.in
5770: 74 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f  t sqlite3OsRando
5780: 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75 66  mSeed(char *zBuf
5790: 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ){.  /* We have 
57a0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
57b0: 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
57c0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
57d0: 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
57e0: 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
57f0: 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
5800: 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
5810: 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
5820: 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
5830: 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
5840: 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
5850: 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
5860: 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
5870: 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
5880: 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
5890: 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
58a0: 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
58b0: 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
58c0: 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
58d0: 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
58e0: 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
58f0: 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
5900: 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
5910: 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
5920: 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
5930: 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
5940: 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
5950: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
5960: 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
5970: 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
5980: 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
5990: 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
59a0: 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
59b0: 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
59c0: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
59d0: 65 71 75 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d  equence.* This m
59e0: 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
59f0: 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
5a00: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
5a10: 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 20 20 47  uf, 0, 256);.  G
5a20: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50  etSystemTime((LP
5a30: 53 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29  SYSTEMTIME)zBuf)
5a40: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5a50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
5a60: 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
5a70: 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
5a80: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
5a90: 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
5aa0: 74 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70  t sqlite3OsSleep
5ab0: 28 69 6e 74 20 6d 73 29 7b 0a 20 20 53 6c 65 65  (int ms){.  Slee
5ac0: 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  p(ms);.  return 
5ad0: 6d 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  ms;.}../*.** Sta
5ae0: 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73  tic variables us
5af0: 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73 79  ed for thread sy
5b00: 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f  nchronization.*/
5b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d 75  .static int inMu
5b20: 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  tex = 0;.#ifdef 
5b30: 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41  SQLITE_W32_THREA
5b40: 44 53 0a 20 20 73 74 61 74 69 63 20 43 52 49 54  DS.  static CRIT
5b50: 49 43 41 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b  ICAL_SECTION cs;
5b60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5b70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69  he following pai
5b80: 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70  r of routine imp
5b90: 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78  lement mutual ex
5ba0: 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d  clusion for.** m
5bb0: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70 72  ulti-threaded pr
5bc0: 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61  ocesses.  Only a
5bd0: 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69   single thread i
5be0: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20  s allowed to.** 
5bf0: 65 78 65 63 75 74 65 64 20 63 6f 64 65 20 74 68  executed code th
5c00: 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64  at is surrounded
5c10: 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29   by EnterMutex()
5c20: 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28   and LeaveMutex(
5c30: 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  )..**.** SQLite 
5c40: 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  uses only a sing
5c50: 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65  le Mutex.  There
5c60: 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69   is not much cri
5c70: 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e  tical.** code an
5c80: 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68  d what little th
5c90: 65 72 65 20 69 73 20 65 78 65 63 75 74 65 73 20  ere is executes 
5ca0: 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68  quickly and with
5cb0: 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  out blocking..*/
5cc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 45  .void sqlite3OsE
5cd0: 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66  nterMutex(){.#if
5ce0: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  def SQLITE_W32_T
5cf0: 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63 20  HREADS.  static 
5d00: 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a  int isInit = 0;.
5d10: 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69 74    while( !isInit
5d20: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 6c   ){.    static l
5d30: 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20  ong lock = 0;.  
5d40: 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65    if( Interlocke
5d50: 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b  dIncrement(&lock
5d60: 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 49 6e  )==1 ){.      In
5d70: 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61 6c  itializeCritical
5d80: 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20  Section(&cs);.  
5d90: 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a      isInit = 1;.
5da0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5db0: 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d   Sleep(1);.    }
5dc0: 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72 69 74  .  }.  EnterCrit
5dd0: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29  icalSection(&cs)
5de0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
5df0: 74 28 20 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20  t( !inMutex );. 
5e00: 20 69 6e 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a   inMutex = 1;.}.
5e10: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 4c 65  void sqlite3OsLe
5e20: 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61 73  aveMutex(){.  as
5e30: 73 65 72 74 28 20 69 6e 4d 75 74 65 78 20 29 3b  sert( inMutex );
5e40: 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a  .  inMutex = 0;.
5e50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33  #ifdef SQLITE_W3
5e60: 32 5f 54 48 52 45 41 44 53 0a 20 20 4c 65 61 76  2_THREADS.  Leav
5e70: 65 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e  eCriticalSection
5e80: 28 26 63 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  (&cs);.#endif.}.
5e90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
5ea0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
5eb0: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
5ec0: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
5ed0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
5ee0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
5ef0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
5f00: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
5f10: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
5f20: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5f30: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
5f40: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
5f50: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
5f60: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
5f70: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
5f80: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
5f90: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
5fa0: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
5fb0: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
5fc0: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
5fd0: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
5fe0: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
5ff0: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
6000: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
6010: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
6020: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6030: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 64  3OsCurrentTime(d
6040: 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
6050: 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
6060: 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
6070: 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
6080: 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
6090: 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
60a0: 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
60b0: 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
60c0: 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
60d0: 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
60e0: 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
60f0: 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20    double now;.  
6100: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
6110: 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
6120: 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65    now = ((double
6130: 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
6140: 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39 36  me) * 4294967296
6150: 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  .0; .  *prNow = 
6160: 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44  (now + ft.dwLowD
6170: 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30  ateTime)/8640000
6180: 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31  00000.0 + 230581
6190: 33 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  3.5;.#ifdef SQLI
61a0: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
61b0: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
61c0: 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  me ){.    *prNow
61d0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65   = sqlite3_curre
61e0: 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20  nt_time/86400.0 
61f0: 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d  + 2440587.5;.  }
6200: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
6210: 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a   0;.}..#endif /*
6220: 20 4f 53 5f 57 49 4e 20 2a 2f 0a                  OS_WIN */.