/ Hex Artifact Content
Login

Artifact 6a80f6864cab2256a8e52b98f79d4e15a4b6004e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
01d0: 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 66 20 4f  ude "os.h".#if O
01e0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20  S_WIN           
01f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65      /* This file
0200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e   is used for win
0210: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69  dows only */..#i
0220: 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65 2e  nclude <winbase.
0230: 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59 47  h>..#ifdef __CYG
0240: 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20  WIN__.# include 
0250: 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23  <sys/cygwin.h>.#
0260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  endif../*.** Mac
0270: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0280: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0290: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
02a0: 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ads..*/.#if defi
02b0: 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20  ned(THREADSAFE) 
02c0: 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20  && THREADSAFE.# 
02d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 33  define SQLITE_W3
02e0: 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  2_THREADS 1.#end
02f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0300: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0310: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
0320: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0330: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0340: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  .h"../*.** Do no
0350: 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66  t include any of
0360: 20 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e   the File I/O in
0370: 74 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72  terface procedur
0380: 65 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c  es if the.** SQL
0390: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
03a0: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
03b0: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61   (indicating tha
03c0: 74 20 74 68 65 72 65 20 64 61 74 61 62 61 73 65  t there database
03d0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d  .** will be in-m
03e0: 65 6d 6f 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23  emory only).*/.#
03f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0400: 49 54 5f 44 49 53 4b 49 4f 0a 0a 2f 2a 0a 2a 2a  IT_DISKIO../*.**
0410: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
0420: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
0430: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
0440: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
0450: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
0460: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
0470: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
0480: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
0490: 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  5.** or WinNT..*
04a0: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
04b0: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
04c0: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
04d0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
04e0: 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win95..** 2:   O
04f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0500: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
0510: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
0520: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
0530: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
0540: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
0550: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
0560: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
0570: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
0580: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
0590: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
05a0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 0a 2f  _os_type = 0;../
05b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
05c0: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
05d0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
05e0: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
05f0: 20 6f 72 20 57 69 6e 58 50 2e 0a 2a 2a 20 52 65   or WinXP..** Re
0600: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
0610: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
0620: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
0630: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
0640: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
0650: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
0660: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
0670: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
0680: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
0690: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
06a0: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
06b0: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
06c0: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
06d0: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
06e0: 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e   win running Win
06f0: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
0700: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
0710: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
0720: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
0730: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
0740: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
0750: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
0760: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
0770: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
0780: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
0790: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
07a0: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ) API..*/.static
07b0: 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b   int isNT(void){
07c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f  .  if( sqlite3_o
07d0: 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  s_type==0 ){.   
07e0: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73   OSVERSIONINFO s
07f0: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
0800: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
0810: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
0820: 66 6f 29 3b 0a 20 20 20 20 47 65 74 56 65 72 73  fo);.    GetVers
0830: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
0840: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79     sqlite3_os_ty
0850: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61  pe = sInfo.dwPla
0860: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41  tformId==VER_PLA
0870: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f  TFORM_WIN32_NT ?
0880: 20 32 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 72 65   2 : 1;.  }.  re
0890: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f  turn sqlite3_os_
08a0: 74 79 70 65 3d 3d 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  type==2;.}../*.*
08b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
08c0: 38 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  8 string to UTF-
08d0: 33 32 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  32.  Space to ho
08e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
08f0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
0900: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
0910: 65 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74  eMalloc..*/.stat
0920: 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54 6f  ic WCHAR *utf8To
0930: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
0940: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
0950: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57    int nByte;.  W
0960: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e  CHAR *zWideFilen
0970: 61 6d 65 3b 0a 0a 20 20 69 66 28 20 21 69 73 4e  ame;..  if( !isN
0980: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T() ){.    retur
0990: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
09a0: 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
09b0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
09c0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
09d0: 2c 20 4e 55 4c 4c 2c 20 30 29 2a 73 69 7a 65 6f  , NULL, 0)*sizeo
09e0: 66 28 57 43 48 41 52 29 3b 0a 20 20 7a 57 69 64  f(WCHAR);.  zWid
09f0: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  eFilename = sqli
0a00: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  teMalloc( nByte*
0a10: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
0a20: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
0a30: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
0a40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
0a50: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
0a60: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
0a70: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
0a80: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
0a90: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
0aa0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
0ab0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
0ac0: 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 46 69  liteFree(zWideFi
0ad0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
0ae0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
0af0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
0b00: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
0b10: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46  *.** Convert UTF
0b20: 2d 33 32 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  -32 to UTF-8.  S
0b30: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
0b40: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
0b50: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
0b60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
0b70: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
0b80: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74  har *unicodeToUt
0b90: 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a  f8(const WCHAR *
0ba0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
0bb0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
0bc0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
0bd0: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
0be0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
0bf0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
0c00: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
0c10: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69   0, 0, 0);.  zFi
0c20: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d  lename = sqliteM
0c30: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
0c40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
0c50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
0c60: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
0c70: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
0c80: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
0c90: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
0ca0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
0cb0: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
0ce0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
0cf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
0d00: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
0d10: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
0d20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
0d30: 6e 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  name;.}.../*.** 
0d40: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
0d50: 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   file.*/.int sql
0d60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 63 6f 6e  ite3OsDelete(con
0d70: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0d80: 6d 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a 57  me){.  WCHAR *zW
0d90: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
0da0: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
0db0: 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20    if( zWide ){. 
0dc0: 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a     DeleteFileW(z
0dd0: 57 69 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Wide);.    sqlit
0de0: 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20  eFree(zWide);.  
0df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 6c 65 74  }else{.    Delet
0e00: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65  eFileA(zFilename
0e10: 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  );.  }.  TRACE2(
0e20: 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e  "DELETE \"%s\"\n
0e30: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
0e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0e50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
0e60: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
0e70: 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73  amed file exists
0e80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0e90: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e  OsFileExists(con
0ea0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0eb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 65 78 69 73 74  me){.  int exist
0ec0: 73 20 3d 20 30 3b 0a 20 20 57 43 48 41 52 20 2a  s = 0;.  WCHAR *
0ed0: 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  zWide = utf8ToUn
0ee0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
0ef0: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b  ;.  if( zWide ){
0f00: 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65  .    exists = Ge
0f10: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
0f20: 28 7a 57 69 64 65 29 20 21 3d 20 30 78 66 66 66  (zWide) != 0xfff
0f30: 66 66 66 66 66 3b 0a 20 20 20 20 73 71 6c 69 74  fffff;.    sqlit
0f40: 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20  eFree(zWide);.  
0f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 69 73 74  }else{.    exist
0f60: 73 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  s = GetFileAttri
0f70: 62 75 74 65 73 41 28 7a 46 69 6c 65 6e 61 6d 65  butesA(zFilename
0f80: 29 20 21 3d 20 30 78 66 66 66 66 66 66 66 66 3b  ) != 0xffffffff;
0f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78  .  }.  return ex
0fa0: 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ists;.}../*.** A
0fb0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
0fc0: 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72   file for both r
0fd0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
0fe0: 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20  ng.  If that.** 
0ff0: 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69  fails, try openi
1000: 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  ng it read-only.
1010: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f    If the file do
1020: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a  es not exist,.**
1030: 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69   try to create i
1040: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  t..**.** On succ
1050: 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f  ess, a handle fo
1060: 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  r the open file 
1070: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69  is written to *i
1080: 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f  d.** and *pReado
1090: 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20  nly is set to 0 
10a0: 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  if the file was 
10b0: 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69  opened for readi
10c0: 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e  ng and.** writin
10d0: 67 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69  g or 1 if the fi
10e0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
10f0: 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75  ad-only.  The fu
1100: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
1110: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  * SQLITE_OK..**.
1120: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74  ** On failure, t
1130: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1140: 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rns SQLITE_CANTO
1150: 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a  PEN and leaves.*
1160: 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64  * *id and *pRead
1170: 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a  only unchanged..
1180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
1190: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20  OpenReadWrite(. 
11a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
11b0: 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65  lename,.  OsFile
11c0: 20 2a 69 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65   *id,.  int *pRe
11d0: 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 48 41 4e 44  adonly.){.  HAND
11e0: 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a  LE h;.  WCHAR *z
11f0: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
1200: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
1210: 0a 20 20 61 73 73 65 72 74 28 20 21 69 64 2d 3e  .  assert( !id->
1220: 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20  isOpen );.  if( 
1230: 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20 3d  zWide ){.    h =
1240: 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57 69   CreateFileW(zWi
1250: 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52  de,.       GENER
1260: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
1270: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  C_WRITE,.       
1280: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
1290: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
12a0: 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c  TE,.       NULL,
12b0: 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57  .       OPEN_ALW
12c0: 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45  AYS,.       FILE
12d0: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
12e0: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
12f0: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
1300: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
1310: 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c      if( h==INVAL
1320: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1330: 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65  ){.      h = Cre
1340: 61 74 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a  ateFileW(zWide,.
1350: 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49 43           GENERIC
1360: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1370: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c  FILE_SHARE_READ,
1380: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  .         NULL,.
1390: 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c           OPEN_AL
13a0: 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46  WAYS,.         F
13b0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
13c0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
13d0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
13e0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20           NULL.  
13f0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
1400: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
1410: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1420: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1430: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Wide);.        r
1440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
1450: 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  TOPEN;.      }. 
1460: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20       *pReadonly 
1470: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1480: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79        *pReadonly
1490: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65  sqliteFree(zWide
14b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14c0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
14d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
14e0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
14f0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
1500: 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52         FILE_SHAR
1510: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
1520: 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  ARE_WRITE,.     
1530: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f    NULL,.       O
1540: 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
1550: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
1560: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
1570: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
1580: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
1590: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 68      );.    if( h
15a0: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
15b0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
15c0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
15d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
15e0: 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44      GENERIC_READ
15f0: 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f  ,.         FILE_
1600: 53 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20  SHARE_READ,.    
1610: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1620: 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c      OPEN_ALWAYS,
1630: 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41  .         FILE_A
1640: 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20  TTRIBUTE_NORMAL 
1650: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  | FILE_FLAG_RAND
1660: 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20  OM_ACCESS,.     
1670: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29      NULL.      )
1680: 3b 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49  ;.      if( h==I
1690: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
16a0: 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LUE ){.        r
16b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
16c0: 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  TOPEN;.      }. 
16d0: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20       *pReadonly 
16e0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
16f0: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79        *pReadonly
1700: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1710: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69    id->h = h;.  i
1720: 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  d->locktype = NO
1730: 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d 3e 73 68 61  _LOCK;.  id->sha
1740: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b  redLockByte = 0;
1750: 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
1760: 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  1;.  OpenCounter
1770: 28 2b 31 29 3b 0a 20 20 54 52 41 43 45 33 28 22  (+1);.  TRACE3("
1780: 4f 50 45 4e 20 52 2f 57 20 25 64 20 5c 22 25 73  OPEN R/W %d \"%s
1790: 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  \"\n", h, zFilen
17a0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ame);.  return S
17b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
17c0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
17d0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
17e0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
17f0: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
1800: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
1810: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1820: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
1830: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
1840: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
1850: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
1860: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
1870: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
1880: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
1890: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
18a0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
18b0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
18c0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
18d0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
18e0: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
18f0: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
1900: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
1910: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
1920: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
1930: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
1940: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
1950: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
1960: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
1970: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1980: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
1990: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
19a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
19b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70  .int sqlite3OsOp
19c0: 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73  enExclusive(cons
19d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
19e0: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  e, OsFile *id, i
19f0: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 48  nt delFlag){.  H
1a00: 41 4e 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66  ANDLE h;.  int f
1a10: 69 6c 65 66 6c 61 67 73 3b 0a 20 20 57 43 48 41  ileflags;.  WCHA
1a20: 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54  R *zWide = utf8T
1a30: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
1a40: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  me);.  assert( !
1a50: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
1a60: 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20  if( delFlag ){. 
1a70: 20 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46     fileflags = F
1a80: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
1a90: 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46  MPORARY | FILE_F
1aa0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
1ab0: 53 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S .             
1ac0: 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
1ad0: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
1ae0: 4f 53 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OSE;.  }else{.  
1af0: 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46 49    fileflags = FI
1b00: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1b10: 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 28  CCESS;.  }.  if(
1b20: 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20   zWide ){.    h 
1b30: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57  = CreateFileW(zW
1b40: 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45  ide,.       GENE
1b50: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
1b60: 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20  IC_WRITE,.      
1b70: 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c   0,.       NULL,
1b80: 0a 20 20 20 20 20 20 20 43 52 45 41 54 45 5f 41  .       CREATE_A
1b90: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 66 69  LWAYS,.       fi
1ba0: 6c 65 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  leflags,.       
1bb0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20  NULL.    );.    
1bc0: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65  sqliteFree(zWide
1bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1be0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
1bf0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
1c00: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
1c10: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
1c20: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
1c30: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43 52   NULL,.       CR
1c40: 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20  EATE_ALWAYS,.   
1c50: 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20      fileflags,. 
1c60: 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29        NULL.    )
1c70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49  ;.  }.  if( h==I
1c80: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1c90: 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LUE ){.    retur
1ca0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
1cb0: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d  N;.  }.  id->h =
1cc0: 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79   h;.  id->lockty
1cd0: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
1ce0: 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  id->sharedLockBy
1cf0: 74 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73  te = 0;.  id->is
1d00: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e  Open = 1;.  Open
1d10: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54  Counter(+1);.  T
1d20: 52 41 43 45 33 28 22 4f 50 45 4e 20 45 58 20 25  RACE3("OPEN EX %
1d30: 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20  d \"%s\"\n", h, 
1d40: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65  zFilename);.  re
1d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1d70: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
1d80: 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c  ile for read-onl
1d90: 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  y access..**.** 
1da0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74  On success, writ
1db0: 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  e the file handl
1dc0: 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72  e into *id and r
1dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1de0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
1df0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
1e00: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e  _CANTOPEN..*/.in
1e10: 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  t sqlite3OsOpenR
1e20: 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68  eadOnly(const ch
1e30: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  ar *zFilename, O
1e40: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 48 41  sFile *id){.  HA
1e50: 4e 44 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20  NDLE h;.  WCHAR 
1e60: 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55  *zWide = utf8ToU
1e70: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
1e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 64  );.  assert( !id
1e90: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66  ->isOpen );.  if
1ea0: 28 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68  ( zWide ){.    h
1eb0: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a   = CreateFileW(z
1ec0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e  Wide,.       GEN
1ed0: 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20  ERIC_READ,.     
1ee0: 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c    0,.       NULL
1ef0: 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45 58  ,.       OPEN_EX
1f00: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20 46  ISTING,.       F
1f10: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
1f20: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
1f30: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
1f40: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
1f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1f60: 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73  e(zWide);.  }els
1f70: 65 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  e{.    h = Creat
1f80: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65  eFileA(zFilename
1f90: 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43  ,.       GENERIC
1fa0: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30 2c  _READ,.       0,
1fb0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
1fc0: 20 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 49       OPEN_EXISTI
1fd0: 4e 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f  NG,.       FILE_
1fe0: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
1ff0: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   | FILE_FLAG_RAN
2000: 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20  DOM_ACCESS,.    
2010: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20     NULL.    );. 
2020: 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41   }.  if( h==INVA
2030: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
2040: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2050: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
2060: 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b    }.  id->h = h;
2070: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20  .  id->locktype 
2080: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d  = NO_LOCK;.  id-
2090: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
20a0: 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65  = 0;.  id->isOpe
20b0: 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f 75  n = 1;.  OpenCou
20c0: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 52 41 43  nter(+1);.  TRAC
20d0: 45 33 28 22 4f 50 45 4e 20 52 4f 20 25 64 20 5c  E3("OPEN RO %d \
20e0: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
20f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
2100: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2110: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
2120: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   open a file des
2130: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
2140: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
2150: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c  ontains a.** fil
2160: 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65  e.  This file de
2170: 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20  scriptor can be 
2180: 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20  used to fsync() 
2190: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
21a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
21b0: 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74  e sure the creat
21c0: 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c  ion of a new fil
21d0: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72  e is actually wr
21e0: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b  itten.** to disk
21f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2200: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61  tine is only mea
2210: 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78  ningful for Unix
2220: 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70  .  It is a no-op
2230: 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77   under.** window
2240: 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20  s since windows 
2250: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
2260: 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a   hard links..**.
2270: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61  ** On success, a
2280: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72   handle for a pr
2290: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69  eviously open fi
22a0: 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a  le is at *id is.
22b0: 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20  ** updated with 
22c0: 74 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72  the new director
22d0: 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
22e0: 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  r and SQLITE_OK 
22f0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
2300: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
2310: 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
2320: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41  eturns SQLITE_CA
2330: 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65  NTOPEN and leave
2340: 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67  s.** *id unchang
2350: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2360: 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e3OsOpenDirector
2370: 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  y(.  const char 
2380: 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46  *zDirname,.  OsF
2390: 69 6c 65 20 2a 69 64 0a 29 7b 0a 20 20 72 65 74  ile *id.){.  ret
23a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
23c0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
23d0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
23e0: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
23f0: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
2400: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
2410: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
2420: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
2430: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65  d to store.** te
2440: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
2450: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
2460: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
2470: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74   0;../*.** Creat
2480: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
2490: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
24a0: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
24b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
24c0: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
24d0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
24e0: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
24f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54  /.int sqlite3OsT
2500: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72  empFileName(char
2510: 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
2520: 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
2530: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
2540: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2550: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
2560: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
2570: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
2580: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
2590: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61  ;.  char zTempPa
25a0: 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  th[SQLITE_TEMPNA
25b0: 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20  ME_SIZE];.  if( 
25c0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
25d0: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 74  ectory ){.    st
25e0: 72 6e 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c  rncpy(zTempPath,
25f0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
2600: 72 65 63 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f  rectory, SQLITE_
2610: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
2620: 29 3b 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68  );.    zTempPath
2630: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
2640: 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20  _SIZE-30] = 0;. 
2650: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28   }else if( isNT(
2660: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
2670: 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52  Multi;.    WCHAR
2680: 20 7a 57 69 64 65 50 61 74 68 5b 53 51 4c 49 54   zWidePath[SQLIT
2690: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
26a0: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
26b0: 68 57 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  hW(SQLITE_TEMPNA
26c0: 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 57 69 64  ME_SIZE-30, zWid
26d0: 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
26e0: 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
26f0: 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
2700: 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
2710: 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a  .      strncpy(z
2720: 54 65 6d 70 50 61 74 68 2c 20 7a 4d 75 6c 74 69  TempPath, zMulti
2730: 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  , SQLITE_TEMPNAM
2740: 45 5f 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20  E_SIZE-30);.    
2750: 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49    zTempPath[SQLI
2760: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
2770: 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  -30] = 0;.      
2780: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 75 6c 74  sqliteFree(zMult
2790: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
27a0: 65 7b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61  e{.    GetTempPa
27b0: 74 68 41 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e  thA(SQLITE_TEMPN
27c0: 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65  AME_SIZE-30, zTe
27d0: 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 66  mpPath);.  }.  f
27e0: 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d  or(i=strlen(zTem
27f0: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
2800: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
2810: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
2820: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
2830: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73    for(;;){.    s
2840: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73  printf(zBuf, "%s
2850: 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  \\"TEMP_FILE_PRE
2860: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b  FIX, zTempPath);
2870: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
2880: 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
2890: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  e3Randomness(15,
28a0: 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
28b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
28c0: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
28d0: 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
28e0: 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
28f0: 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
2900: 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
2910: 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
2920: 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
2930: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73    if( !sqlite3Os
2940: 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75 66 29  FileExists(zBuf)
2950: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2960: 54 52 41 43 45 32 28 22 54 45 4d 50 20 46 49 4c  TRACE2("TEMP FIL
2970: 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42  ENAME: %s\n", zB
2980: 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  uf);.  return SQ
2990: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
29a0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
29b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
29c0: 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 69  sClose(OsFile *i
29d0: 64 29 7b 0a 20 20 69 66 28 20 69 64 2d 3e 69 73  d){.  if( id->is
29e0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 54 52 41 43  Open ){.    TRAC
29f0: 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
2a00: 20 69 64 2d 3e 68 29 3b 0a 20 20 20 20 43 6c 6f   id->h);.    Clo
2a10: 73 65 48 61 6e 64 6c 65 28 69 64 2d 3e 68 29 3b  seHandle(id->h);
2a20: 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
2a30: 28 2d 31 29 3b 0a 20 20 20 20 69 64 2d 3e 69 73  (-1);.    id->is
2a40: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
2a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
2a70: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
2a80: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
2a90: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2aa0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
2ab0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
2ac0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
2ad0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
2ae0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
2af0: 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ong..*/.int sqli
2b00: 74 65 33 4f 73 52 65 61 64 28 4f 73 46 69 6c 65  te3OsRead(OsFile
2b10: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66   *id, void *pBuf
2b20: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57  , int amt){.  DW
2b30: 4f 52 44 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  ORD got;.  asser
2b40: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
2b50: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2b60: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
2b70: 3b 0a 20 20 54 52 41 43 45 33 28 22 52 45 41 44  ;.  TRACE3("READ
2b80: 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20   %d lock=%d\n", 
2b90: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74  id->h, id->lockt
2ba0: 79 70 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61  ype);.  if( !Rea
2bb0: 64 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75  dFile(id->h, pBu
2bc0: 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29  f, amt, &got, 0)
2bd0: 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b   ){.    got = 0;
2be0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d  .  }.  if( got==
2bf0: 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
2c00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c10: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2c30: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
2c40: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
2c50: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
2c60: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
2c70: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
2c80: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
2c90: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
2ca0: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
2cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72  .int sqlite3OsWr
2cc0: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ite(OsFile *id, 
2cd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
2ce0: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e  , int amt){.  in
2cf0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
2d00: 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73 65 72  D wrote;.  asser
2d10: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
2d20: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2d30: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
2d40: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
2d50: 66 75 6c 6c 45 72 72 6f 72 3b 0a 20 20 54 52 41  fullError;.  TRA
2d60: 43 45 33 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE3("WRITE %d lo
2d70: 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c  ck=%d\n", id->h,
2d80: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a   id->locktype);.
2d90: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
2da0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  );.  while( amt>
2db0: 30 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65  0 && (rc = Write
2dc0: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  File(id->h, pBuf
2dd0: 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30  , amt, &wrote, 0
2de0: 29 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e 30  ))!=0 && wrote>0
2df0: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
2e00: 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
2e10: 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
2e20: 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66  wrote];.  }.  if
2e30: 28 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e  ( !rc || amt>(in
2e40: 74 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72  t)wrote ){.    r
2e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
2e60: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
2e70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e80: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61  .** Move the rea
2e90: 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20  d/write pointer 
2ea0: 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  in a file..*/.in
2eb0: 74 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  t sqlite3OsSeek(
2ec0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  OsFile *id, i64 
2ed0: 6f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  offset){.  LONG 
2ee0: 75 70 70 65 72 42 69 74 73 20 3d 20 6f 66 66 73  upperBits = offs
2ef0: 65 74 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c  et>>32;.  LONG l
2f00: 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65  owerBits = offse
2f10: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a  t & 0xffffffff;.
2f20: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 61 73    DWORD rc;.  as
2f30: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
2f40: 20 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73 65   );.  SEEK(offse
2f50: 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20 20 72  t/1024 + 1);.  r
2f60: 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  c = SetFilePoint
2f70: 65 72 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72 42  er(id->h, lowerB
2f80: 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c  its, &upperBits,
2f90: 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20   FILE_BEGIN);.  
2fa0: 54 52 41 43 45 33 28 22 53 45 45 4b 20 25 64 20  TRACE3("SEEK %d 
2fb0: 25 6c 6c 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %lld\n", id->h, 
2fc0: 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72  offset);.  retur
2fd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2fe0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
2ff0: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
3000: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
3010: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
3020: 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
3030: 6c 69 74 65 33 4f 73 53 79 6e 63 28 4f 73 46 69  lite3OsSync(OsFi
3040: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 64 61 74 61  le *id, int data
3050: 4f 6e 6c 79 29 7b 0a 20 20 61 73 73 65 72 74 28  Only){.  assert(
3060: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20   id->isOpen );. 
3070: 20 54 52 41 43 45 33 28 22 53 59 4e 43 20 25 64   TRACE3("SYNC %d
3080: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d   lock=%d\n", id-
3090: 3e 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  >h, id->locktype
30a0: 29 3b 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69  );.  if( FlushFi
30b0: 6c 65 42 75 66 66 65 72 73 28 69 64 2d 3e 68 29  leBuffers(id->h)
30c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
30e0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
30f0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
3100: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
3110: 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72  e directory zDir
3120: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20  name. This is a 
3130: 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69  no-op on operati
3140: 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72  ng systems other
3150: 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a  .** than UNIX..*
3160: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53  /.int sqlite3OsS
3170: 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  yncDirectory(con
3180: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
3190: 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  e){.  SimulateIO
31a0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
31b0: 52 52 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  RR);.  return SQ
31c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
31d0: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
31e0: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
31f0: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 69  cified size.*/.i
3200: 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  nt sqlite3OsTrun
3210: 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  cate(OsFile *id,
3220: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 4c   i64 nByte){.  L
3230: 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d 20  ONG upperBits = 
3240: 6e 42 79 74 65 3e 3e 33 32 3b 0a 20 20 61 73 73  nByte>>32;.  ass
3250: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
3260: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 54 52 55  );.  TRACE3("TRU
3270: 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22  NCATE %d %lld\n"
3280: 2c 20 69 64 2d 3e 68 2c 20 6e 42 79 74 65 29 3b  , id->h, nByte);
3290: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
32a0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
32b0: 3b 0a 20 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ;.  SetFilePoint
32c0: 65 72 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 2c  er(id->h, nByte,
32d0: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
32e0: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 53 65 74 45  E_BEGIN);.  SetE
32f0: 6e 64 4f 66 46 69 6c 65 28 69 64 2d 3e 68 29 3b  ndOfFile(id->h);
3300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
3320: 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
3330: 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
3340: 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 69  le in bytes.*/.i
3350: 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  nt sqlite3OsFile
3360: 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Size(OsFile *id,
3370: 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
3380: 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c  DWORD upperBits,
3390: 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 61 73   lowerBits;.  as
33a0: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
33b0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
33c0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
33d0: 52 52 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  RR);.  lowerBits
33e0: 20 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69   = GetFileSize(i
33f0: 64 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  d->h, &upperBits
3400: 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28  );.  *pSize = ((
3410: 28 69 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  (i64)upperBits)<
3420: 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
3430: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3440: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
3450: 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20  cquire a reader 
3460: 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65  lock..** Differe
3470: 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20  nt API routines 
3480: 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e  are called depen
3490: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
34a0: 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69  or not this.** i
34b0: 73 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54  s Win95 or WinNT
34c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34d0: 67 65 74 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69  getReadLock(OsFi
34e0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
34f0: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
3500: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
3510: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
3520: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
3530: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
3540: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
3550: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
3560: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
3570: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69 64 2d 3e   LockFileEx(id->
3580: 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  h, LOCKFILE_FAIL
3590: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 20 30 2c  _IMMEDIATELY, 0,
35a0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 30 2c 26   SHARED_SIZE,0,&
35b0: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
35c0: 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20      int lk;.    
35d0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
35e0: 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
35f0: 6b 29 3b 0a 20 20 20 20 69 64 2d 3e 73 68 61 72  k);.    id->shar
3600: 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b  edLockByte = (lk
3610: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
3620: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
3630: 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b  ;.    res = Lock
3640: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52  File(id->h, SHAR
3650: 45 44 5f 46 49 52 53 54 2b 69 64 2d 3e 73 68 61  ED_FIRST+id->sha
3660: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
3670: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
3680: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
3690: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
36a0: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
36b0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 4f  unlockReadLock(O
36c0: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  sFile *id){.  in
36d0: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e  t res;.  if( isN
36e0: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  T() ){.    res =
36f0: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   UnlockFile(id->
3700: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
3710: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
3720: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
3730: 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69    res = UnlockFi
3740: 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44  le(id->h, SHARED
3750: 5f 46 49 52 53 54 20 2b 20 69 64 2d 3e 73 68 61  _FIRST + id->sha
3760: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
3770: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
3780: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e  urn res;.}..#ifn
3790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37a0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a  PAGER_PRAGMAS./*
37b0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
37c0: 20 67 69 76 65 6e 20 70 61 74 68 6e 61 6d 65 20   given pathname 
37d0: 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 61  is a directory a
37e0: 6e 64 20 69 73 20 77 72 69 74 61 62 6c 65 20 0a  nd is writable .
37f0: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
3800: 33 4f 73 49 73 44 69 72 57 72 69 74 61 62 6c 65  3OsIsDirWritable
3810: 28 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29  (char *zDirname)
3820: 7b 0a 20 20 69 6e 74 20 66 69 6c 65 41 74 74 72  {.  int fileAttr
3830: 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65  ;.  WCHAR *zWide
3840: 3b 0a 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65  ;.  if( zDirname
3850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3860: 20 20 69 66 28 20 21 69 73 4e 54 28 29 20 26 26    if( !isNT() &&
3870: 20 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65   strlen(zDirname
3880: 29 3e 4d 41 58 5f 50 41 54 48 20 29 20 72 65 74  )>MAX_PATH ) ret
3890: 75 72 6e 20 30 3b 0a 20 20 7a 57 69 64 65 20 3d  urn 0;.  zWide =
38a0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
38b0: 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  Dirname);.  if( 
38c0: 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 66 69 6c  zWide ){.    fil
38d0: 65 41 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41  eAttr = GetFileA
38e0: 74 74 72 69 62 75 74 65 73 57 28 7a 57 69 64 65  ttributesW(zWide
38f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
3900: 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73  e(zWide);.  }els
3910: 65 7b 0a 20 20 20 20 66 69 6c 65 41 74 74 72 20  e{.    fileAttr 
3920: 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
3930: 74 65 73 41 28 7a 44 69 72 6e 61 6d 65 29 3b 0a  tesA(zDirname);.
3940: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 41 74    }.  if( fileAt
3950: 74 72 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66  tr == 0xffffffff
3960: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
3970: 66 28 20 28 66 69 6c 65 41 74 74 72 20 26 20 46  f( (fileAttr & F
3980: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
3990: 52 45 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45  RECTORY) != FILE
39a0: 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
39b0: 54 4f 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75  TORY ){.    retu
39c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
39d0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
39e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  * SQLITE_OMIT_PA
39f0: 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  GER_PRAGMAS */..
3a00: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
3a10: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
3a20: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
3a30: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
3a40: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
3a50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
3a60: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
3a70: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
3a80: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
3a90: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
3aa0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
3ab0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
3ac0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
3ad0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
3ae0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
3af0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
3b00: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
3b10: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
3b20: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
3b30: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
3b40: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
3b50: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
3b60: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
3b70: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
3b80: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
3b90: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
3ba0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
3bb0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
3bc0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
3bd0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
3be0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
3bf0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
3c00: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
3c10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
3c20: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
3c30: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
3c40: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
3c50: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
3c60: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
3c70: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
3c80: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
3c90: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
3ca0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
3cb0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
3cc0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
3cd0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
3ce0: 20 54 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   The sqlite3OsUn
3cf0: 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
3d00: 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
3d10: 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
3d20: 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
3d30: 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
3d40: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
3d50: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
3d60: 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
3d70: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
3d80: 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
3d90: 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
3da0: 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
3db0: 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 69  ng level 0..*/.i
3dc0: 6e 74 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  nt sqlite3OsLock
3dd0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
3de0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
3df0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3e00: 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
3e10: 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
3e20: 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
3e30: 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
3e40: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
3e50: 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  windows lock cal
3e60: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
3e70: 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
3e80: 20 53 65 74 20 69 64 2d 3e 6c 6f 63 6b 74 79 70   Set id->locktyp
3e90: 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
3ea0: 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
3eb0: 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
3ec0: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
3ed0: 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
3ee0: 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
3ef0: 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 0a 20   this time */.. 
3f00: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f   assert( id->isO
3f10: 70 65 6e 20 29 3b 0a 20 20 54 52 41 43 45 35 28  pen );.  TRACE5(
3f20: 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20  "LOCK %d %d was 
3f30: 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  %d(%d)\n",.     
3f40: 20 20 20 20 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b       id->h, lock
3f50: 74 79 70 65 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79  type, id->lockty
3f60: 70 65 2c 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f  pe, id->sharedLo
3f70: 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49  ckByte);..  /* I
3f80: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
3f90: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
3fa0: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
3fb0: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
3fc0: 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
3fd0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
3fe0: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
3ff0: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
4000: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
4010: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
4020: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
4030: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  et..  */.  if( i
4040: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  d->locktype>=loc
4050: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
4060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
4070: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
4080: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
4090: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
40a0: 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
40b0: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  ( id->locktype!=
40c0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
40d0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
40e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
40f0: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
4100: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
4110: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
4120: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d  RVED_LOCK || id-
4130: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
4140: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
4150: 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47  Lock the PENDING
4160: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65  _LOCK byte if we
4170: 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65   need to acquire
4180: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
4190: 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  or.  ** a SHARED
41a0: 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72   lock.  If we ar
41b0: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
41c0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61  ARED lock, the a
41d0: 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20  cquisition of.  
41e0: 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ** the PENDING_L
41f0: 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70  OCK byte is temp
4200: 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65  orary..  */.  ne
4210: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 69 64 2d 3e  wLocktype = id->
4220: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
4230: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  id->locktype==NO
4240: 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63  _LOCK.   || (loc
4250: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
4260: 5f 4c 4f 43 4b 20 26 26 20 69 64 2d 3e 6c 6f 63  _LOCK && id->loc
4270: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
4280: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
4290: 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20  nt cnt = 3;.    
42a0: 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
42b0: 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c  & (res = LockFil
42c0: 65 28 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  e(id->h, PENDING
42d0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
42e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
42f0: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
4300: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
4310: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
4320: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
4330: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
4340: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
4350: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
4360: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
4370: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
4380: 2f 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  /.      TRACE2("
4390: 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20  could not get a 
43a0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e  PENDING lock. cn
43b0: 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20  t=%d\n", cnt);. 
43c0: 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20       Sleep(1);. 
43d0: 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64     }.    gotPend
43e0: 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20  ingLock = res;. 
43f0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
4400: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
4410: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
4420: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
4430: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
4440: 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79  sert( id->lockty
4450: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
4460: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
4470: 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 20 20 69 66  Lock(id);.    if
4480: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
4490: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
44a0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
44b0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
44c0: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
44d0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
44e0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
44f0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
4500: 20 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c     assert( id->l
4510: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
4520: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
4530: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
4540: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
4550: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
4560: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
4570: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
4580: 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
4590: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
45a0: 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
45b0: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
45c0: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
45d0: 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
45e0: 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
45f0: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
4600: 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
4610: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
4620: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
4630: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
4640: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
4650: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
4660: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
4670: 61 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b  assert( id->lock
4680: 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
4690: 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75  K );.    res = u
46a0: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 69 64  nlockReadLock(id
46b0: 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 75  );.    TRACE2("u
46c0: 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e  nreadlock = %d\n
46d0: 22 2c 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73  ", res);.    res
46e0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   = LockFile(id->
46f0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
4700: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
4710: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
4720: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
4730: 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
4740: 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
4750: 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  e{.      TRACE2(
4760: 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64  "error-code = %d
4770: 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45 72 72 6f  \n", GetLastErro
4780: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r());.    }.  }.
4790: 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
47a0: 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
47b0: 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
47c0: 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
47d0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
47e0: 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
47f0: 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
4800: 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
4810: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
4820: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
4830: 28 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  (id->h, PENDING_
4840: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
4850: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
4860: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
4870: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
4880: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
4890: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
48a0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
48b0: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
48c0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
48d0: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
48e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
48f0: 73 65 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22  se{.    TRACE4("
4900: 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74  LOCK FAILED %d t
4910: 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74  rying for %d but
4920: 20 67 6f 74 20 25 64 5c 6e 22 2c 20 69 64 2d 3e   got %d\n", id->
4930: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
4940: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
4950: 79 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ype);.    rc = S
4960: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
4970: 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d    id->locktype =
4980: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20   newLocktype;.  
4990: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
49a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
49b0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
49c0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
49d0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
49e0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
49f0: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
4a00: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
4a10: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
4a20: 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
4a30: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
4a40: 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  rwise zero..*/.i
4a50: 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  nt sqlite3OsChec
4a60: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
4a70: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
4a80: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
4a90: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69  d->isOpen );.  i
4aa0: 66 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e  f( id->locktype>
4ab0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
4ac0: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
4ad0: 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57    TRACE3("TEST W
4ae0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f  R-LOCK %d %d (lo
4af0: 63 61 6c 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  cal)\n", id->h, 
4b00: 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rc);.  }else{.  
4b10: 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28    rc = LockFile(
4b20: 69 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  id->h, RESERVED_
4b30: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
4b40: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
4b50: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69      UnlockFile(i
4b60: 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  d->h, RESERVED_B
4b70: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
4b80: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
4b90: 63 3b 0a 20 20 20 20 54 52 41 43 45 33 28 22 54  c;.    TRACE3("T
4ba0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
4bb0: 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 69  d (remote)\n", i
4bc0: 64 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  d->h, rc);.  }. 
4bd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4be0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
4bf0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
4c00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4c10: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
4c20: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
4c30: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
4c40: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
4c50: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
4c60: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
4c70: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
4c80: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
4c90: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
4ca0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
4cb0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
4cc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
4cd0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
4ce0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
4cf0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
4d00: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
4d10: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
4d20: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
4d30: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
4d40: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
4d50: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
4d60: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
4d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
4d80: 45 52 52 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ERR;.*/.int sqli
4d90: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69  te3OsUnlock(OsFi
4da0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
4db0: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
4dc0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
4dd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
4de0: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
4df0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
4e00: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
4e10: 20 29 3b 0a 20 20 54 52 41 43 45 35 28 22 55 4e   );.  TRACE5("UN
4e20: 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61  LOCK %d to %d wa
4e30: 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 69 64 2d  s %d(%d)\n", id-
4e40: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
4e50: 20 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b          id->lock
4e60: 74 79 70 65 2c 20 69 64 2d 3e 73 68 61 72 65 64  type, id->shared
4e70: 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20 74 79 70  LockByte);.  typ
4e80: 65 20 3d 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  e = id->locktype
4e90: 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58  ;.  if( type>=EX
4ea0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
4eb0: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69      UnlockFile(i
4ec0: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  d->h, SHARED_FIR
4ed0: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
4ee0: 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
4ef0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
4f00: 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61  _LOCK && !getRea
4f10: 64 4c 6f 63 6b 28 69 64 29 20 29 7b 0a 20 20 20  dLock(id) ){.   
4f20: 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
4f30: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
4f40: 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
4f50: 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
4f60: 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
4f70: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
4f80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4f90: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
4fa0: 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
4fb0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
4fc0: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
4fd0: 69 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  id->h, RESERVED_
4fe0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
4ff0: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
5000: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74  pe==NO_LOCK && t
5010: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
5020: 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65   ){.    unlockRe
5030: 61 64 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 7d 0a  adLock(id);.  }.
5040: 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
5050: 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
5060: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
5070: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
5080: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
5090: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  id->locktype = l
50a0: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
50b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
50c0: 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
50d0: 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
50e0: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ull pathname.  R
50f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
5100: 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70  ** to the full p
5110: 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69  athname stored i
5120: 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  n space obtained
5130: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
5140: 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  oc()..** The cal
5150: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ling function is
5160: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
5170: 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70   freeing this sp
5180: 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69  ace once it.** i
5190: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64  s no longer need
51a0: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ed..*/.char *sql
51b0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
51c0: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
51d0: 52 65 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61  Relative){.  cha
51e0: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 63  r *zNotUsed;.  c
51f0: 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 20 20 57 43  har *zFull;.  WC
5200: 48 41 52 20 2a 7a 57 69 64 65 3b 0a 20 20 69 6e  HAR *zWide;.  in
5210: 74 20 6e 42 79 74 65 3b 0a 23 69 66 64 65 66 20  t nByte;.#ifdef 
5220: 5f 5f 43 59 47 57 49 4e 5f 5f 0a 20 20 6e 42 79  __CYGWIN__.  nBy
5230: 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 6c  te = strlen(zRel
5240: 61 74 69 76 65 29 20 2b 20 4d 41 58 5f 50 41 54  ative) + MAX_PAT
5250: 48 20 2b 20 31 30 30 31 3b 0a 20 20 7a 46 75 6c  H + 1001;.  zFul
5260: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
5270: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
5280: 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75   zFull==0 ) retu
5290: 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 79 67 77  rn 0;.  if( cygw
52a0: 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
52b0: 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61  win32_path(zRela
52c0: 74 69 76 65 2c 20 7a 46 75 6c 6c 29 20 29 20 72  tive, zFull) ) r
52d0: 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20  eturn 0;.#else. 
52e0: 20 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55   zWide = utf8ToU
52f0: 6e 69 63 6f 64 65 28 7a 52 65 6c 61 74 69 76 65  nicode(zRelative
5300: 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29  );.  if( zWide )
5310: 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65  {.    WCHAR *zTe
5320: 6d 70 2c 20 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a  mp, *zNotUsedW;.
5330: 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46      nByte = GetF
5340: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69  ullPathNameW(zWi
5350: 64 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55  de, 0, 0, &zNotU
5360: 73 65 64 57 29 20 2b 20 31 3b 0a 20 20 20 20 7a  sedW) + 1;.    z
5370: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Temp = sqliteMal
5380: 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
5390: 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
53a0: 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
53b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
53c0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
53d0: 28 7a 57 69 64 65 2c 20 6e 42 79 74 65 2c 20 7a  (zWide, nByte, z
53e0: 54 65 6d 70 2c 20 26 7a 4e 6f 74 55 73 65 64 57  Temp, &zNotUsedW
53f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
5400: 65 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 7a 46  e(zWide);.    zF
5410: 75 6c 6c 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  ull = unicodeToU
5420: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
5430: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70  sqliteFree(zTemp
5440: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5450: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
5460: 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69  athNameA(zRelati
5470: 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55  ve, 0, 0, &zNotU
5480: 73 65 64 29 20 2b 20 31 3b 0a 20 20 20 20 7a 46  sed) + 1;.    zF
5490: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ull = sqliteMall
54a0: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
54b0: 28 7a 46 75 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20  (zFull[0]) );.  
54c0: 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29    if( zFull==0 )
54d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 47   return 0;.    G
54e0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
54f0: 7a 52 65 6c 61 74 69 76 65 2c 20 6e 42 79 74 65  zRelative, nByte
5500: 2c 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73  , zFull, &zNotUs
5510: 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
5520: 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a    return zFull;.
5530: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
5540: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
5550: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
5560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
55a0: 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 62  ** Everything ab
55b0: 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68 20 66  ove deals with f
55c0: 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74  ile I/O.  Everyt
55d0: 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77  hing that follow
55e0: 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20  s deals.** with 
55f0: 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f  other miscellano
5600: 75 73 20 61 73 70 65 63 74 73 20 6f 66 20 74 68  us aspects of th
5610: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
5620: 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a  em interface.***
5630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
5680: 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f  * Get informatio
5690: 6e 20 74 6f 20 73 65 65 64 20 74 68 65 20 72 61  n to seed the ra
56a0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
56b0: 72 61 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64  rator.  The seed
56c0: 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69  .** is written i
56d0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a  nto the buffer z
56e0: 42 75 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63  Buf[256].  The c
56f0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
5700: 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61  must.** supply a
5710: 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61   sufficiently la
5720: 72 67 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69  rge buffer..*/.i
5730: 6e 74 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64  nt sqlite3OsRand
5740: 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75  omSeed(char *zBu
5750: 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
5760: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
5770: 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
5780: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
5790: 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
57a0: 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
57b0: 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
57c0: 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
57d0: 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
57e0: 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
57f0: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
5800: 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
5810: 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
5820: 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
5830: 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
5840: 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
5850: 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
5860: 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
5870: 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
5880: 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
5890: 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
58a0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
58b0: 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
58c0: 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
58d0: 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
58e0: 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
58f0: 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
5900: 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
5910: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
5920: 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
5930: 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
5940: 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
5950: 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
5960: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
5970: 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
5980: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
5990: 73 65 71 75 65 6e 63 65 2e 2a 20 54 68 69 73 20  sequence.* This 
59a0: 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
59b0: 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
59c0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
59d0: 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 20 20  Buf, 0, 256);.  
59e0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c  GetSystemTime((L
59f0: 50 53 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66  PSYSTEMTIME)zBuf
5a00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5a10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5a20: 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
5a30: 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
5a40: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
5a50: 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
5a60: 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  nt sqlite3OsSlee
5a70: 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 53 6c 65  p(int ms){.  Sle
5a80: 65 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e  ep(ms);.  return
5a90: 20 6d 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   ms;.}../*.** St
5aa0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
5ab0: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
5ac0: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
5ad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
5ae0: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
5af0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
5b00: 41 44 53 0a 20 20 73 74 61 74 69 63 20 43 52 49  ADS.  static CRI
5b10: 54 49 43 41 4c 5f 53 45 43 54 49 4f 4e 20 63 73  TICAL_SECTION cs
5b20: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
5b30: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
5b40: 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d  ir of routine im
5b50: 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65  plement mutual e
5b60: 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20  xclusion for.** 
5b70: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70  multi-threaded p
5b80: 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20  rocesses.  Only 
5b90: 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20  a single thread 
5ba0: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a  is allowed to.**
5bb0: 20 65 78 65 63 75 74 65 64 20 63 6f 64 65 20 74   executed code t
5bc0: 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65  hat is surrounde
5bd0: 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28  d by EnterMutex(
5be0: 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78  ) and LeaveMutex
5bf0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ()..**.** SQLite
5c00: 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e   uses only a sin
5c10: 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72  gle Mutex.  Ther
5c20: 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72  e is not much cr
5c30: 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61  itical.** code a
5c40: 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74  nd what little t
5c50: 68 65 72 65 20 69 73 20 65 78 65 63 75 74 65 73  here is executes
5c60: 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74   quickly and wit
5c70: 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a  hout blocking..*
5c80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73  /.void sqlite3Os
5c90: 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69  EnterMutex(){.#i
5ca0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f  fdef SQLITE_W32_
5cb0: 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
5cc0: 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b   int isInit = 0;
5cd0: 0a 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69  .  while( !isIni
5ce0: 74 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  t ){.    static 
5cf0: 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20  long lock = 0;. 
5d00: 20 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b     if( Interlock
5d10: 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63  edIncrement(&loc
5d20: 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 49  k)==1 ){.      I
5d30: 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61  nitializeCritica
5d40: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20  lSection(&cs);. 
5d50: 20 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b       isInit = 1;
5d60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5d70: 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20    Sleep(1);.    
5d80: 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72 69  }.  }.  EnterCri
5d90: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73  ticalSection(&cs
5da0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
5db0: 72 74 28 20 21 69 6e 4d 75 74 65 78 20 29 3b 0a  rt( !inMutex );.
5dc0: 20 20 69 6e 4d 75 74 65 78 20 3d 20 31 3b 0a 7d    inMutex = 1;.}
5dd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 4c  .void sqlite3OsL
5de0: 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61  eaveMutex(){.  a
5df0: 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 20 29  ssert( inMutex )
5e00: 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b  ;.  inMutex = 0;
5e10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
5e20: 33 32 5f 54 48 52 45 41 44 53 0a 20 20 4c 65 61  32_THREADS.  Lea
5e30: 76 65 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f  veCriticalSectio
5e40: 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  n(&cs);.#endif.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
5e60: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
5e70: 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
5e80: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
5e90: 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
5ea0: 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
5eb0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
5ec0: 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
5ed0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
5ee0: 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
5ef0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
5f00: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
5f10: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
5f20: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
5f30: 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
5f40: 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
5f50: 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
5f60: 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
5f70: 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
5f80: 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
5f90: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
5fa0: 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
5fb0: 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
5fc0: 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
5fd0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
5fe0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
5ff0: 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
6000: 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
6010: 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
6020: 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
6030: 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
6040: 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
6050: 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
6060: 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
6070: 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
6080: 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
6090: 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
60a0: 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
60b0: 0a 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20  .  double now;. 
60c0: 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73   GetSystemTimeAs
60d0: 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
60e0: 0a 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c  .  now = ((doubl
60f0: 65 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  e)ft.dwHighDateT
6100: 69 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39  ime) * 429496729
6110: 36 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d  6.0; .  *prNow =
6120: 20 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77   (now + ft.dwLow
6130: 44 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30  DateTime)/864000
6140: 30 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38  000000.0 + 23058
6150: 31 33 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c  13.5;.#ifdef SQL
6160: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
6170: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
6180: 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
6190: 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
61a0: 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
61b0: 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
61c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
61d0: 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  n 0;.}..#endif /
61e0: 2a 20 4f 53 5f 57 49 4e 20 2a 2f 0a              * OS_WIN */.