/ Hex Artifact Content
Login

Artifact b9cb6254698cd7c2587c27e65b78c585473c6ffa:


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 65 74 65 72  .h"../*.** Deter
0350: 6d 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64  mine if we are d
0360: 65 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64  ealing with Wind
0370: 6f 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61  owsCE - which ha
0380: 73 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75  s a much.** redu
0390: 63 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  ced API..*/.#if 
03a0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
03b0: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 4f 53 5f  CE).# define OS_
03c0: 57 49 4e 43 45 20 31 0a 23 65 6c 73 65 0a 23 20  WINCE 1.#else.# 
03d0: 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 43 45 20  define OS_WINCE 
03e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
03f0: 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75  The winFile stru
0400: 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c  cture is a subcl
0410: 61 73 73 20 6f 66 20 4f 73 46 69 6c 65 20 73 70  ass of OsFile sp
0420: 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69  ecific to the wi
0430: 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69  n32.** portabili
0440: 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70  ty layer..*/.typ
0450: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46  edef struct winF
0460: 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72  ile winFile;.str
0470: 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20  uct winFile {.  
0480: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0490: 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75 73 74 20  pMethod;/* Must 
04a0: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 48 41  be first */.  HA
04b0: 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20  NDLE h;         
04c0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
04d0: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68  for accessing th
04e0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  e file */.  unsi
04f0: 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79  gned char lockty
0500: 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c  pe; /* Type of l
0510: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ock currently he
0520: 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ld on this file 
0530: 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65  */.  short share
0540: 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20  dLockByte;   /* 
0550: 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20  Randomly chosen 
0560: 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20 73  byte used as a s
0570: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 69  hared lock */.#i
0580: 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  f OS_WINCE.  WCH
0590: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
05a0: 73 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  se;   /* Name of
05b0: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
05c0: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
05d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  #endif.};.../*.*
05e0: 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  * Do not include
05f0: 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c 65   any of the File
0600: 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20 70   I/O interface p
0610: 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68 65  rocedures if the
0620: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  .** SQLITE_OMIT_
0630: 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73 20  DISKIO macro is 
0640: 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61 74  defined (indicat
0650: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 20 64  ing that there d
0660: 61 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20  atabase.** will 
0670: 62 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  be in-memory onl
0680: 79 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y).*/.#ifndef SQ
0690: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
06a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
06b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
06c0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
06d0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
06e0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
06f0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
0700: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
0710: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0720: 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57  is Win95.** or W
0730: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
0740: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
0750: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
0760: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
0770: 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a  tem is Win95..**
0780: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
0790: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
07a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
07b0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
07c0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
07d0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
07e0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
07f0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
0800: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
0810: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
0820: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
0830: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
0840: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  = 0;../*.** Retu
0850: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
0860: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
0870: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
0880: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
0890: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
08a0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
08b0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
08c0: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
08d0: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
08e0: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
08f0: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
0900: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
0910: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
0920: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
0930: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
0940: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
0950: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
0960: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
0970: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
0980: 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e   win running Win
0990: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
09a0: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
09b0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
09c0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
09d0: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
09e0: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
09f0: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
0a00: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
0a10: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
0a20: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
0a30: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
0a40: 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 4f 53  ) API..*/.#if OS
0a50: 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20  _WINCE.# define 
0a60: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
0a70: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
0a80: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
0a90: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
0aa0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
0ab0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e  SVERSIONINFO sIn
0ac0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
0ad0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
0ae0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
0af0: 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65  fo);.      GetVe
0b00: 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b  rsionEx(&sInfo);
0b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  .      sqlite3_o
0b20: 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64  s_type = sInfo.d
0b30: 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52  wPlatformId==VER
0b40: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
0b50: 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20  NT ? 2 : 1;.    
0b60: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  }.    return sql
0b70: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b  ite3_os_type==2;
0b80: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
0b90: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  S_WINCE */..#if 
0ba0: 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a 2a 2a 20 57  OS_WINCE./*.** W
0bb0: 69 6e 64 6f 77 73 43 45 20 64 6f 65 73 20 6e 6f  indowsCE does no
0bc0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
0bd0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
0be0: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
0bf0: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
0c00: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
0c10: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
0c20: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
0c30: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
0c40: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
0c50: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
0c60: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
0c70: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 69  TEMTIME pTm;.  i
0c80: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
0c90: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
0ca0: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
0cb0: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
0cc0: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
0cd0: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
0ce0: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
0cf0: 74 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33  teTime= t64 >> 3
0d00: 32 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c  2;.  FileTimeToL
0d10: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
0d20: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54  m,&lTm);.  FileT
0d30: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
0d40: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
0d50: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
0d60: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
0d70: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
0d80: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
0d90: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
0da0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
0db0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
0dc0: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
0dd0: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
0de0: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
0df0: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
0e00: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
0e10: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
0e20: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  f../*.** Compile
0e30: 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 4f   with -DSQLITE_O
0e40: 4d 49 54 5f 57 49 4e 5f 4c 4f 43 4b 53 20 74 6f  MIT_WIN_LOCKS to
0e50: 20 64 69 73 61 62 6c 65 20 66 69 6c 65 20 6c 6f   disable file lo
0e60: 63 6b 69 6e 67 20 6f 6e 0a 2a 2a 20 77 69 6e 64  cking on.** wind
0e70: 6f 77 73 2e 20 20 49 66 20 79 6f 75 20 64 6f 20  ows.  If you do 
0e80: 74 68 69 73 20 61 6e 64 20 74 77 6f 20 6f 72 20  this and two or 
0e90: 6d 6f 72 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  more connections
0ea0: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 77   attempt to.** w
0eb0: 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
0ec0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0ed0: 6d 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  me, the database
0ee0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a 2a 2a   file will be.**
0ef0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 42 75 74   corrupted.  But
0f00: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
0f10: 66 20 57 69 6e 64 6f 77 73 43 45 20 64 6f 20 6e  f WindowsCE do n
0f20: 6f 74 20 73 75 70 70 6f 72 74 20 6c 6f 63 6b 69  ot support locki
0f30: 6e 67 2c 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ng,.** in which 
0f40: 63 61 73 65 20 63 6f 6d 70 69 6c 69 6e 67 20 77  case compiling w
0f50: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ith this option 
0f60: 69 73 20 72 65 71 75 69 72 65 64 20 6a 75 73 74  is required just
0f70: 20 74 6f 20 67 65 74 0a 2a 2a 20 69 74 20 74 6f   to get.** it to
0f80: 20 77 6f 72 6b 20 61 74 20 61 6c 6c 2e 0a 2a 2f   work at all..*/
0f90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0fa0: 4d 49 54 5f 57 49 4e 5f 4c 4f 43 4b 53 0a 23 20  MIT_WIN_LOCKS.# 
0fb0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
0fc0: 61 2c 62 2c 63 2c 64 2c 65 29 20 28 31 29 0a 23  a,b,c,d,e) (1).#
0fd0: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
0fe0: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
0ff0: 28 31 29 0a 23 20 64 65 66 69 6e 65 20 55 6e 6c  (1).# define Unl
1000: 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c  ockFile(a,b,c,d,
1010: 65 29 20 28 31 29 0a 23 20 64 65 66 69 6e 65 20  e) (1).# define 
1020: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 61 2c 62  UnlockFileEx(a,b
1030: 2c 63 2c 64 2c 65 29 20 28 31 29 0a 23 65 6e 64  ,c,d,e) (1).#end
1040: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
1050: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
1060: 20 74 6f 20 55 54 46 2d 33 32 2e 20 20 53 70 61   to UTF-32.  Spa
1070: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
1080: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
1090: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
10a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
10b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52  .*/.static WCHAR
10c0: 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28   *utf8ToUnicode(
10d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
10e0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
10f0: 79 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57  yte;.  WCHAR *zW
1100: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
1110: 69 66 28 20 21 69 73 4e 54 28 29 20 29 7b 0a 20  if( !isNT() ){. 
1120: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1130: 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69  .  nByte = Multi
1140: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
1150: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
1160: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
1170: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
1180: 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  ;.  zWideFilenam
1190: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
11a0: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
11b0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
11c0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
11d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
11e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11f0: 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42    nByte = MultiB
1200: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
1210: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
1220: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
1230: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a  lename, nByte);.
1240: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
1250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1260: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
1270: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
1280: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1290: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
12a0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
12b0: 76 65 72 74 20 55 54 46 2d 33 32 20 74 6f 20 55  vert UTF-32 to U
12c0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
12d0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
12e0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
12f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1300: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  iteMalloc()..*/.
1310: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
1320: 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73 74  codeToUtf8(const
1330: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1340: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
1350: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
1360: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
1370: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1380: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
1390: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
13a0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
13b0: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
13c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
13d0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
13e0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
13f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1400: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1410: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1420: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
1430: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
1440: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
1470: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
1480: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
1490: 74 65 46 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  teFree(zFilename
14a0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
14b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
14c0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
14d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
14e0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
14f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 44  .int sqlite3WinD
1500: 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72  elete(const char
1510: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1520: 57 43 48 41 52 20 2a 7a 57 69 64 65 20 3d 20 75  WCHAR *zWide = u
1530: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1540: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
1550: 57 69 64 65 20 29 7b 0a 20 20 20 20 44 65 6c 65  Wide ){.    Dele
1560: 74 65 46 69 6c 65 57 28 7a 57 69 64 65 29 3b 0a  teFileW(zWide);.
1570: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1580: 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Wide);.  }else{.
1590: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
15a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15b0: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
15c0: 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 46 69 6c  DeleteFileA(zFil
15d0: 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
15e0: 20 7d 0a 20 20 54 52 41 43 45 32 28 22 44 45 4c   }.  TRACE2("DEL
15f0: 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  ETE \"%s\"\n", z
1600: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
1610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1630: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
1640: 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f   file exists..*/
1650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 46  .int sqlite3WinF
1660: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20  ileExists(const 
1670: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1680: 7b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  {.  int exists =
1690: 20 30 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   0;.  WCHAR *zWi
16a0: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
16b0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
16c0: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20   if( zWide ){.  
16d0: 20 20 65 78 69 73 74 73 20 3d 20 47 65 74 46 69    exists = GetFi
16e0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 57  leAttributesW(zW
16f0: 69 64 65 29 20 21 3d 20 30 78 66 66 66 66 66 66  ide) != 0xffffff
1700: 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ff;.    sqliteFr
1710: 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c  ee(zWide);.  }el
1720: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
1730: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1740: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
1750: 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65 74      exists = Get
1760: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1770: 7a 46 69 6c 65 6e 61 6d 65 29 20 21 3d 20 30 78  zFilename) != 0x
1780: 66 66 66 66 66 66 66 66 3b 0a 23 65 6e 64 69 66  ffffffff;.#endif
1790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78  .  }.  return ex
17a0: 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ists;.}../* Forw
17b0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
17c0: 2a 2f 0a 69 6e 74 20 61 6c 6c 6f 63 61 74 65 57  */.int allocateW
17d0: 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  inFile(winFile *
17e0: 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a  pInit, OsFile **
17f0: 70 49 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  pId);../*.** Att
1800: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66  empt to open a f
1810: 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ile for both rea
1820: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
1830: 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61  .  If that.** fa
1840: 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67  ils, try opening
1850: 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   it read-only.  
1860: 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
1870: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
1880: 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ry to create it.
1890: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
18a0: 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20  s, a handle for 
18b0: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  the open file is
18c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a   written to *id.
18d0: 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  ** and *pReadonl
18e0: 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  y is set to 0 if
18f0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
1900: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  ened for reading
1910: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20   and.** writing 
1920: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  or 1 if the file
1930: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
1940: 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63  -only.  The func
1950: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
1960: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1970: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
1980: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1990: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
19a0: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
19b0: 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  *id and *pReadon
19c0: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ly unchanged..*/
19d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 4f  .int sqlite3WinO
19e0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
19f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1a00: 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20  ename,.  OsFile 
1a10: 2a 2a 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52  **pId,.  int *pR
1a20: 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 77 69 6e  eadonly.){.  win
1a30: 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45  File f;.  HANDLE
1a40: 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   h;.  WCHAR *zWi
1a50: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
1a60: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
1a70: 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d 30   assert( *pId==0
1a80: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20   );.  if( zWide 
1a90: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
1aa0: 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20  eFileW(zWide,.  
1ab0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
1ac0: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1ad0: 45 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53  E,.       FILE_S
1ae0: 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1af0: 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20  _SHARE_WRITE,.  
1b00: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1b10: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
1b20: 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
1b30: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
1b40: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1b50: 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55  CCESS,.       NU
1b60: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  LL.    );.    if
1b70: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1b80: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1b90: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
1ba0: 65 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20  eW(zWide,.      
1bb0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c     GENERIC_READ,
1bc0: 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53  .         FILE_S
1bd0: 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20 20  HARE_READ,.     
1be0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
1bf0: 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a     OPEN_ALWAYS,.
1c00: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
1c10: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
1c20: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1c30: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
1c40: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b     NULL.      );
1c50: 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49 4e  .      if( h==IN
1c60: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1c70: 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  UE ){.        sq
1c80: 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29 3b  liteFree(zWide);
1c90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ca0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1cc0: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  pReadonly = 1;. 
1cd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  *pReadonly = 0;.
1cf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d00: 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d  Free(zWide);.  }
1d10: 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  else{.#if OS_WIN
1d20: 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  CE.    return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73  LITE_NOMEM;.#els
1d40: 65 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65  e.    h = Create
1d50: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
1d60: 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f  .       GENERIC_
1d70: 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
1d80: 52 49 54 45 2c 0a 20 20 20 20 20 20 20 46 49 4c  RITE,.       FIL
1d90: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
1da0: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
1db0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
1dc0: 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53       OPEN_ALWAYS
1dd0: 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54  ,.       FILE_AT
1de0: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
1df0: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1e00: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
1e10: 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20   NULL.    );.   
1e20: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
1e30: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1e40: 20 20 20 20 20 20 68 20 3d 20 43 72 65 61 74 65        h = Create
1e50: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
1e60: 0a 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49  .         GENERI
1e70: 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  C_READ,.        
1e80: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
1e90: 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  ,.         NULL,
1ea0: 0a 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41  .         OPEN_A
1eb0: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20  LWAYS,.         
1ec0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1ed0: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
1ee0: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
1ef0: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  .         NULL. 
1f00: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
1f10: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1f20: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1f30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f40: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
1f50: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 65 61     }.      *pRea
1f60: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
1f70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 65  else{.      *pRe
1f80: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
1f90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  }.#endif /* OS_W
1fa0: 49 4e 43 45 20 2a 2f 0a 20 20 7d 0a 20 20 66 2e  INCE */.  }.  f.
1fb0: 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f 63 6b 74  h = h;.  f.lockt
1fc0: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
1fd0: 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74   f.sharedLockByt
1fe0: 65 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 57 49  e = 0;.#if OS_WI
1ff0: 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65 74 65 4f  NCE.  f.zDeleteO
2000: 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 23 65 6e 64  nClose = 0;.#end
2010: 69 66 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45  if.  TRACE3("OPE
2020: 4e 20 52 2f 57 20 25 64 20 5c 22 25 73 5c 22 5c  N R/W %d \"%s\"\
2030: 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
2040: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f  );.  return allo
2050: 63 61 74 65 57 69 6e 46 69 6c 65 28 26 66 2c 20  cateWinFile(&f, 
2060: 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pId);.}.../*.** 
2070: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
2080: 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 65  a new file for e
2090: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
20a0: 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  by this process.
20b0: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77 69 6c  .** The file wil
20c0: 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20  l be opened for 
20d0: 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
20e0: 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20 61 76   writing.  To av
20f0: 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69  oid.** a potenti
2100: 61 6c 20 73 65 63 75 72 69 74 79 20 70 72 6f 62  al security prob
2110: 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61  lem, we do not a
2120: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
2130: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
2140: 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 4e 6f  sly existed.  No
2150: 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68  r do we allow th
2160: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61 20 73  e file to be a s
2170: 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e  ymbolic.** link.
2180: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61  .**.** If delFla
2190: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
21a0: 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  make arrangement
21b0: 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  s to automatical
21c0: 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65  ly delete.** the
21d0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21e0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   closed..**.** O
21f0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65  n success, write
2200: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
2210: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65   into *id and re
2220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2230: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
2240: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2250: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74  CANTOPEN..*/.int
2260: 20 73 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e 45   sqlite3WinOpenE
2270: 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63  xclusive(const c
2280: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2290: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69 6e  OsFile **pId, in
22a0: 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 77 69  t delFlag){.  wi
22b0: 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c  nFile f;.  HANDL
22c0: 45 20 68 3b 0a 20 20 69 6e 74 20 66 69 6c 65 66  E h;.  int filef
22d0: 6c 61 67 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a  lags;.  WCHAR *z
22e0: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
22f0: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
2300: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 49 64 20  .  assert( *pId 
2310: 3d 3d 20 30 20 29 3b 0a 20 20 66 69 6c 65 66 6c  == 0 );.  filefl
2320: 61 67 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  ags = FILE_FLAG_
2330: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
2340: 69 66 20 21 4f 53 5f 57 49 4e 43 45 0a 20 20 69  if !OS_WINCE.  i
2350: 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
2360: 20 20 66 69 6c 65 66 6c 61 67 73 20 7c 3d 20 46    fileflags |= F
2370: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
2380: 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46  MPORARY | FILE_F
2390: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
23a0: 4f 53 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  OSE;.  }.#endif.
23b0: 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20    if( zWide ){. 
23c0: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
23d0: 65 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20  eW(zWide,.      
23e0: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
23f0: 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20  GENERIC_WRITE,. 
2400: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
2410: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43 52 45  NULL,.       CRE
2420: 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  ATE_ALWAYS,.    
2430: 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20     fileflags,.  
2440: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b       NULL.    );
2450: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2460: 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zWide);.  }else{
2470: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
2480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2490: 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20  NOMEM;.#else.   
24a0: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41   h = CreateFileA
24b0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  (zFilename,.    
24c0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20     GENERIC_READ 
24d0: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  | GENERIC_WRITE,
24e0: 0a 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  .       0,.     
24f0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43    NULL,.       C
2500: 52 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20  REATE_ALWAYS,.  
2510: 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a       fileflags,.
2520: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
2530: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  );.#endif /* OS_
2540: 57 49 4e 43 45 20 2a 2f 0a 20 20 7d 0a 20 20 69  WINCE */.  }.  i
2550: 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
2560: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
2570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2580: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
2590: 66 2e 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f 63  f.h = h;.  f.loc
25a0: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
25b0: 0a 20 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b 42  .  f.sharedLockB
25c0: 79 74 65 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  yte = 0;.#if OS_
25d0: 57 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65 74  WINCE.  f.zDelet
25e0: 65 4f 6e 43 6c 6f 73 65 20 3d 20 64 65 6c 46 6c  eOnClose = delFl
25f0: 61 67 20 3f 20 75 74 66 38 54 6f 55 6e 69 63 6f  ag ? utf8ToUnico
2600: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 20 3a 20  de(zFilename) : 
2610: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 54 52 41 43  0;.#endif.  TRAC
2620: 45 33 28 22 4f 50 45 4e 20 45 58 20 25 64 20 5c  E3("OPEN EX %d \
2630: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
2640: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
2650: 6e 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c  n allocateWinFil
2660: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f  e(&f, pId);.}../
2670: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2680: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
2690: 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63  for read-only ac
26a0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  cess..**.** On s
26b0: 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68  uccess, write th
26c0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e  e file handle in
26d0: 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72  to *id and retur
26e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  n SQLITE_OK..**.
26f0: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72  ** On failure, r
2700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
2710: 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TOPEN..*/.int sq
2720: 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52 65 61 64  lite3WinOpenRead
2730: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20  Only(const char 
2740: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
2750: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e  le **pId){.  win
2760: 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45  File f;.  HANDLE
2770: 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   h;.  WCHAR *zWi
2780: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
2790: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
27a0: 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d 30   assert( *pId==0
27b0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20   );.  if( zWide 
27c0: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
27d0: 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20  eFileW(zWide,.  
27e0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
27f0: 44 2c 0a 20 20 20 20 20 20 20 30 2c 0a 20 20 20  D,.       0,.   
2800: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
2810: 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a   OPEN_EXISTING,.
2820: 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52         FILE_ATTR
2830: 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46  IBUTE_NORMAL | F
2840: 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
2850: 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e  ACCESS,.       N
2860: 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ULL.    );.    s
2870: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29  qliteFree(zWide)
2880: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f  ;.  }else{.#if O
2890: 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75  S_WINCE.    retu
28a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
28b0: 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 43  .#else.    h = C
28c0: 72 65 61 74 65 46 69 6c 65 41 28 7a 46 69 6c 65  reateFileA(zFile
28d0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 47 45 4e  name,.       GEN
28e0: 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20  ERIC_READ,.     
28f0: 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c    0,.       NULL
2900: 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45 58  ,.       OPEN_EX
2910: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20 46  ISTING,.       F
2920: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
2930: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
2940: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
2950: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
2960: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
2970: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
2980: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
2990: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29a0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
29b0: 20 66 2e 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f   f.h = h;.  f.lo
29c0: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
29d0: 3b 0a 20 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b  ;.  f.sharedLock
29e0: 42 79 74 65 20 3d 20 30 3b 0a 23 69 66 20 4f 53  Byte = 0;.#if OS
29f0: 5f 57 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65  _WINCE.  f.zDele
2a00: 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 23  teOnClose = 0;.#
2a10: 65 6e 64 69 66 0a 20 20 54 52 41 43 45 33 28 22  endif.  TRACE3("
2a20: 4f 50 45 4e 20 52 4f 20 25 64 20 5c 22 25 73 5c  OPEN RO %d \"%s\
2a30: 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  "\n", h, zFilena
2a40: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c  me);.  return al
2a50: 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28 26 66  locateWinFile(&f
2a60: 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pId);.}../*.**
2a70: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
2a80: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2a90: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
2aa0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
2ab0: 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  ns a.** file.  T
2ac0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
2ad0: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
2ae0: 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64  to fsync() the d
2af0: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f  irectory.** in o
2b00: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  rder to make sur
2b10: 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  e the creation o
2b20: 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  f a new file is 
2b30: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
2b40: 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  .** to disk..**.
2b50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b60: 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66  is only meaningf
2b70: 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74  ul for Unix.  It
2b80: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65   is a no-op unde
2b90: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e  r.** windows sin
2ba0: 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  ce windows does 
2bb0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72 64  not support hard
2bc0: 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e   links..**.** On
2bd0: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
2be0: 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75  le for a previou
2bf0: 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  sly open file is
2c00: 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70   at *id is.** up
2c10: 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  dated with the n
2c20: 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  ew directory fil
2c30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
2c40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
2c50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2c60: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
2c70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2c80: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
2c90: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
2ca0: 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  *id unchanged..*
2cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2cc0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20  OpenDirectory(. 
2cd0: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63   OsFile *id,.  c
2ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
2cf0: 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
2d00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d10: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
2d20: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
2d30: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
2d40: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
2d50: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
2d60: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
2d70: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
2d80: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
2d90: 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72   store.** tempor
2da0: 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 68  ary files..*/.ch
2db0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70  ar *sqlite3_temp
2dc0: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
2dd0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2de0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
2df0: 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
2e00: 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
2e10: 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
2e20: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
2e30: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 63  _TEMPNAME_SIZE c
2e40: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e  haracters..*/.in
2e50: 74 20 73 71 6c 69 74 65 33 57 69 6e 54 65 6d 70  t sqlite3WinTemp
2e60: 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a 7a  FileName(char *z
2e70: 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
2e80: 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
2e90: 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
2ea0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
2eb0: 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2ec0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
2ed0: 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
2ee0: 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ";.  int i, j;. 
2ef0: 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
2f00: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
2f10: 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20 73 71 6c  SIZE];.  if( sql
2f20: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2f30: 6f 72 79 20 29 7b 0a 20 20 20 20 73 74 72 6e 63  ory ){.    strnc
2f40: 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 73 71  py(zTempPath, sq
2f50: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2f60: 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f 54 45 4d  tory, SQLITE_TEM
2f70: 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b 0a  PNAME_SIZE-30);.
2f80: 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51      zTempPath[SQ
2f90: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
2fa0: 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 7d 65  ZE-30] = 0;.  }e
2fb0: 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
2fc0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
2fd0: 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
2fe0: 69 64 65 50 61 74 68 5b 53 51 4c 49 54 45 5f 54  idePath[SQLITE_T
2ff0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
3000: 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28     GetTempPathW(
3010: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
3020: 53 49 5a 45 2d 33 30 2c 20 7a 57 69 64 65 50 61  SIZE-30, zWidePa
3030: 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20  th);.    zMulti 
3040: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
3050: 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
3060: 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20  if( zMulti ){.  
3070: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 54 65 6d      strncpy(zTem
3080: 70 50 61 74 68 2c 20 7a 4d 75 6c 74 69 2c 20 53  pPath, zMulti, S
3090: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
30a0: 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20 20 20 7a  IZE-30);.      z
30b0: 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f  TempPath[SQLITE_
30c0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
30d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 0;.      sql
30e0: 69 74 65 46 72 65 65 28 7a 4d 75 6c 74 69 29 3b  iteFree(zMulti);
30f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
3100: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41      GetTempPathA
3110: 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  (SQLITE_TEMPNAME
3120: 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70 50  _SIZE-30, zTempP
3130: 61 74 68 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ath);.  }.  for(
3140: 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61  i=strlen(zTempPa
3150: 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d  th); i>0 && zTem
3160: 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27  pPath[i-1]=='\\'
3170: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70  ; i--){}.  zTemp
3180: 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 66  Path[i] = 0;.  f
3190: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70 72 69  or(;;){.    spri
31a0: 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 5c 5c 22  ntf(zBuf, "%s\\"
31b0: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
31c0: 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20  , zTempPath);.  
31d0: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75    j = strlen(zBu
31e0: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  f);.    sqlite3R
31f0: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
3200: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
3210: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
3220: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
3230: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
3240: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
3250: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
3260: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
3270: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
3280: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  uf[j] = 0;.    i
3290: 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
32a0: 65 45 78 69 73 74 73 28 7a 42 75 66 29 20 29 20  eExists(zBuf) ) 
32b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 52 41  break;.  }.  TRA
32c0: 43 45 32 28 22 54 45 4d 50 20 46 49 4c 45 4e 41  CE2("TEMP FILENA
32d0: 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  ME: %s\n", zBuf)
32e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32f0: 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
3300: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
3310: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
3320: 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49  lose(OsFile **pI
3330: 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
3340: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 49 64 20  File;.  if( pId 
3350: 26 26 20 28 70 46 69 6c 65 20 3d 20 28 77 69 6e  && (pFile = (win
3360: 46 69 6c 65 2a 29 2a 70 49 64 29 21 3d 30 20 29  File*)*pId)!=0 )
3370: 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 43 4c  {.    TRACE2("CL
3380: 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  OSE %d\n", pFile
3390: 2d 3e 68 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48  ->h);.    CloseH
33a0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
33b0: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
33c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
33d0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
33e0: 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57       DeleteFileW
33f0: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
3400: 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 20 20 73  nClose);.      s
3410: 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65 2d  qliteFree(pFile-
3420: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
3430: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
3440: 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d     OpenCounter(-
3450: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  1);.    sqliteFr
3460: 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 2a  ee(pFile);.    *
3470: 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  pId = 0;.  }.  r
3480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
34a0: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
34b0: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
34c0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
34d0: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
34e0: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
34f0: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
3500: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
3510: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
3520: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
3530: 74 20 77 69 6e 52 65 61 64 28 4f 73 46 69 6c 65  t winRead(OsFile
3540: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66   *id, void *pBuf
3550: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57  , int amt){.  DW
3560: 4f 52 44 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  ORD got;.  asser
3570: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
3580: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
3590: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
35a0: 52 41 43 45 33 28 22 52 45 41 44 20 25 64 20 6c  RACE3("READ %d l
35b0: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 77 69 6e  ock=%d\n", ((win
35c0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28  File*)id)->h, ((
35d0: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  winFile*)id)->lo
35e0: 63 6b 74 79 70 65 29 3b 0a 20 20 69 66 28 20 21  cktype);.  if( !
35f0: 52 65 61 64 46 69 6c 65 28 28 28 77 69 6e 46 69  ReadFile(((winFi
3600: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66  le*)id)->h, pBuf
3610: 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20  , amt, &got, 0) 
3620: 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b 0a  ){.    got = 0;.
3630: 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28    }.  if( got==(
3640: 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
3650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3660: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
3670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
3680: 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ERR;.  }.}../*.*
3690: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
36a0: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
36b0: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
36c0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
36d0: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
36e0: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
36f0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
3700: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
3710: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ite(OsFile *id, 
3720: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
3730: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e  , int amt){.  in
3740: 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
3750: 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73 65 72  D wrote;.  asser
3760: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
3770: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
3780: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53  LITE_IOERR);.  S
3790: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
37a0: 72 72 6f 72 3b 0a 20 20 54 52 41 43 45 33 28 22  rror;.  TRACE3("
37b0: 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64  WRITE %d lock=%d
37c0: 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29  \n", ((winFile*)
37d0: 69 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c  id)->h, ((winFil
37e0: 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65  e*)id)->locktype
37f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
3800: 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  >0 );.  while( a
3810: 6d 74 3e 30 20 26 26 20 28 72 63 20 3d 20 57 72  mt>0 && (rc = Wr
3820: 69 74 65 46 69 6c 65 28 28 28 77 69 6e 46 69 6c  iteFile(((winFil
3830: 65 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c  e*)id)->h, pBuf,
3840: 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29   amt, &wrote, 0)
3850: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
3860: 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20   wrote>0 ){.    
3870: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
3880: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
3890: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
38a0: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
38b0: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
38c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
38d0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
38e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  K;.}../*.** Some
3900: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
3910: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
3920: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
3930: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
3940: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
3950: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
3960: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
3970: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
3980: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
3990: 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70  the read/write p
39a0: 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65  ointer in a file
39b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39c0: 77 69 6e 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a  winSeek(OsFile *
39d0: 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b  id, i64 offset){
39e0: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
39f0: 73 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a  s = offset>>32;.
3a00: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
3a10: 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66 66   = offset & 0xff
3a20: 66 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44 20  ffffff;.  DWORD 
3a30: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
3a40: 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
3a50: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
3a60: 6f 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74  offset ) Simulat
3a70: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 0a 23  eDiskfullError.#
3a80: 65 6e 64 69 66 0a 20 20 53 45 45 4b 28 6f 66 66  endif.  SEEK(off
3a90: 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20  set/1024 + 1);. 
3aa0: 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69   rc = SetFilePoi
3ab0: 6e 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a 29  nter(((winFile*)
3ac0: 69 64 29 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  id)->h, lowerBit
3ad0: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
3ae0: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 54 52  ILE_BEGIN);.  TR
3af0: 41 43 45 33 28 22 53 45 45 4b 20 25 64 20 25 6c  ACE3("SEEK %d %l
3b00: 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65  ld\n", ((winFile
3b10: 2a 29 69 64 29 2d 3e 68 2c 20 6f 66 66 73 65 74  *)id)->h, offset
3b20: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56  );.  if( rc==INV
3b30: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
3b40: 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61 73 74  INTER && GetLast
3b50: 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52 4f  Error()!=NO_ERRO
3b60: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
3b70: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
3b80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3b90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
3ba0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
3bb0: 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
3bc0: 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
3bd0: 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
3be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
3bf0: 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
3c00: 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
3c10: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
3c20: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 53 59 4e  );.  TRACE3("SYN
3c30: 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  C %d lock=%d\n",
3c40: 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d   ((winFile*)id)-
3c50: 3e 68 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  >h, ((winFile*)i
3c60: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  d)->locktype);. 
3c70: 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75   if( FlushFileBu
3c80: 66 66 65 72 73 28 28 28 77 69 6e 46 69 6c 65 2a  ffers(((winFile*
3c90: 29 69 64 29 2d 3e 68 29 20 29 7b 0a 20 20 20 20  )id)->h) ){.    
3ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3cb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3cc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
3cd0: 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  RR;.  }.}../*.**
3ce0: 20 53 79 6e 63 20 74 68 65 20 64 69 72 65 63 74   Sync the direct
3cf0: 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68  ory zDirname. Th
3d00: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e  is is a no-op on
3d10: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
3d20: 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e  ms other.** than
3d30: 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e 74 20 73 71   UNIX..*/.int sq
3d40: 6c 69 74 65 33 57 69 6e 53 79 6e 63 44 69 72 65  lite3WinSyncDire
3d50: 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
3d60: 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20 20 53   *zDirname){.  S
3d70: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
3d80: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
3d90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
3db0: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
3dc0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
3dd0: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
3de0: 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 4f  nt winTruncate(O
3df0: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  sFile *id, i64 n
3e00: 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20 75 70  Byte){.  LONG up
3e10: 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74 65 3e  perBits = nByte>
3e20: 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28 20 69  >32;.  assert( i
3e30: 64 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33  d!=0 );.  TRACE3
3e40: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
3e50: 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65  ld\n", ((winFile
3e60: 2a 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 29  *)id)->h, nByte)
3e70: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
3e80: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
3e90: 29 3b 0a 20 20 53 65 74 46 69 6c 65 50 6f 69 6e  );.  SetFilePoin
3ea0: 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ter(((winFile*)i
3eb0: 64 29 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75  d)->h, nByte, &u
3ec0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
3ed0: 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f  EGIN);.  SetEndO
3ee0: 66 46 69 6c 65 28 28 28 77 69 6e 46 69 6c 65 2a  fFile(((winFile*
3ef0: 29 69 64 29 2d 3e 68 29 3b 0a 20 20 72 65 74 75  )id)->h);.  retu
3f00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3f10: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
3f20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
3f30: 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
3f40: 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
3f50: 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 4f  nt winFileSize(O
3f60: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  sFile *id, i64 *
3f70: 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52 44 20  pSize){.  DWORD 
3f80: 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77 65 72  upperBits, lower
3f90: 42 69 74 73 3b 0a 20 20 61 73 73 65 72 74 28 20  Bits;.  assert( 
3fa0: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
3fb0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
3fc0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 6c 6f 77 65  E_IOERR);.  lowe
3fd0: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
3fe0: 69 7a 65 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ize(((winFile*)i
3ff0: 64 29 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  d)->h, &upperBit
4000: 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28  s);.  *pSize = (
4010: 28 28 69 36 34 29 75 70 70 65 72 42 69 74 73 29  ((i64)upperBits)
4020: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
4030: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
4040: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4050: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
4060: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
4070: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
4080: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
4090: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
40a0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
40b0: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
40c0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
40d0: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
40e0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
40f0: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
4100: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
4110: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
4120: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
4130: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4140: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
4150: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
4160: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
4170: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 69 64  Lock(winFile *id
4180: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
4190: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
41a0: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
41b0: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
41c0: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
41d0: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
41e0: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
41f0: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
4200: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
4210: 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c 4f 43  ileEx(id->h, LOC
4220: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
4230: 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41 52 45  IATELY, 0, SHARE
4240: 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70 29 3b  D_SIZE,0,&ovlp);
4250: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
4260: 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
4270: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
4280: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
4290: 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b    id->sharedLock
42a0: 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
42b0: 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
42c0: 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
42d0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69  res = LockFile(i
42e0: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  d->h, SHARED_FIR
42f0: 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63  ST+id->sharedLoc
4300: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
4310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
4320: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
4330: 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
4340: 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
4350: 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
4360: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
4370: 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
4380: 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  ) ){.    res = U
4390: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
43a0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
43b0: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
43c0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
43d0: 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46     res = UnlockF
43e0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
43f0: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 46 69  ARED_FIRST + pFi
4400: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
4410: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
4420: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
4430: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4440: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
4450: 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  GMAS./*.** Check
4460: 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70 61   that a given pa
4470: 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65  thname is a dire
4480: 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72 69  ctory and is wri
4490: 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74  table .**.*/.int
44a0: 20 73 71 6c 69 74 65 33 57 69 6e 49 73 44 69 72   sqlite3WinIsDir
44b0: 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a  Writable(char *z
44c0: 44 69 72 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  Dirname){.  int 
44d0: 66 69 6c 65 41 74 74 72 3b 0a 20 20 57 43 48 41  fileAttr;.  WCHA
44e0: 52 20 2a 7a 57 69 64 65 3b 0a 20 20 69 66 28 20  R *zWide;.  if( 
44f0: 7a 44 69 72 6e 61 6d 65 3d 3d 30 20 29 20 72 65  zDirname==0 ) re
4500: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69  turn 0;.  if( !i
4510: 73 4e 54 28 29 20 26 26 20 73 74 72 6c 65 6e 28  sNT() && strlen(
4520: 7a 44 69 72 6e 61 6d 65 29 3e 4d 41 58 5f 50 41  zDirname)>MAX_PA
4530: 54 48 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  TH ) return 0;. 
4540: 20 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55   zWide = utf8ToU
4550: 6e 69 63 6f 64 65 28 7a 44 69 72 6e 61 6d 65 29  nicode(zDirname)
4560: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b  ;.  if( zWide ){
4570: 0a 20 20 20 20 66 69 6c 65 41 74 74 72 20 3d 20  .    fileAttr = 
4580: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4590: 73 57 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 73  sW(zWide);.    s
45a0: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29  qliteFree(zWide)
45b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f  ;.  }else{.#if O
45c0: 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75  S_WINCE.    retu
45d0: 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20  rn 0;.#else.    
45e0: 66 69 6c 65 41 74 74 72 20 3d 20 47 65 74 46 69  fileAttr = GetFi
45f0: 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 44  leAttributesA(zD
4600: 69 72 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  irname);.#endif.
4610: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 41 74    }.  if( fileAt
4620: 74 72 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66  tr == 0xffffffff
4630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4640: 66 28 20 28 66 69 6c 65 41 74 74 72 20 26 20 46  f( (fileAttr & F
4650: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
4660: 52 45 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45  RECTORY) != FILE
4670: 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
4680: 54 4f 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75  TORY ){.    retu
4690: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
46a0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
46b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  * SQLITE_OMIT_PA
46c0: 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  GER_PRAGMAS */..
46d0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
46e0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
46f0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
4700: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
4710: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
4720: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
4730: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
4740: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
4750: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
4760: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
4770: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
4780: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
4790: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
47a0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
47b0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
47c0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
47d0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
47e0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
47f0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
4800: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
4810: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
4820: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
4830: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
4840: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
4850: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
4860: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
4870: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
4880: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
4890: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
48a0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
48b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
48c0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
48d0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
48e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
48f0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
4900: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
4910: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
4920: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
4930: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
4940: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
4950: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
4960: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
4970: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
4980: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
4990: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
49a0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
49b0: 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
49c0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
49d0: 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
49e0: 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
49f0: 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
4a00: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
4a10: 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
4a20: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
4a30: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
4a40: 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
4a50: 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
4a60: 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
4a70: 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
4a80: 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
4a90: 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 4f 73 46 69  int winLock(OsFi
4aa0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
4ab0: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
4ac0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
4ad0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
4ae0: 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
4af0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
4b00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
4b10: 65 73 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f  esult of a windo
4b20: 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
4b30: 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
4b40: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
4b50: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20  id->locktype to 
4b60: 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
4b70: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e exiting */.  i
4b80: 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
4b90: 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66  k = 0;/* True if
4ba0: 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50   we acquired a P
4bb0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73  ENDING lock this
4bc0: 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69   time */.  winFi
4bd0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
4be0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
4bf0: 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
4c00: 0a 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20  .  TRACE5("LOCK 
4c10: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
4c20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
4c30: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
4c40: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
4c50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
4c60: 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f  dLockByte);..  /
4c70: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
4c80: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
4c90: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
4ca0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
4cb0: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
4cc0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
4cd0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
4ce0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
4cf0: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
4d00: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
4d10: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
4d20: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
4d30: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
4d40: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
4d50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4d60: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
4d70: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
4d80: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
4d90: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
4da0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
4db0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
4dc0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
4dd0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
4de0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
4df0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
4e00: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
4e10: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
4e20: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
4e30: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
4e40: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
4e50: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
4e60: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
4e70: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
4e80: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
4e90: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
4ea0: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
4eb0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
4ec0: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
4ed0: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
4ee0: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
4ef0: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
4f00: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
4f10: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
4f20: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70  ocktype;.  if( p
4f30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
4f40: 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c  NO_LOCK.   || (l
4f50: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
4f60: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
4f70: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
4f80: 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  RVED_LOCK).  ){.
4f90: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
4fa0: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
4fb0: 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f  ->0 && (res = Lo
4fc0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
4fd0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
4fe0: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
4ff0: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
5000: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
5010: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
5020: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d  e pending lock m
5030: 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a  ight be.      **
5040: 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
5050: 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20   reader process 
5060: 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  who will release
5070: 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e   it momentarily.
5080: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5090: 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f  TRACE2("could no
50a0: 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20  t get a PENDING 
50b0: 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c  lock. cnt=%d\n",
50c0: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c 65   cnt);.      Sle
50d0: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
50e0: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
50f0: 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = res;.  }..  /*
5100: 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
5110: 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
5120: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
5130: 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
5140: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
5150: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
5160: 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  O_LOCK );.    re
5170: 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  s = getReadLock(
5180: 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
5190: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
51a0: 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
51b0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
51c0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
51d0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
51e0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
51f0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
5200: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
5210: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
5220: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
5230: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
5240: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
5250: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
5260: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
5270: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
5280: 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
5290: 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b  = RESERVED_LOCK;
52a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
52b0: 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
52c0: 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
52d0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
52e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
52f0: 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
5300: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
5310: 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
5320: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
5330: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
5340: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
5350: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
5360: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
5370: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
5380: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
5390: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
53a0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
53b0: 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64  res = unlockRead
53c0: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
53d0: 20 54 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c   TRACE2("unreadl
53e0: 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73  ock = %d\n", res
53f0: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  );.    res = Loc
5400: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5410: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
5420: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
5430: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
5440: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
5450: 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
5460: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
5470: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 65 72        TRACE2("er
5480: 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
5490: 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  , GetLastError()
54a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
54b0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
54c0: 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
54d0: 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
54e0: 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
54f0: 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
5500: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
5510: 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
5520: 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
5530: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
5540: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
5550: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
5560: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
5570: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
5580: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
5590: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
55a0: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
55b0: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
55c0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
55d0: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
55e0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
55f0: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
5600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
5610: 73 65 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22  se{.    TRACE4("
5620: 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74  LOCK FAILED %d t
5630: 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74  rying for %d but
5640: 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c   got %d\n", pFil
5650: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
5660: 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
5670: 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 72 63 20  cktype);.    rc 
5680: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
5690: 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
56a0: 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79  type = newLockty
56b0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
56c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
56d0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
56e0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
56f0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
5700: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
5710: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
5720: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
5730: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
5740: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
5750: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
5760: 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
5770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5780: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
5790: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
57a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69  {.  int rc;.  wi
57b0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
57c0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  winFile*)id;.  a
57d0: 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
57e0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
57f0: 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
5800: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
5810: 63 20 3d 20 31 3b 0a 20 20 20 20 54 52 41 43 45  c = 1;.    TRACE
5820: 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  3("TEST WR-LOCK 
5830: 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22  %d %d (local)\n"
5840: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b  , pFile->h, rc);
5850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
5860: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
5870: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
5880: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
5890: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
58a0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
58b0: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
58c0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
58d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
58e0: 21 72 63 3b 0a 20 20 20 20 54 52 41 43 45 33 28  !rc;.    TRACE3(
58f0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
5900: 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c   %d (remote)\n",
5910: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a   pFile->h, rc);.
5920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
5940: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
5950: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
5960: 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
5970: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
5980: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
5990: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
59a0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
59b0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
59c0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
59d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
59e0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
59f0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
5a00: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
5a10: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5a20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
5a30: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
5a40: 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
5a50: 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
5a60: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5a70: 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
5a80: 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
5a90: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
5aa0: 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
5ab0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
5ac0: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
5ad0: 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
5ae0: 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
5af0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
5b00: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
5b10: 6e 74 20 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  nt type;.  int r
5b20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5b30: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
5b40: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
5b50: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
5b60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5b70: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
5b80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 54 52 41 43 45  _LOCK );.  TRACE
5b90: 35 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  5("UNLOCK %d to 
5ba0: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
5bb0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
5bc0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
5bd0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
5be0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
5bf0: 63 6b 42 79 74 65 29 3b 0a 20 20 74 79 70 65 20  ckByte);.  type 
5c00: 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
5c10: 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
5c20: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
5c30: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
5c40: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
5c50: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
5c60: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
5c70: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
5c80: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
5c90: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
5ca0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
5cb0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
5cc0: 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
5cd0: 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
5ce0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
5cf0: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
5d00: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
5d10: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
5d20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5d30: 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
5d40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
5d50: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
5d60: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
5d70: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
5d80: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
5d90: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
5da0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
5db0: 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
5dc0: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
5dd0: 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
5de0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
5df0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
5e00: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
5e10: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
5e20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
5e30: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
5e40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5e50: 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
5e60: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
5e70: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
5e80: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
5e90: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c  er.** to the ful
5ea0: 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65  l pathname store
5eb0: 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
5ec0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
5ed0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20  alloc()..** The 
5ee0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5ef0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5f00: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69 73  for freeing this
5f10: 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a   space once it.*
5f20: 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  * is no longer n
5f30: 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  eeded..*/.char *
5f40: 73 71 6c 69 74 65 33 57 69 6e 46 75 6c 6c 50 61  sqlite3WinFullPa
5f50: 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  thname(const cha
5f60: 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20  r *zRelative){. 
5f70: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 23 69   char *zFull;.#i
5f80: 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
5f90: 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74  IN__).  int nByt
5fa0: 65 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 72  e;.  nByte = str
5fb0: 6c 65 6e 28 7a 52 65 6c 61 74 69 76 65 29 20 2b  len(zRelative) +
5fc0: 20 4d 41 58 5f 50 41 54 48 20 2b 20 31 30 30 31   MAX_PATH + 1001
5fd0: 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 73 71 6c 69  ;.  zFull = sqli
5fe0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
5ff0: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d  );.  if( zFull==
6000: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6010: 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
6020: 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
6030: 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  th(zRelative, zF
6040: 75 6c 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ull) ) return 0;
6050: 0a 23 65 6c 69 66 20 4f 53 5f 57 49 4e 43 45 0a  .#elif OS_WINCE.
6060: 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
6070: 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
6080: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
6090: 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
60a0: 64 2e 20 2a 2f 0a 20 20 7a 46 75 6c 6c 20 3d 20  d. */.  zFull = 
60b0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 52 65  sqliteStrDup(zRe
60c0: 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20  lative);.#else. 
60d0: 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b   char *zNotUsed;
60e0: 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65 3b  .  WCHAR *zWide;
60f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
6100: 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  zWide = utf8ToUn
6110: 69 63 6f 64 65 28 7a 52 65 6c 61 74 69 76 65 29  icode(zRelative)
6120: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b  ;.  if( zWide ){
6130: 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d  .    WCHAR *zTem
6140: 70 2c 20 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a 20  p, *zNotUsedW;. 
6150: 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75     nByte = GetFu
6160: 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69 64  llPathNameW(zWid
6170: 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  e, 0, 0, &zNotUs
6180: 65 64 57 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54  edW) + 1;.    zT
6190: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
61a0: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
61b0: 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
61c0: 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
61d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 47   return 0;.    G
61e0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
61f0: 7a 57 69 64 65 2c 20 6e 42 79 74 65 2c 20 7a 54  zWide, nByte, zT
6200: 65 6d 70 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29  emp, &zNotUsedW)
6210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
6220: 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 7a 46 75  (zWide);.    zFu
6230: 6c 6c 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ll = unicodeToUt
6240: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
6250: 71 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70 29  qliteFree(zTemp)
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
6270: 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61  Byte = GetFullPa
6280: 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69 76  thNameA(zRelativ
6290: 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  e, 0, 0, &zNotUs
62a0: 65 64 29 20 2b 20 31 3b 0a 20 20 20 20 7a 46 75  ed) + 1;.    zFu
62b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
62c0: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
62d0: 7a 46 75 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20 20  zFull[0]) );.   
62e0: 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20   if( zFull==0 ) 
62f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 47 65  return 0;.    Ge
6300: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 7a  tFullPathNameA(z
6310: 52 65 6c 61 74 69 76 65 2c 20 6e 42 79 74 65 2c  Relative, nByte,
6320: 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65   zFull, &zNotUse
6330: 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
6340: 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d   return zFull;.}
6350: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 75 6c 6c  ../*.** The full
6360: 53 79 6e 63 20 6f 70 74 69 6f 6e 20 69 73 20 6d  Sync option is m
6370: 65 61 6e 69 6e 67 6c 65 73 73 20 6f 6e 20 77 69  eaningless on wi
6380: 6e 64 6f 77 73 2e 20 20 20 54 68 69 73 20 69 73  ndows.   This is
6390: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
63a0: 74 69 63 20 76 6f 69 64 20 77 69 6e 53 65 74 46  tic void winSetF
63b0: 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  ullSync(OsFile *
63c0: 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20 72 65  id, int v){.  re
63d0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
63e0: 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72 6c  eturn the underl
63f0: 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65  ying file handle
6400: 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a 2a   for an OsFile.*
6410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6420: 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46 69 6c  FileHandle(OsFil
6430: 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  e *id){.  return
6440: 20 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a   (int)((winFile*
6450: 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  )id)->h;.}../*.*
6460: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
6470: 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73  ger that indices
6480: 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   the type of loc
6490: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
64a0: 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64  .** by this hand
64b0: 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74  le.  (Used for t
64c0: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
64d0: 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74  sis only.).*/.st
64e0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
64f0: 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64  State(OsFile *id
6500: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 77 69  ){.  return ((wi
6510: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b  nFile*)id)->lock
6520: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  type;.}../*.** T
6530: 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
6540: 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
6550: 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
6560: 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65  ate on an OsFile
6570: 0a 2a 2a 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  .** for win32..*
6580: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49  /.static const I
6590: 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 57  oMethod sqlite3W
65a0: 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
65b0: 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e   winClose,.  win
65c0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20  OpenDirectory,. 
65d0: 20 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57   winRead,.  winW
65e0: 72 69 74 65 2c 0a 20 20 77 69 6e 53 65 65 6b 2c  rite,.  winSeek,
65f0: 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a  .  winTruncate,.
6600: 20 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e    winSync,.  win
6610: 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 77  SetFullSync,.  w
6620: 69 6e 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20  inFileHandle,.  
6630: 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20 77  winFileSize,.  w
6640: 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c  inLock,.  winUnl
6650: 6f 63 6b 2c 0a 20 20 77 69 6e 4c 6f 63 6b 53 74  ock,.  winLockSt
6660: 61 74 65 2c 0a 20 20 77 69 6e 43 68 65 63 6b 52  ate,.  winCheckR
6670: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
6680: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6690: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 6e 20 4f 73  memory for an Os
66a0: 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69 7a  File.  Initializ
66b0: 65 20 74 68 65 20 6e 65 77 20 4f 73 46 69 6c 65  e the new OsFile
66c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65  .** to the value
66d0: 20 67 69 76 65 6e 20 69 6e 20 70 49 6e 69 74 20   given in pInit 
66e0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
66f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
6700: 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49 66 20 77  ** OsFile.  If w
6710: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
6720: 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  ory, close the f
6730: 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ile and return N
6740: 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 61 6c 6c 6f  ULL..*/.int allo
6750: 63 61 74 65 57 69 6e 46 69 6c 65 28 77 69 6e 46  cateWinFile(winF
6760: 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69  ile *pInit, OsFi
6770: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e  le **pId){.  win
6780: 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  File *pNew;.  pN
6790: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
67a0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
67b0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
67c0: 30 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61  0 ){.    CloseHa
67d0: 6e 64 6c 65 28 70 49 6e 69 74 2d 3e 68 29 3b 0a  ndle(pInit->h);.
67e0: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
67f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 69   sqliteFree(pIni
6800: 74 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  t->zDeleteOnClos
6810: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2a  e);.#endif.    *
6820: 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  pId = 0;.    ret
6830: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6840: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
6850: 70 4e 65 77 20 3d 20 2a 70 49 6e 69 74 3b 0a 20  pNew = *pInit;. 
6860: 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
6870: 20 3d 20 26 73 71 6c 69 74 65 33 57 69 6e 49 6f   = &sqlite3WinIo
6880: 4d 65 74 68 6f 64 3b 0a 20 20 20 20 2a 70 49 64  Method;.    *pId
6890: 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77   = (OsFile*)pNew
68a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
68b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ITE_OK;.  }.}...
68c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
68d0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.
68e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
6930: 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65  Everything above
6940: 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65   deals with file
6950: 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e   I/O.  Everythin
6960: 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  g that follows d
6970: 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68  eals.** with oth
6980: 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  er miscellanous 
6990: 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f  aspects of the o
69a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
69b0: 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a  interface.******
69c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a00: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  ******/../*.** G
6a10: 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  et information t
6a20: 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f  o seed the rando
6a30: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
6a40: 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a  or.  The seed.**
6a50: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
6a60: 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66   the buffer zBuf
6a70: 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c  [256].  The call
6a80: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
6a90: 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75  t.** supply a su
6aa0: 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65  fficiently large
6ab0: 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20   buffer..*/.int 
6ac0: 73 71 6c 69 74 65 33 57 69 6e 52 61 6e 64 6f 6d  sqlite3WinRandom
6ad0: 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29  Seed(char *zBuf)
6ae0: 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  {.  /* We have t
6af0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
6b00: 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
6b10: 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
6b20: 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
6b30: 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
6b40: 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
6b50: 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
6b60: 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
6b70: 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
6b80: 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
6b90: 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
6ba0: 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
6bb0: 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
6bc0: 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
6bd0: 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
6be0: 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
6bf0: 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
6c00: 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
6c10: 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
6c20: 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
6c30: 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
6c40: 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
6c50: 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
6c60: 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
6c70: 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
6c80: 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
6c90: 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
6ca0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
6cb0: 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
6cc0: 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
6cd0: 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
6ce0: 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
6cf0: 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
6d00: 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
6d10: 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
6d20: 71 75 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61  quence.* This ma
6d30: 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
6d40: 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
6d50: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
6d60: 66 2c 20 30 2c 20 32 35 36 29 3b 0a 20 20 47 65  f, 0, 256);.  Ge
6d70: 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53  tSystemTime((LPS
6d80: 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b  YSTEMTIME)zBuf);
6d90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6da0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c  _OK;.}../*.** Sl
6db0: 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
6dc0: 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
6dd0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
6de0: 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
6df0: 20 73 71 6c 69 74 65 33 57 69 6e 53 6c 65 65 70   sqlite3WinSleep
6e00: 28 69 6e 74 20 6d 73 29 7b 0a 20 20 53 6c 65 65  (int ms){.  Slee
6e10: 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  p(ms);.  return 
6e20: 6d 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  ms;.}../*.** Sta
6e30: 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73  tic variables us
6e40: 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73 79  ed for thread sy
6e50: 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f  nchronization.*/
6e60: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d 75  .static int inMu
6e70: 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  tex = 0;.#ifdef 
6e80: 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41  SQLITE_W32_THREA
6e90: 44 53 0a 20 20 73 74 61 74 69 63 20 43 52 49 54  DS.  static CRIT
6ea0: 49 43 41 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b  ICAL_SECTION cs;
6eb0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
6ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69  he following pai
6ed0: 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70  r of routine imp
6ee0: 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78  lement mutual ex
6ef0: 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d  clusion for.** m
6f00: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70 72  ulti-threaded pr
6f10: 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61  ocesses.  Only a
6f20: 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69   single thread i
6f30: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20  s allowed to.** 
6f40: 65 78 65 63 75 74 65 64 20 63 6f 64 65 20 74 68  executed code th
6f50: 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64  at is surrounded
6f60: 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29   by EnterMutex()
6f70: 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28   and LeaveMutex(
6f80: 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  )..**.** SQLite 
6f90: 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  uses only a sing
6fa0: 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65  le Mutex.  There
6fb0: 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69   is not much cri
6fc0: 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e  tical.** code an
6fd0: 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68  d what little th
6fe0: 65 72 65 20 69 73 20 65 78 65 63 75 74 65 73 20  ere is executes 
6ff0: 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68  quickly and with
7000: 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  out blocking..*/
7010: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
7020: 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69  EnterMutex(){.#i
7030: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f  fdef SQLITE_W32_
7040: 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
7050: 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b   int isInit = 0;
7060: 0a 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69  .  while( !isIni
7070: 74 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  t ){.    static 
7080: 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20  long lock = 0;. 
7090: 20 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b     if( Interlock
70a0: 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63  edIncrement(&loc
70b0: 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 49  k)==1 ){.      I
70c0: 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61  nitializeCritica
70d0: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20  lSection(&cs);. 
70e0: 20 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b       isInit = 1;
70f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7100: 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20    Sleep(1);.    
7110: 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72 69  }.  }.  EnterCri
7120: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73  ticalSection(&cs
7130: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
7140: 72 74 28 20 21 69 6e 4d 75 74 65 78 20 29 3b 0a  rt( !inMutex );.
7150: 20 20 69 6e 4d 75 74 65 78 20 3d 20 31 3b 0a 7d    inMutex = 1;.}
7160: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
7170: 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20  LeaveMutex(){.  
7180: 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 20  assert( inMutex 
7190: 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 30  );.  inMutex = 0
71a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
71b0: 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 4c 65  W32_THREADS.  Le
71c0: 61 76 65 43 72 69 74 69 63 61 6c 53 65 63 74 69  aveCriticalSecti
71d0: 6f 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66 0a  on(&cs);.#endif.
71e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
71f0: 54 52 55 45 20 69 66 20 77 65 20 61 72 65 20 63  TRUE if we are c
7200: 75 72 72 65 6e 74 6c 79 20 77 69 74 68 69 6e 20  urrently within 
7210: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 46 41  the mutex and FA
7220: 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  LSE if not..*/.i
7230: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 49 6e 4d  nt sqlite3WinInM
7240: 75 74 65 78 28 29 7b 0a 20 20 72 65 74 75 72 6e  utex(){.  return
7250: 20 69 6e 4d 75 74 65 78 3b 0a 7d 0a 0a 0a 2f 2a   inMutex;.}.../*
7260: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
7270: 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
7280: 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
7290: 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
72a0: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
72b0: 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
72c0: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
72d0: 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
72e0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
72f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7300: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
7310: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
7320: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
7330: 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
7340: 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
7350: 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
7360: 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
7370: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
7380: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
7390: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
73a0: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
73b0: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
73c0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
73d0: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
73e0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
73f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69  */.int sqlite3Wi
7400: 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75  nCurrentTime(dou
7410: 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46  ble *prNow){.  F
7420: 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a  ILETIME ft;.  /*
7430: 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
7440: 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
7450: 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
7460: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
7470: 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
7480: 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
7490: 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
74a0: 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
74b0: 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
74c0: 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66 20  double now;.#if 
74d0: 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
74e0: 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 47 65  MTIME time;.  Ge
74f0: 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
7500: 65 29 3b 0a 20 20 53 79 73 74 65 6d 54 69 6d 65  e);.  SystemTime
7510: 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
7520: 2c 26 66 74 29 3b 0a 23 65 6c 73 65 0a 20 20 47  ,&ft);.#else.  G
7530: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
7540: 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23  leTime( &ft );.#
7550: 65 6e 64 69 66 0a 20 20 6e 6f 77 20 3d 20 28 28  endif.  now = ((
7560: 64 6f 75 62 6c 65 29 66 74 2e 64 77 48 69 67 68  double)ft.dwHigh
7570: 44 61 74 65 54 69 6d 65 29 20 2a 20 34 32 39 34  DateTime) * 4294
7580: 39 36 37 32 39 36 2e 30 3b 20 0a 20 20 2a 70 72  967296.0; .  *pr
7590: 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20 66 74 2e  Now = (now + ft.
75a0: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 38  dwLowDateTime)/8
75b0: 36 34 30 30 30 30 30 30 30 30 30 2e 30 20 2b 20  64000000000.0 + 
75c0: 32 33 30 35 38 31 33 2e 35 3b 0a 23 69 66 64 65  2305813.5;.#ifde
75d0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
75e0: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
75f0: 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
7600: 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33  *prNow = sqlite3
7610: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36  _current_time/86
7620: 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
7630: 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  5;.  }.#endif.  
7640: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7650: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
7660: 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61 64  number of thread
7670: 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 62  -specific-data b
7680: 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 2e  locks allocated.
7690: 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 74 6f 20  .** Use this to 
76a0: 76 65 72 69 66 79 20 74 68 61 74 20 77 65 20 61  verify that we a
76b0: 72 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67 20 74  re not leaking t
76c0: 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64  hread-specific-d
76d0: 61 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ata..** Ticket #
76e0: 31 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66 20 53  1601.*/.#ifdef S
76f0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
7700: 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74  qlite3_tsd_count
7710: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 54   = 0;.# define T
7720: 53 44 5f 43 4f 55 4e 54 45 52 5f 49 4e 43 52 20  SD_COUNTER_INCR 
7730: 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e 63 72 65  InterlockedIncre
7740: 6d 65 6e 74 28 26 73 71 6c 69 74 65 33 5f 74 73  ment(&sqlite3_ts
7750: 64 5f 63 6f 75 6e 74 29 0a 23 20 64 65 66 69 6e  d_count).# defin
7760: 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 44 45  e TSD_COUNTER_DE
7770: 43 52 20 49 6e 74 65 72 6c 6f 63 6b 65 64 44 65  CR InterlockedDe
7780: 63 72 65 6d 65 6e 74 28 26 73 71 6c 69 74 65 33  crement(&sqlite3
7790: 5f 74 73 64 5f 63 6f 75 6e 74 29 0a 23 65 6c 73  _tsd_count).#els
77a0: 65 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f 43  e.# define TSD_C
77b0: 4f 55 4e 54 45 52 5f 49 4e 43 52 20 20 2f 2a 20  OUNTER_INCR  /* 
77c0: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
77d0: 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 44 45  e TSD_COUNTER_DE
77e0: 43 52 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  CR  /* no-op */.
77f0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
7800: 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  If called with a
7810: 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 31 2c 20 74  llocateFlag>1, t
7820: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
7830: 6e 74 65 72 20 74 6f 20 74 68 72 65 61 64 0a 2a  nter to thread.*
7840: 2a 20 73 70 65 63 69 66 69 63 20 64 61 74 61 20  * specific data 
7850: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
7860: 74 68 72 65 61 64 2e 20 20 41 6c 6c 6f 63 61 74  thread.  Allocat
7870: 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 0a 2a  e and zero the.*
7880: 2a 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  * thread-specifi
7890: 63 20 64 61 74 61 20 69 66 20 69 74 20 64 6f 65  c data if it doe
78a0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
78b0: 69 73 74 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  ist necessary..*
78c0: 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77  *.** If called w
78d0: 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67  ith allocateFlag
78e0: 3d 3d 30 2c 20 74 68 65 6e 20 63 68 65 63 6b 20  ==0, then check 
78f0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
7900: 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64  ad.** specific d
7910: 61 74 61 2e 20 20 52 65 74 75 72 6e 20 69 74 20  ata.  Return it 
7920: 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
7930: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
7940: 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ist,.** then ret
7950: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
7960: 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  If called with a
7970: 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20 63  llocateFlag<0, c
7980: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
7990: 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66  he thread specif
79a0: 69 63 0a 2a 2a 20 64 61 74 61 20 69 73 20 61 6c  ic.** data is al
79b0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 73 20 61  located and is a
79c0: 6c 6c 20 7a 65 72 6f 2e 20 20 49 66 20 69 74 20  ll zero.  If it 
79d0: 69 73 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63 61  is then dealloca
79e0: 74 65 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  te it..** Return
79f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7a00: 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69  e thread specifi
7a10: 63 20 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20 69  c data or NULL i
7a20: 66 20 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c  f it is.** unall
7a30: 6f 63 61 74 65 64 20 6f 72 20 67 65 74 73 20 64  ocated or gets d
7a40: 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54  eallocated..*/.T
7a50: 68 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69 74  hreadData *sqlit
7a60: 65 33 57 69 6e 54 68 72 65 61 64 53 70 65 63 69  e3WinThreadSpeci
7a70: 66 69 63 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f  ficData(int allo
7a80: 63 61 74 65 46 6c 61 67 29 7b 0a 20 20 73 74 61  cateFlag){.  sta
7a90: 74 69 63 20 69 6e 74 20 6b 65 79 3b 0a 20 20 73  tic int key;.  s
7aa0: 74 61 74 69 63 20 69 6e 74 20 6b 65 79 49 6e 69  tatic int keyIni
7ab0: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
7ac0: 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61  const ThreadData
7ad0: 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 54 68 72   zeroData;.  Thr
7ae0: 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a  eadData *pTsd;..
7af0: 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29    if( !keyInit )
7b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45  {.    sqlite3OsE
7b10: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
7b20: 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b   if( !keyInit ){
7b30: 0a 20 20 20 20 20 20 6b 65 79 20 3d 20 54 6c 73  .      key = Tls
7b40: 41 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 69  Alloc();.      i
7b50: 66 28 20 6b 65 79 3d 3d 30 78 66 66 66 66 66 66  f( key==0xffffff
7b60: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
7b70: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
7b80: 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  x();.        ret
7b90: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
7ba0: 20 20 20 20 20 6b 65 79 49 6e 69 74 20 3d 20 31       keyInit = 1
7bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7bc0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
7bd0: 29 3b 0a 20 20 7d 0a 20 20 70 54 73 64 20 3d 20  );.  }.  pTsd = 
7be0: 54 6c 73 47 65 74 56 61 6c 75 65 28 6b 65 79 29  TlsGetValue(key)
7bf0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65  ;.  if( allocate
7c00: 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66  Flag>0 ){.    if
7c10: 28 20 21 70 54 73 64 20 29 7b 0a 20 20 20 20 20  ( !pTsd ){.     
7c20: 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f   pTsd = sqlite3O
7c30: 73 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  sMalloc( sizeof(
7c40: 7a 65 72 6f 44 61 74 61 29 20 29 3b 0a 20 20 20  zeroData) );.   
7c50: 20 20 20 69 66 28 20 70 54 73 64 20 29 7b 0a 20     if( pTsd ){. 
7c60: 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d 20 7a         *pTsd = z
7c70: 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20 20 20  eroData;.       
7c80: 20 54 6c 73 53 65 74 56 61 6c 75 65 28 6b 65 79   TlsSetValue(key
7c90: 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20 20 20  , pTsd);.       
7ca0: 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 49 4e 43   TSD_COUNTER_INC
7cb0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
7cc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 73  .  }else if( pTs
7cd0: 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74 65  d!=0 && allocate
7ce0: 46 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20 20  Flag<0 .        
7cf0: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
7d00: 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c  pTsd, &zeroData,
7d10: 20 54 48 52 45 41 44 44 41 54 41 53 49 5a 45 29   THREADDATASIZE)
7d20: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7d30: 65 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a  e3OsFree(pTsd);.
7d40: 20 20 20 20 54 6c 73 53 65 74 56 61 6c 75 65 28      TlsSetValue(
7d50: 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 54 53 44  key, 0);.    TSD
7d60: 5f 43 4f 55 4e 54 45 52 5f 44 45 43 52 3b 0a 20  _COUNTER_DECR;. 
7d70: 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d     pTsd = 0;.  }
7d80: 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a  .  return pTsd;.
7d90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  }.#endif /* OS_W
7da0: 49 4e 20 2a 2f 0a                                IN */.