/ Hex Artifact Content
Login

Artifact fbccc85e7011174068c27d54256746321a1f0059:


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 53 6f 6d 65 20 6d 69 63 72 6f 73 6f  .** Some microso
2e90: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
2ea0: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
2eb0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
2ec0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
2ed0: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
2ee0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
2ef0: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
2f00: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
2f10: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64  ** Move the read
2f20: 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69  /write pointer i
2f30: 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  n a file..*/.int
2f40: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 4f   sqlite3OsSeek(O
2f50: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  sFile *id, i64 o
2f60: 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75  ffset){.  LONG u
2f70: 70 70 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65  pperBits = offse
2f80: 74 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  t>>32;.  LONG lo
2f90: 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74  werBits = offset
2fa0: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   & 0xffffffff;. 
2fb0: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 61 73 73   DWORD rc;.  ass
2fc0: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
2fd0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2fe0: 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66 66 73  _TEST.  if( offs
2ff0: 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44 69 73  et ) SimulateDis
3000: 6b 66 75 6c 6c 45 72 72 6f 72 0a 23 65 6e 64 69  kfullError.#endi
3010: 66 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f  f.  SEEK(offset/
3020: 31 30 32 34 20 2b 20 31 29 3b 0a 20 20 72 63 20  1024 + 1);.  rc 
3030: 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  = SetFilePointer
3040: 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  (id->h, lowerBit
3050: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
3060: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 54 52  ILE_BEGIN);.  TR
3070: 41 43 45 33 28 22 53 45 45 4b 20 25 64 20 25 6c  ACE3("SEEK %d %l
3080: 6c 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6f 66  ld\n", id->h, of
3090: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
30a0: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
30b0: 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74  E_POINTER && Get
30c0: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f  LastError()!=NO_
30d0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ERROR ){.    ret
30e0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
30f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3100: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3110: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
3120: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
3130: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
3140: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
3150: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
3160: 33 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  3OsSync(OsFile *
3170: 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  id, int dataOnly
3180: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  ){.  assert( id-
3190: 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 54 52 41  >isOpen );.  TRA
31a0: 43 45 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63  CE3("SYNC %d loc
31b0: 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  k=%d\n", id->h, 
31c0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  id->locktype);. 
31d0: 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75   if( FlushFileBu
31e0: 66 66 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a  ffers(id->h) ){.
31f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3200: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
3210: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3220: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _IOERR;.  }.}../
3230: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69  *.** Sync the di
3240: 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65  rectory zDirname
3250: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
3260: 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73  p on operating s
3270: 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20  ystems other.** 
3280: 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e  than UNIX..*/.in
3290: 74 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44  t sqlite3OsSyncD
32a0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
32b0: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a  har *zDirname){.
32c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
32d0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
32e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
3300: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
3310: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
3320: 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ed size.*/.int s
3330: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
3340: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
3350: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20   nByte){.  LONG 
3360: 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74  upperBits = nByt
3370: 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28  e>>32;.  assert(
3380: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20   id->isOpen );. 
3390: 20 54 52 41 43 45 33 28 22 54 52 55 4e 43 41 54   TRACE3("TRUNCAT
33a0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 69 64  E %d %lld\n", id
33b0: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53  ->h, nByte);.  S
33c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
33d0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
33e0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  SetFilePointer(i
33f0: 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75 70  d->h, nByte, &up
3400: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
3410: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66  GIN);.  SetEndOf
3420: 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 72  File(id->h);.  r
3430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
3450: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
3460: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
3470: 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e 74 20 73  n bytes.*/.int s
3480: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
3490: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
34a0: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52   *pSize){.  DWOR
34b0: 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77  D upperBits, low
34c0: 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65 72 74  erBits;.  assert
34d0: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
34e0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
34f0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
3500: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47  .  lowerBits = G
3510: 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d 3e 68  etFileSize(id->h
3520: 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20  , &upperBits);. 
3530: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 69 36 34   *pSize = (((i64
3540: 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
3550: 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
3560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
3580: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
3590: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
35a0: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
35b0: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
35c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
35d0: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
35e0: 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n95 or WinNT..*/
35f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
3600: 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  eadLock(OsFile *
3610: 69 64 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  id){.  int res;.
3620: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
3630: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
3640: 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  vlp;.    ovlp.Of
3650: 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49  fset = SHARED_FI
3660: 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  RST;.    ovlp.Of
3670: 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20  fsetHigh = 0;.  
3680: 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20    ovlp.hEvent = 
3690: 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  0;.    res = Loc
36a0: 6b 46 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c  kFileEx(id->h, L
36b0: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
36c0: 45 44 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41  EDIATELY, 0, SHA
36d0: 52 45 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70  RED_SIZE,0,&ovlp
36e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36f0: 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69  int lk;.    sqli
3700: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
3710: 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
3720: 20 20 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f      id->sharedLo
3730: 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30  ckByte = (lk & 0
3740: 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
3750: 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
3760: 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65    res = LockFile
3770: 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  (id->h, SHARED_F
3780: 49 52 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c  IRST+id->sharedL
3790: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
37a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37b0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
37c0: 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
37d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f  .static int unlo
37e0: 63 6b 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c  ckReadLock(OsFil
37f0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 65  e *id){.  int re
3800: 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  s;.  if( isNT() 
3810: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c  ){.    res = Unl
3820: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53  ockFile(id->h, S
3830: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
3840: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
3850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
3860: 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69  s = UnlockFile(i
3870: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  d->h, SHARED_FIR
3880: 53 54 20 2b 20 69 64 2d 3e 73 68 61 72 65 64 4c  ST + id->sharedL
3890: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
38a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
38b0: 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  res;.}..#ifndef 
38c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
38d0: 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20  R_PRAGMAS./*.** 
38e0: 43 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76  Check that a giv
38f0: 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61  en pathname is a
3900: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69   directory and i
3910: 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a  s writable .**.*
3920: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 49  /.int sqlite3OsI
3930: 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61  sDirWritable(cha
3940: 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20 20  r *zDirname){.  
3950: 69 6e 74 20 66 69 6c 65 41 74 74 72 3b 0a 20 20  int fileAttr;.  
3960: 57 43 48 41 52 20 2a 7a 57 69 64 65 3b 0a 20 20  WCHAR *zWide;.  
3970: 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d 3d 30 20  if( zDirname==0 
3980: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
3990: 28 20 21 69 73 4e 54 28 29 20 26 26 20 73 74 72  ( !isNT() && str
39a0: 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3e 4d 41  len(zDirname)>MA
39b0: 58 5f 50 41 54 48 20 29 20 72 65 74 75 72 6e 20  X_PATH ) return 
39c0: 30 3b 0a 20 20 7a 57 69 64 65 20 3d 20 75 74 66  0;.  zWide = utf
39d0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 44 69 72 6e  8ToUnicode(zDirn
39e0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ame);.  if( zWid
39f0: 65 20 29 7b 0a 20 20 20 20 66 69 6c 65 41 74 74  e ){.    fileAtt
3a00: 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  r = GetFileAttri
3a10: 62 75 74 65 73 57 28 7a 57 69 64 65 29 3b 0a 20  butesW(zWide);. 
3a20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57     sqliteFree(zW
3a30: 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ide);.  }else{. 
3a40: 20 20 20 66 69 6c 65 41 74 74 72 20 3d 20 47 65     fileAttr = Ge
3a50: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3a60: 28 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 7d 0a  (zDirname);.  }.
3a70: 20 20 69 66 28 20 66 69 6c 65 41 74 74 72 20 3d    if( fileAttr =
3a80: 3d 20 30 78 66 66 66 66 66 66 66 66 20 29 20 72  = 0xffffffff ) r
3a90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
3aa0: 66 69 6c 65 41 74 74 72 20 26 20 46 49 4c 45 5f  fileAttr & FILE_
3ab0: 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
3ac0: 4f 52 59 29 20 21 3d 20 46 49 4c 45 5f 41 54 54  ORY) != FILE_ATT
3ad0: 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
3ae0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
3b00: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3b10: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3b20: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f 2a 0a 2a  PRAGMAS */../*.*
3b30: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
3b40: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
3b50: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
3b60: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
3b70: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
3b80: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
3b90: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
3ba0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
3bb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
3bc0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
3bd0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
3be0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
3bf0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
3c00: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
3c10: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
3c20: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
3c30: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
3c40: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
3c50: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
3c60: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
3c70: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
3c80: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
3c90: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
3ca0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
3cb0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
3cc0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
3cd0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
3ce0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
3cf0: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
3d00: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
3d10: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
3d20: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
3d30: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
3d40: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
3d50: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
3d60: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
3d70: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
3d80: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
3d90: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
3da0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
3db0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
3dc0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
3dd0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
3de0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3df0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
3e00: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
3e10: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
3e20: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
3e30: 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
3e40: 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
3e50: 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
3e60: 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
3e70: 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
3e80: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
3e90: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
3ea0: 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
3eb0: 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
3ec0: 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
3ed0: 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
3ee0: 65 76 65 6c 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  evel 0..*/.int s
3ef0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 4f 73 46  qlite3OsLock(OsF
3f00: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
3f10: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
3f20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
3f30: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3f40: 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73  from subroutines
3f50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
3f60: 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
3f70: 52 65 73 75 6c 74 20 6f 66 20 61 20 77 69 6e 64  Result of a wind
3f80: 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f  ows lock call */
3f90: 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79  .  int newLockty
3fa0: 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74  pe;       /* Set
3fb0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f   id->locktype to
3fc0: 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
3fd0: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
3fe0: 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
3ff0: 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
4000: 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
4010: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
4020: 73 20 74 69 6d 65 20 2a 2f 0a 0a 20 20 61 73 73  s time */..  ass
4030: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
4040: 29 3b 0a 20 20 54 52 41 43 45 35 28 22 4c 4f 43  );.  TRACE5("LOC
4050: 4b 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25  K %d %d was %d(%
4060: 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
4070: 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65   id->h, locktype
4080: 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  , id->locktype, 
4090: 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  id->sharedLockBy
40a0: 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  te);..  /* If th
40b0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
40c0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
40d0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
40e0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
40f0: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
4100: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
4110: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
4120: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
4130: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
4140: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
4150: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
4160: 20 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 6c    */.  if( id->l
4170: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
4180: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
4190: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
41a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
41b0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
41c0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
41d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 64   */.  assert( id
41e0: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
41f0: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
4200: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
4210: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
4220: 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
4230: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
4240: 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
4250: 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e 6c 6f 63  _LOCK || id->loc
4260: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
4270: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
4280: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
4290: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
42a0: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
42b0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
42c0: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
42d0: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
42e0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
42f0: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
4300: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
4310: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
4320: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
4330: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
4340: 6b 74 79 70 65 20 3d 20 69 64 2d 3e 6c 6f 63 6b  ktype = id->lock
4350: 74 79 70 65 3b 0a 20 20 69 66 28 20 69 64 2d 3e  type;.  if( id->
4360: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
4370: 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70  K.   || (locktyp
4380: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
4390: 4b 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  K && id->locktyp
43a0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
43b0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
43c0: 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
43d0: 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
43e0: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64  es = LockFile(id
43f0: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
4400: 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
4410: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
4420: 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
4430: 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
4440: 20 20 54 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f    The pending lo
4450: 63 6b 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ck might be.    
4460: 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f    ** held by ano
4470: 74 68 65 72 20 72 65 61 64 65 72 20 70 72 6f 63  ther reader proc
4480: 65 73 73 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c  ess who will rel
4490: 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72  ease it momentar
44a0: 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ily..      */.  
44b0: 20 20 20 20 54 52 41 43 45 32 28 22 63 6f 75 6c      TRACE2("coul
44c0: 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44  d not get a PEND
44d0: 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64  ING lock. cnt=%d
44e0: 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20  \n", cnt);.     
44f0: 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d   Sleep(1);.    }
4500: 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
4510: 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a  ock = res;.  }..
4520: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
4530: 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
4540: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
4550: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
4560: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
4570: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  ( id->locktype==
4580: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
4590: 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b  es = getReadLock
45a0: 28 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 65  (id);.    if( re
45b0: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
45c0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
45d0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
45e0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
45f0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
4600: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
4610: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
4620: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
4630: 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74  ssert( id->lockt
4640: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
4650: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f   );.    res = Lo
4660: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52 45  ckFile(id->h, RE
4670: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
4680: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
4690: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
46a0: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
46b0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
46c0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
46d0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
46e0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
46f0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
4700: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
4710: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
4720: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
4730: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
4740: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
4750: 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
4760: 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
4770: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
4780: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
4790: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
47a0: 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  rt( id->locktype
47b0: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
47c0: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
47d0: 6b 52 65 61 64 4c 6f 63 6b 28 69 64 29 3b 0a 20  kReadLock(id);. 
47e0: 20 20 20 54 52 41 43 45 32 28 22 75 6e 72 65 61     TRACE2("unrea
47f0: 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72  dlock = %d\n", r
4800: 65 73 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  es);.    res = L
4810: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53  ockFile(id->h, S
4820: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
4830: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
4840: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
4850: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
4860: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
4870: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
4880: 20 20 20 20 20 54 52 41 43 45 32 28 22 65 72 72       TRACE2("err
4890: 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c  or-code = %d\n",
48a0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
48b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
48c0: 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
48d0: 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
48e0: 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
48f0: 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
4900: 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
4910: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
4920: 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
4930: 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
4940: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
4950: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d    UnlockFile(id-
4960: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
4970: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
4980: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
4990: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f   state of the lo
49a0: 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74  ck has held in t
49b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
49c0: 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74  or then.  ** ret
49d0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
49e0: 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  ate result code.
49f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20  .  */.  if( res 
4a00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
4a10: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
4a20: 20 20 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b      TRACE4("LOCK
4a30: 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e   FAILED %d tryin
4a40: 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74  g for %d but got
4a50: 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 0a 20   %d\n", id->h,. 
4a60: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
4a70: 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
4a80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
4a90: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 69 64  E_BUSY;.  }.  id
4aa0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77  ->locktype = new
4ab0: 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  Locktype;.  retu
4ac0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
4ae0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
4af0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
4b00: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
4b10: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
4b20: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
4b30: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
4b40: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
4b50: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
4b60: 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
4b70: 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  e zero..*/.int s
4b80: 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
4b90: 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65  ervedLock(OsFile
4ba0: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b   *id){.  int rc;
4bb0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69  .  assert( id->i
4bc0: 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 69  sOpen );.  if( i
4bd0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  d->locktype>=RES
4be0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
4bf0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 54 52    rc = 1;.    TR
4c00: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
4c10: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29  CK %d %d (local)
4c20: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 72 63 29 3b  \n", id->h, rc);
4c30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4c40: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   = LockFile(id->
4c50: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
4c60: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
4c70: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
4c80: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
4c90: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
4ca0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
4cb0: 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
4cc0: 20 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20     TRACE3("TEST 
4cd0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
4ce0: 65 6d 6f 74 65 29 5c 6e 22 2c 20 69 64 2d 3e 68  emote)\n", id->h
4cf0: 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rc);.  }.  ret
4d00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4d10: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
4d20: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
4d30: 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74   descriptor id t
4d40: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
4d50: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
4d60: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
4d70: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
4d80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
4d90: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
4da0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
4db0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
4dc0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
4dd0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
4de0: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
4df0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
4e00: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ..**.** It is no
4e10: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
4e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  his routine to f
4e30: 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ail if the secon
4e40: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
4e50: 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68   NO_LOCK.  If th
4e60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
4e70: 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  t is SHARED_LOCK
4e80: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
4e90: 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75  ne.** might retu
4ea0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
4eb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
4ec0: 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  sUnlock(OsFile *
4ed0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
4ee0: 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
4ef0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4f00: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  _OK;.  assert( i
4f10: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 61  d->isOpen );.  a
4f20: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
4f30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
4f40: 20 20 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b    TRACE5("UNLOCK
4f50: 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64   %d to %d was %d
4f60: 28 25 64 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  (%d)\n", id->h, 
4f70: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
4f80: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65      id->locktype
4f90: 2c 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  , id->sharedLock
4fa0: 42 79 74 65 29 3b 0a 20 20 74 79 70 65 20 3d 20  Byte);.  type = 
4fb0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  id->locktype;.  
4fc0: 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
4fd0: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
4fe0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
4ff0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
5000: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
5010: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
5020: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
5030: 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63  K && !getReadLoc
5040: 6b 28 69 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  k(id) ){.      /
5050: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
5060: 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
5070: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
5080: 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
5090: 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
50a0: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
50b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
50c0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
50d0: 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
50e0: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
50f0: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   UnlockFile(id->
5100: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
5110: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
5120: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
5130: 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
5140: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
5150: 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f      unlockReadLo
5160: 63 6b 28 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66  ck(id);.  }.  if
5170: 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
5180: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
5190: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 50 45  ckFile(id->h, PE
51a0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
51b0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e  , 0);.  }.  id->
51c0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
51d0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
51e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
51f0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
5200: 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
5210: 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72  pathname.  Retur
5220: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
5230: 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  o the full pathn
5240: 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70  ame stored in sp
5250: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
5260: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
5270: 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
5280: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
5290: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
52a0: 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20  eing this space 
52b0: 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  once it.** is no
52c0: 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a   longer needed..
52d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
52e0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63  OsFullPathname(c
52f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
5300: 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  tive){.  char *z
5310: 4e 6f 74 55 73 65 64 3b 0a 20 20 63 68 61 72 20  NotUsed;.  char 
5320: 2a 7a 46 75 6c 6c 3b 0a 20 20 57 43 48 41 52 20  *zFull;.  WCHAR 
5330: 2a 7a 57 69 64 65 3b 0a 20 20 69 6e 74 20 6e 42  *zWide;.  int nB
5340: 79 74 65 3b 0a 23 69 66 64 65 66 20 5f 5f 43 59  yte;.#ifdef __CY
5350: 47 57 49 4e 5f 5f 0a 20 20 6e 42 79 74 65 20 3d  GWIN__.  nByte =
5360: 20 73 74 72 6c 65 6e 28 7a 52 65 6c 61 74 69 76   strlen(zRelativ
5370: 65 29 20 2b 20 4d 41 58 5f 50 41 54 48 20 2b 20  e) + MAX_PATH + 
5380: 31 30 30 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20  1001;.  zFull = 
5390: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
53a0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  yte );.  if( zFu
53b0: 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ll==0 ) return 0
53c0: 3b 0a 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63  ;.  if( cygwin_c
53d0: 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33  onv_to_full_win3
53e0: 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65  2_path(zRelative
53f0: 2c 20 7a 46 75 6c 6c 29 20 29 20 72 65 74 75 72  , zFull) ) retur
5400: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 7a 57 69  n 0;.#else.  zWi
5410: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
5420: 64 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  de(zRelative);. 
5430: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20   if( zWide ){.  
5440: 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 2c 20    WCHAR *zTemp, 
5450: 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a 20 20 20 20  *zNotUsedW;.    
5460: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
5470: 61 74 68 4e 61 6d 65 57 28 7a 57 69 64 65 2c 20  athNameW(zWide, 
5480: 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 57  0, 0, &zNotUsedW
5490: 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54 65 6d 70  ) + 1;.    zTemp
54a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
54b0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
54c0: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
54d0: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 20 72 65  f( zTemp==0 ) re
54e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 47 65 74 46  turn 0;.    GetF
54f0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69  ullPathNameW(zWi
5500: 64 65 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  de, nByte, zTemp
5510: 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29 3b 0a 20  , &zNotUsedW);. 
5520: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57     sqliteFree(zW
5530: 69 64 65 29 3b 0a 20 20 20 20 7a 46 75 6c 6c 20  ide);.    zFull 
5540: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
5550: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
5560: 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  teFree(zTemp);. 
5570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 42 79 74   }else{.    nByt
5580: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
5590: 61 6d 65 41 28 7a 52 65 6c 61 74 69 76 65 2c 20  ameA(zRelative, 
55a0: 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  0, 0, &zNotUsed)
55b0: 20 2b 20 31 3b 0a 20 20 20 20 7a 46 75 6c 6c 20   + 1;.    zFull 
55c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
55d0: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 46 75  nByte*sizeof(zFu
55e0: 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  ll[0]) );.    if
55f0: 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74  ( zFull==0 ) ret
5600: 75 72 6e 20 30 3b 0a 20 20 20 20 47 65 74 46 75  urn 0;.    GetFu
5610: 6c 6c 50 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c  llPathNameA(zRel
5620: 61 74 69 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46  ative, nByte, zF
5630: 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  ull, &zNotUsed);
5640: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
5650: 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 23  turn zFull;.}..#
5660: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5670: 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f  OMIT_DISKIO */./
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45  ***********.** E
56d0: 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20  verything above 
56e0: 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20  deals with file 
56f0: 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67  I/O.  Everything
5700: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65   that follows de
5710: 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65  als.** with othe
5720: 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61  r miscellanous a
5730: 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70  spects of the op
5740: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
5750: 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a  nterface.*******
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  *****/../*.** Ge
57b0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  t information to
57c0: 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   seed the random
57d0: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
57e0: 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20  r.  The seed.** 
57f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5800: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b  the buffer zBuf[
5810: 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69  256].  The calli
5820: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
5830: 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66  .** supply a suf
5840: 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20  ficiently large 
5850: 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  buffer..*/.int s
5860: 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65  qlite3OsRandomSe
5870: 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  ed(char *zBuf){.
5880: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
5890: 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
58a0: 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
58b0: 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
58c0: 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
58d0: 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
58e0: 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
58f0: 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
5900: 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
5910: 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
5920: 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
5930: 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
5940: 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
5950: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
5960: 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
5970: 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
5980: 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
5990: 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
59a0: 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
59b0: 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
59c0: 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
59d0: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
59e0: 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
59f0: 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
5a00: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
5a10: 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
5a20: 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
5a30: 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
5a40: 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
5a50: 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
5a60: 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
5a70: 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
5a80: 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
5a90: 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
5aa0: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
5ab0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
5ac0: 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65  ence.* This make
5ad0: 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
5ae0: 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
5af0: 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
5b00: 20 30 2c 20 32 35 36 29 3b 0a 20 20 47 65 74 53   0, 256);.  GetS
5b10: 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53  ystemTime((LPSYS
5b20: 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20  TEMTIME)zBuf);. 
5b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5b40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
5b50: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
5b60: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
5b70: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
5b80: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
5b90: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 69 6e  qlite3OsSleep(in
5ba0: 74 20 6d 73 29 7b 0a 20 20 53 6c 65 65 70 28 6d  t ms){.  Sleep(m
5bb0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  s);.  return ms;
5bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63  .}../*.** Static
5bd0: 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20   variables used 
5be0: 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68  for thread synch
5bf0: 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74  ronization.*/.st
5c00: 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78  atic int inMutex
5c10: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
5c20: 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a  ITE_W32_THREADS.
5c30: 20 20 73 74 61 74 69 63 20 43 52 49 54 49 43 41    static CRITICA
5c40: 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65  L_SECTION cs;.#e
5c50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
5c60: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f  following pair o
5c70: 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  f routine implem
5c80: 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75  ent mutual exclu
5c90: 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74  sion for.** mult
5ca0: 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65  i-threaded proce
5cb0: 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69  sses.  Only a si
5cc0: 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61  ngle thread is a
5cd0: 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65  llowed to.** exe
5ce0: 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  cuted code that 
5cf0: 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  is surrounded by
5d00: 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e   EnterMutex() an
5d10: 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a  d LeaveMutex()..
5d20: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
5d30: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
5d40: 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73  Mutex.  There is
5d50: 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63   not much critic
5d60: 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77  al.** code and w
5d70: 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65  hat little there
5d80: 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69   is executes qui
5d90: 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74  ckly and without
5da0: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f   blocking..*/.vo
5db0: 69 64 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  id sqlite3OsEnte
5dc0: 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66  rMutex(){.#ifdef
5dd0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
5de0: 41 44 53 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ADS.  static int
5df0: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77   isInit = 0;.  w
5e00: 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 29 7b  hile( !isInit ){
5e10: 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67  .    static long
5e20: 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69   lock = 0;.    i
5e30: 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e  f( InterlockedIn
5e40: 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d  crement(&lock)==
5e50: 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69  1 ){.      Initi
5e60: 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63  alizeCriticalSec
5e70: 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 20  tion(&cs);.     
5e80: 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20   isInit = 1;.   
5e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c   }else{.      Sl
5ea0: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
5eb0: 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69 63 61  }.  EnterCritica
5ec0: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23  lSection(&cs);.#
5ed0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
5ee0: 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e  !inMutex );.  in
5ef0: 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69  Mutex = 1;.}.voi
5f00: 64 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65  d sqlite3OsLeave
5f10: 4d 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72  Mutex(){.  asser
5f20: 74 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20  t( inMutex );.  
5f30: 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66  inMutex = 0;.#if
5f40: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  def SQLITE_W32_T
5f50: 48 52 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72  HREADS.  LeaveCr
5f60: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
5f70: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  s);.#endif.}../*
5f80: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
5f90: 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
5fa0: 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
5fb0: 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
5fc0: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
5fd0: 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
5fe0: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
5ff0: 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
6000: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
6010: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6020: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
6030: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
6040: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
6050: 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
6060: 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
6070: 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
6080: 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
6090: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
60a0: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
60b0: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
60c0: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
60d0: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
60e0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
60f0: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
6100: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
6110: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
6120: 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62  CurrentTime(doub
6130: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49  le *prNow){.  FI
6140: 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20  LETIME ft;.  /* 
6150: 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
6160: 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
6170: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
6180: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
6190: 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
61a0: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
61b0: 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
61c0: 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
61d0: 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64  13.5). .  */.  d
61e0: 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 47 65 74  ouble now;.  Get
61f0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
6200: 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 20 20 6e  Time( &ft );.  n
6210: 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74  ow = ((double)ft
6220: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
6230: 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b   * 4294967296.0;
6240: 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f   .  *prNow = (no
6250: 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65  w + ft.dwLowDate
6260: 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30  Time)/8640000000
6270: 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35  00.0 + 2305813.5
6280: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6290: 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
62a0: 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
62b0: 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
62c0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
62d0: 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32  time/86400.0 + 2
62e0: 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65  440587.5;.  }.#e
62f0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b  ndif.  return 0;
6300: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
6310: 5f 57 49 4e 20 2a 2f 0a                          _WIN */.