/ Hex Artifact Content
Login

Artifact 6c9da4c76186999f3a709f00e5be3162bd0482eb:


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: 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69  WinCE lacks nati
0400: 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66  ve support for f
0410: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77  ile locking so w
0420: 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69  e have to fake i
0430: 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63  t.** with some c
0440: 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a  ode of our own..
0450: 2a 2f 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  */.#if OS_WINCE.
0460: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0470: 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74  inceLock {.  int
0480: 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20 20   nReaders;      
0490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
04a0: 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69  ader locks obtai
04b0: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50  ned */.  BOOL bP
04c0: 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20  ending;      /* 
04d0: 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e 64  Indicates a pend
04e0: 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ing lock has bee
04f0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0500: 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b 20  BOOL bReserved; 
0510: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0520: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
0530: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0540: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78  ed */.  BOOL bEx
0550: 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20 49  clusive;    /* I
0560: 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63 6c  ndicates an excl
0570: 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20 62  usive lock has b
0580: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
0590: 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e  } winceLock;.#en
05a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  dif../*.** The w
05b0: 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  inFile structure
05c0: 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f   is a subclass o
05d0: 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69 66 69  f OsFile specifi
05e0: 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a  c to the win32.*
05f0: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61  * portability la
0600: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0610: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77  struct winFile w
0620: 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77  inFile;.struct w
0630: 69 6e 46 69 6c 65 20 7b 0a 20 20 49 6f 4d 65 74  inFile {.  IoMet
0640: 68 6f 64 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  hod const *pMeth
0650: 6f 64 3b 2f 2a 20 4d 75 73 74 20 62 65 20 66 69  od;/* Must be fi
0660: 72 73 74 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  rst */.  HANDLE 
0670: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0680: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0690: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
06a0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
06b0: 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f  char locktype; /
06c0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
06d0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
06e0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06f0: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
0700: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
0710: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
0720: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
0730: 20 6c 6f 63 6b 20 2a 2f 0a 23 69 66 20 4f 53 5f   lock */.#if OS_
0740: 57 49 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a  WINCE.  WCHAR *z
0750: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0760: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0770: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0780: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0790: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
07a0: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
07b0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
07c0: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
07d0: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
07e0: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
07f0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
0800: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
0810: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
0820: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
0830: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
0840: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
0850: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0860: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0870: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0880: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0890: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
08a0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
08b0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a  /.#endif.};.../*
08c0: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75  .** Do not inclu
08d0: 64 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69  de any of the Fi
08e0: 6c 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65  le I/O interface
08f0: 20 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74   procedures if t
0900: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  he.** SQLITE_OMI
0910: 54 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69  T_DISKIO macro i
0920: 73 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63  s defined (indic
0930: 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 72 65  ating that there
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c   database.** wil
0950: 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  l be in-memory o
0960: 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  nly).*/.#ifndef 
0970: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
0980: 49 4f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  IO../*.** The fo
0990: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
09a0: 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73   is (normally) s
09b0: 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65  et once and neve
09c0: 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65  r changes.** the
09d0: 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63  reafter.  It rec
09e0: 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65  ords whether the
09f0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0a00: 6d 20 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72  m is Win95.** or
0a10: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a   WinNT..**.** 0:
0a20: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
0a30: 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20  tem unknown..** 
0a40: 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  1:   Operating s
0a50: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a  ystem is Win95..
0a60: 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 2:   Operatin
0a70: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e  g system is WinN
0a80: 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  T..**.** In orde
0a90: 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  r to facilitate 
0aa0: 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e  testing on a Win
0ab0: 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74  NT system, the t
0ac0: 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63  est fixture.** c
0ad0: 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20  an manually set 
0ae0: 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20  this value to 1 
0af0: 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38  to emulate Win98
0b00: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
0b10: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
0b20: 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  e = 0;../*.** Re
0b30: 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a  turn true (non-z
0b40: 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72  ero) if we are r
0b50: 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e  unning under Win
0b60: 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50  NT, Win2K, WinXP
0b70: 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20  ,.** or WinCE.  
0b80: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65  Return false (ze
0b90: 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57  ro) for Win95, W
0ba0: 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a  in98, or WinME..
0bb0: 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e  **.** Here is an
0bc0: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73   interesting obs
0bd0: 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35  ervation:  Win95
0be0: 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e  , Win98, and Win
0bf0: 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c  ME lack.** the L
0c00: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
0c10: 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69    But we can sti
0c20: 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  ll statically li
0c30: 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a  nk against that.
0c40: 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61  ** API as long a
0c50: 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20  s we don't call 
0c60: 69 74 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57  it win running W
0c70: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
0c80: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
0c90: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
0ca0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
0cb0: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
0cc0: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
0cd0: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
0ce0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
0cf0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
0d00: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
0d10: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
0d20: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  x() API..*/.#if 
0d30: 4f 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e  OS_WINCE.# defin
0d40: 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65  e isNT()  (1).#e
0d50: 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74  lse.  static int
0d60: 20 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20   isNT(void){.   
0d70: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f   if( sqlite3_os_
0d80: 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
0d90: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73   OSVERSIONINFO s
0da0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66  Info;.      sInf
0db0: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
0dc0: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
0dd0: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74  Info);.      Get
0de0: 56 65 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f  VersionEx(&sInfo
0df0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
0e00: 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f  _os_type = sInfo
0e10: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56  .dwPlatformId==V
0e20: 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33  ER_PLATFORM_WIN3
0e30: 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20  2_NT ? 2 : 1;.  
0e40: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
0e50: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d  qlite3_os_type==
0e60: 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  2;.  }.#endif /*
0e70: 20 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a   OS_WINCE */../*
0e80: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
0e90: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 55 54  F-8 string to UT
0ea0: 46 2d 33 32 2e 20 20 53 70 61 63 65 20 74 6f 20  F-32.  Space to 
0eb0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
0ec0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
0ed0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
0ee0: 69 74 65 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  iteMalloc..*/.st
0ef0: 61 74 69 63 20 57 43 48 41 52 20 2a 75 74 66 38  atic WCHAR *utf8
0f00: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
0f10: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
0f20: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
0f30: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
0f40: 65 6e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 21 69  ename;..  if( !i
0f50: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 74  sNT() ){.    ret
0f60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
0f70: 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
0f80: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
0f90: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
0fa0: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
0fb0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
0fc0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 43  sqliteMalloc( nC
0fd0: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
0fe0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
0ff0: 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
1000: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1010: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
1020: 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  har = MultiByteT
1030: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
1040: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
1050: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
1060: 6d 65 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69 66  me, nChar);.  if
1070: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
1080: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69    sqliteFree(zWi
1090: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
10a0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
10b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
10c0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
10d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
10e0: 20 55 54 46 2d 33 32 20 74 6f 20 55 54 46 2d 38   UTF-32 to UTF-8
10f0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1100: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
1110: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
1120: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1130: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
1140: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
1150: 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48  ToUtf8(const WCH
1160: 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d  AR *zWideFilenam
1170: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1180: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1190: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  me;..  nByte = W
11a0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
11b0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
11c0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
11d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
11e0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
11f0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
1200: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
1210: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1220: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
1230: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1240: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
1250: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
1260: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
1270: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
12a0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
12b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
12c0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
12d0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
12e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
12f0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 23 69 66  Filename;.}..#if
1300: 20 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a   OS_WINCE./*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63  ****.** This sec
1360: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f  tion contains co
1370: 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c  de for WinCE onl
1380: 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64  y..*/./*.** Wind
1390: 6f 77 73 43 45 20 64 6f 65 73 20 6e 6f 74 20 68  owsCE does not h
13a0: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
13b0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  ) function.  So 
13c0: 63 72 65 61 74 65 20 61 0a 2a 2a 20 73 75 62 73  create a.** subs
13d0: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
13e0: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
13f0: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
1400: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
1410: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
1420: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
1430: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
1440: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
1450: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 69 36 34 20  TIME pTm;.  i64 
1460: 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b  t64;.  t64 = *t;
1470: 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20  .  t64 = (t64 + 
1480: 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30  11644473600)*100
1490: 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c  00000;.  uTm.dwL
14a0: 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 74 36 34  owDateTime = t64
14b0: 20 26 20 30 78 46 46 46 46 46 46 46 46 3b 0a 20   & 0xFFFFFFFF;. 
14c0: 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54   uTm.dwHighDateT
14d0: 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33 32 3b 0a  ime= t64 >> 32;.
14e0: 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61    FileTimeToLoca
14f0: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
1500: 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65  lTm);.  FileTime
1510: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
1520: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
1530: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
1540: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
1550: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
1560: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
1570: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
1580: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
1590: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
15a0: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
15b0: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
15c0: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
15d0: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
15e0: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
15f0: 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  n &y;.}../* This
1600: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63   will never be c
1610: 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66 69 6e  alled, but defin
1620: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63  ed to make the c
1630: 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 23  ode compile */.#
1640: 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70 50 61  define GetTempPa
1650: 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66 69 6e  thA(a,b)..#defin
1660: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63  e LockFile(a,b,c
1670: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63  ,d,e)       winc
1680: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c  eLockFile(&a, b,
1690: 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66 69 6e   c, d, e).#defin
16a0: 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c 62  e UnlockFile(a,b
16b0: 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 6e 63  ,c,d,e)     winc
16c0: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  eUnlockFile(&a, 
16d0: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66  b, c, d, e).#def
16e0: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 61  ine LockFileEx(a
16f0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20 77 69  ,b,c,d,e,f)   wi
1700: 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 26 61  nceLockFileEx(&a
1710: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66 29  , b, c, d, e, f)
1720: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
1730: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
1740: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
1750: 2a 29 61 29 5b 2d 6f 66 66 73 65 74 6f 66 28 77  *)a)[-offsetof(w
1760: 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a  inFile,h)]../*.*
1770: 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b  * Acquire a lock
1780: 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68   on the handle h
1790: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17a0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
17b0: 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20  e(HANDLE h){.   
17c0: 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20  DWORD dwErr;.   
17d0: 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20  do {.     dwErr 
17e0: 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  = WaitForSingleO
17f0: 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54  bject(h, INFINIT
1800: 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28  E);.   } while (
1810: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42  dwErr != WAIT_OB
1820: 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20  JECT_0 && dwErr 
1830: 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45  != WAIT_ABANDONE
1840: 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  D);.}./*.** Rele
1850: 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69  ase a lock acqui
1860: 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65  red by winceMute
1870: 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64  xAcquire().*/.#d
1880: 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78  efine winceMutex
1890: 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61  Release(h) Relea
18a0: 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a  seMutex(h)../*.*
18b0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74  * Create the mut
18c0: 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65  ex and shared me
18d0: 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  mory used for lo
18e0: 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c  cking in the fil
18f0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
1900: 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  pFile.*/.static 
1910: 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74 65  BOOL winceCreate
1920: 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  Lock(const char 
1930: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46  *zFilename, winF
1940: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57  ile *pFile){.  W
1950: 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43  CHAR *zTok;.  WC
1960: 48 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 74 66  HAR *zName = utf
1970: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
1980: 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 49  name);.  BOOL bI
1990: 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 2f  nit = TRUE;..  /
19a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19b0: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
19c0: 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28  */.  ZeroMemory(
19d0: 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73  &pFile->local, s
19e0: 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63  izeof(pFile->loc
19f0: 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c  al));..  /* Repl
1a00: 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73  ace the backslas
1a10: 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  hes from the fil
1a20: 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63  ename and lowerc
1a30: 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64  ase it.  ** to d
1a40: 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61  erive a mutex na
1a50: 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20  me. */.  zTok = 
1a60: 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
1a70: 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
1a80: 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
1a90: 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
1aa0: 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
1ab0: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
1ac0: 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
1ad0: 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
1ae0: 68 4d 75 74 65 78 20 3d 20 43 72 65 61 74 65 4d  hMutex = CreateM
1af0: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
1b00: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
1b10: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1b30: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
1b40: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
1b50: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
1b60: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
1b70: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
1b80: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
1b90: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
1ba0: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
1bb0: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
1bc0: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
1bd0: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
1be0: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
1bf0: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
1c00: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
1c10: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
1c20: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
1c30: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
1c40: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
1c50: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
1c60: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
1c70: 20 20 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61    CharUpperW(zNa
1c80: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
1c90: 68 61 72 65 64 20 3d 20 43 72 65 61 74 65 46 69  hared = CreateFi
1ca0: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
1cb0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
1cc0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1cf0: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
1d00: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
1d10: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
1d40: 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61  );  ..  /* Set a
1d50: 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1d60: 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
1d70: 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
1d80: 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20  he memory so it 
1d90: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
1da0: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
1db0: 2f 0a 20 20 69 66 20 28 47 65 74 4c 61 73 74 45  /.  if (GetLastE
1dc0: 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f  rror() == ERROR_
1dd0: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
1de0: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
1df0: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
1e00: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  eFree(zName);.. 
1e10: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
1e20: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
1e30: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1e40: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
1e50: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
1e60: 68 53 68 61 72 65 64 29 7b 0a 20 20 20 20 70 46  hShared){.    pF
1e70: 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77  ile->shared = (w
1e80: 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61 70 56 69 65  inceLock*)MapVie
1e90: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
1ea0: 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20  Shared, .       
1eb0: 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52        FILE_MAP_R
1ec0: 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49  EAD|FILE_MAP_WRI
1ed0: 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66  TE, 0, 0, sizeof
1ee0: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
1ef0: 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20    /* If mapping 
1f00: 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68  failed, close th
1f10: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1f20: 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65  handle and erase
1f30: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 21   it */.    if (!
1f40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a  pFile->shared){.
1f50: 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
1f60: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
1f70: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
1f80: 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a  hShared = NULL;.
1f90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1fa0: 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  If shared memory
1fb0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72   could not be cr
1fc0: 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73  eated, then clos
1fd0: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
1fe0: 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20 28 70 46  fail */.  if (pF
1ff0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 3d 20  ile->hShared == 
2000: 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69 6e 63 65  NULL){.    wince
2010: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
2020: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
2030: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
2040: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
2050: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
2060: 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
2070: 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a  n FALSE;.  }.  .
2080: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2090: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
20a0: 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f  y if we're suppo
20b0: 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 20 28  sed to */.  if (
20c0: 62 49 6e 69 74 29 20 7b 0a 20 20 20 20 5a 65 72  bInit) {.    Zer
20d0: 6f 4d 65 6d 6f 72 79 28 70 46 69 6c 65 2d 3e 73  oMemory(pFile->s
20e0: 68 61 72 65 64 2c 20 73 69 7a 65 6f 66 28 77 69  hared, sizeof(wi
20f0: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a  nceLock));.  }..
2100: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
2110: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
2120: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 52 55  x);.  return TRU
2130: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  E;.}../*.** Dest
2140: 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20  roy the part of 
2150: 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61  winFile that dea
2160: 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f  ls with wince lo
2170: 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cks.*/.static vo
2180: 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  id winceDestroyL
2190: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
21a0: 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65  le){.  if (pFile
21b0: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f  ->hMutex){.    /
21c0: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
21d0: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
21e0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
21f0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
2200: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2210: 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64  ng blocks should
2220: 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74   probably assert
2230: 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   in debug mode, 
2240: 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20  but they.       
2250: 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69  are to cleanup i
2260: 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  n case any locks
2270: 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a   remained open *
2280: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
2290: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
22a0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
22b0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
22c0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
22d0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
22e0: 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20  Reserved){.     
22f0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
2300: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
2310: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
2320: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50  (pFile->local.bP
2330: 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70  ending){.      p
2340: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
2350: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
2360: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
2370: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
2380: 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46  usive){.      pF
2390: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
23a0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
23b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
23c0: 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20  e-reference and 
23d0: 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f  close our copy o
23e0: 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  f the shared mem
23f0: 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ory handle */.  
2400: 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c    UnmapViewOfFil
2410: 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
2420: 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  ;.    CloseHandl
2430: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
2440: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
2450: 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
2460: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
2470: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
2480: 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20  Mutex);    .    
2490: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
24a0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
24b0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
24c0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  NULL;.  }.}../* 
24d0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
24e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
24f0: 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 77  kFile() API of w
2500: 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65  indows for wince
2510: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
2520: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
2530: 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c   HANDLE *phFile,
2540: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
2550: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
2560: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
2570: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
2580: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
2590: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
25a0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
25b0: 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
25c0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
25d0: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
25e0: 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
25f0: 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
2600: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
2610: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
2620: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
2630: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
2640: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
2650: 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
2660: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
2670: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
2680: 20 3d 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54   == SHARED_FIRST
2690: 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62  .       && nNumb
26a0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
26b0: 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53 49 5a  ow == SHARED_SIZ
26c0: 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
26d0: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
26e0: 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
26f0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
2700: 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
2710: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
2720: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
2730: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
2740: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
2750: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
2760: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
2770: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
2780: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
2790: 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
27a0: 65 6c 73 65 20 69 66 20 28 28 64 77 46 69 6c 65  else if ((dwFile
27b0: 4f 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41  OffsetLow >= SHA
27c0: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
27d0: 20 20 20 20 20 20 20 20 20 64 77 46 69 6c 65 4f           dwFileO
27e0: 66 66 73 65 74 4c 6f 77 20 3c 20 53 48 41 52 45  ffsetLow < SHARE
27f0: 44 5f 46 49 52 53 54 20 2b 20 53 48 41 52 45 44  D_FIRST + SHARED
2800: 5f 53 49 5a 45 29 20 26 26 0a 20 20 20 20 20 20  _SIZE) &&.      
2810: 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42        nNumberOfB
2820: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
2830: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
2840: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
2850: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
2860: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
2870: 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  .nReaders ++;.  
2880: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
2890: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
28a0: 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69   1){.        pFi
28b0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
28c0: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d  ders ++;.      }
28d0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
28e0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
28f0: 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65  ..  /* Want a pe
2900: 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  nding lock? */. 
2910: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
2920: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 50 45 4e  OffsetLow == PEN
2930: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
2940: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
2950: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
2960: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
2970: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
2980: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
2990: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
29a0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
29b0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
29c0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
29d0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
29e0: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
29f0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
2a00: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
2a10: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
2a20: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
2a30: 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
2a40: 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
2a50: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
2a60: 73 65 74 4c 6f 77 20 3d 3d 20 52 45 53 45 52 56  setLow == RESERV
2a70: 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  ED_BYTE && nNumb
2a80: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
2a90: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
2aa0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
2ab0: 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29  >bReserved == 0)
2ac0: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
2ad0: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
2ae0: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
2af0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
2b00: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
2b10: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
2b20: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
2b30: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
2b40: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
2b50: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
2b60: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
2b70: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2b80: 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69   of the UnlockFi
2b90: 6c 65 20 41 50 49 20 6f 66 20 77 69 6e 64 6f 77  le API of window
2ba0: 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73  s for wince.*/.s
2bb0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
2bc0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  UnlockFile(.  HA
2bd0: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
2be0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
2bf0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
2c00: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
2c10: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
2c20: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
2c30: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
2c40: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
2c50: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
2c60: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
2c70: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
2c80: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
2c90: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
2ca0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
2cb0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
2cc0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
2cd0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
2ce0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
2cf0: 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
2d00: 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
2d10: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
2d20: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
2d30: 4c 6f 77 20 3e 3d 20 53 48 41 52 45 44 5f 46 49  Low >= SHARED_FI
2d40: 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 64 77  RST &&.       dw
2d50: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c 20  FileOffsetLow < 
2d60: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 53  SHARED_FIRST + S
2d70: 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20  HARED_SIZE){.   
2d80: 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
2d90: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2da0: 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
2db0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
2dc0: 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46  usive){.      pF
2dd0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
2de0: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
2df0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
2e00: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
2e10: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
2e20: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
2e30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20    }..    /* Did 
2e40: 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72  we just have a r
2e50: 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  eader lock? */. 
2e60: 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c     else if (pFil
2e70: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
2e80: 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
2e90: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
2ea0: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  --;.      if (pF
2eb0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
2ec0: 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  ers == 0).      
2ed0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
2ee0: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
2ef0: 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s --;.      }.  
2f00: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
2f10: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
2f20: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
2f30: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
2f40: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
2f50: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 50 45  eOffsetLow == PE
2f60: 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e  NDING_BYTE && nN
2f70: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
2f80: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
2f90: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
2fa0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
2fb0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
2fc0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
2fd0: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
2fe0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
2ff0: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
3000: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
3010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
3020: 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
3030: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
3040: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
3050: 66 73 65 74 4c 6f 77 20 3d 3d 20 52 45 53 45 52  fsetLow == RESER
3060: 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  VED_BYTE && nNum
3070: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
3080: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
3090: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
30a0: 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20  l.bReserved) {. 
30b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
30c0: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  l.bReserved = FA
30d0: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
30e0: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
30f0: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
3100: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
3110: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
3120: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
3130: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
3140: 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
3150: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rn;.}../*.** An 
3160: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
3170: 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  f the LockFileEx
3180: 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64 6f 77  () API of window
3190: 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73  s for wince.*/.s
31a0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
31b0: 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20 48 41  LockFileEx(.  HA
31c0: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
31d0: 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c 0a 20  DWORD dwFlags,. 
31e0: 20 44 57 4f 52 44 20 64 77 52 65 73 65 72 76 65   DWORD dwReserve
31f0: 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  d,.  DWORD nNumb
3200: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
3210: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
3220: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
3230: 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52 4c 41  High,.  LPOVERLA
3240: 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70 70 65  PPED lpOverlappe
3250: 64 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  d.){.  /* If the
3260: 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20   caller wants a 
3270: 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63 6b  shared read lock
3280: 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20 63  , forward this c
3290: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e 63  all.  ** to winc
32a0: 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20 69  eLockFile */.  i
32b0: 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64 2d  f (lpOverlapped-
32c0: 3e 4f 66 66 73 65 74 20 3d 3d 20 53 48 41 52 45  >Offset == SHARE
32d0: 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20  D_FIRST &&.     
32e0: 20 64 77 46 6c 61 67 73 20 3d 3d 20 31 20 26 26   dwFlags == 1 &&
32f0: 0a 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66  .      nNumberOf
3300: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
3310: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  = SHARED_SIZE){.
3320: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65      return wince
3330: 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  LockFile(phFile,
3340: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
3350: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 1, 0);.  }.  r
3360: 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f  eturn FALSE;.}./
3370: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  *.** End of the 
3380: 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72  special code for
3390: 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   wince.*********
33a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e0: 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
33f0: 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
3400: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
3410: 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
3420: 4e 6f 74 65 20 74 68 61 74 20 77 69 6e 64 6f 77  Note that window
3430: 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
3440: 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
3450: 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
3460: 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
3470: 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
3480: 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
3490: 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
34a0: 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
34b0: 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
34c0: 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
34d0: 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
34e0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
34f0: 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
3500: 20 69 73 20 69 74 20 64 6f 65 73 2e 20 20 57 68   is it does.  Wh
3510: 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70  ile this other p
3520: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
3530: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70  g the.** file op
3540: 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75  en, we will be u
3550: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  nable to delete 
3560: 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  it.  To work aro
3570: 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62  und this.** prob
3580: 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30  lem, we delay 10
3590: 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
35a0: 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65  nd try to delete
35b0: 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74   again.  Up.** t
35c0: 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  o MX_DELETION_AT
35d0: 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20  TEMPTs deletion 
35e0: 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e  attempts are run
35f0: 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a   before giving.*
3600: 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  * up and returni
3610: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
3620: 23 64 65 66 69 6e 65 20 4d 58 5f 44 45 4c 45 54  #define MX_DELET
3630: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 69  ION_ATTEMPTS 3.i
3640: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 44 65 6c  nt sqlite3WinDel
3650: 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ete(const char *
3660: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 57 43  zFilename){.  WC
3670: 48 41 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66  HAR *zWide = utf
3680: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
3690: 6e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 63 6e 74  name);.  int cnt
36a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
36b0: 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20    if( zWide ){. 
36c0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20     do{.      rc 
36d0: 3d 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 57  = DeleteFileW(zW
36e0: 69 64 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ide);.    }while
36f0: 28 20 72 63 3d 3d 30 20 26 26 20 47 65 74 46 69  ( rc==0 && GetFi
3700: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 57  leAttributesW(zW
3710: 69 64 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ide)!=0xffffffff
3720: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
3730: 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45   cnt++ < MX_DELE
3740: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 26 26  TION_ATTEMPTS &&
3750: 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29   (Sleep(100), 1)
3760: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
3770: 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c  ee(zWide);.  }el
3780: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
3790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
37b0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63      do{.      rc
37c0: 20 3d 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a   = DeleteFileA(z
37d0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
37e0: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
37f0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3800: 73 41 28 7a 46 69 6c 65 6e 61 6d 65 29 0a 20 20  sA(zFilename).  
3810: 20 20 20 20 20 20 20 20 20 20 26 26 20 63 6e 74            && cnt
3820: 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  ++ < MX_DELETION
3830: 5f 41 54 54 45 4d 50 54 53 20 26 26 20 28 53 6c  _ATTEMPTS && (Sl
3840: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
3850: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 54 52 41  #endif.  }.  TRA
3860: 43 45 32 28 22 44 45 4c 45 54 45 20 5c 22 25 73  CE2("DELETE \"%s
3870: 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  \"\n", zFilename
3880: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  );.  return rc!=
3890: 30 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  0 ? SQLITE_OK : 
38a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a  SQLITE_IOERR;.}.
38b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
38c0: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
38d0: 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  file exists..*/.
38e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 46 69  int sqlite3WinFi
38f0: 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63  leExists(const c
3900: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
3910: 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
3920: 30 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64  0;.  WCHAR *zWid
3930: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
3940: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
3950: 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20 20  if( zWide ){.   
3960: 20 65 78 69 73 74 73 20 3d 20 47 65 74 46 69 6c   exists = GetFil
3970: 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 57 69  eAttributesW(zWi
3980: 64 65 29 20 21 3d 20 30 78 66 66 66 66 66 66 66  de) != 0xfffffff
3990: 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  f;.    sqliteFre
39a0: 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73  e(zWide);.  }els
39b0: 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  e{.#if OS_WINCE.
39c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
39d0: 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20  E_NOMEM;.#else. 
39e0: 20 20 20 65 78 69 73 74 73 20 3d 20 47 65 74 46     exists = GetF
39f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
3a00: 46 69 6c 65 6e 61 6d 65 29 20 21 3d 20 30 78 66  Filename) != 0xf
3a10: 66 66 66 66 66 66 66 3b 0a 23 65 6e 64 69 66 0a  fffffff;.#endif.
3a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78 69    }.  return exi
3a30: 73 74 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sts;.}../* Forwa
3a40: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
3a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
3a60: 6f 63 61 74 65 57 69 6e 46 69 6c 65 28 77 69 6e  ocateWinFile(win
3a70: 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46  File *pInit, OsF
3a80: 69 6c 65 20 2a 2a 70 49 64 29 3b 0a 0a 2f 2a 0a  ile **pId);../*.
3a90: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
3aa0: 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20 62 6f  en a file for bo
3ab0: 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
3ac0: 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68 61 74  riting.  If that
3ad0: 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79 20 6f  .** fails, try o
3ae0: 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64 2d 6f  pening it read-o
3af0: 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66 69 6c  nly.  If the fil
3b00: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
3b10: 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72 65 61  ,.** try to crea
3b20: 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  te it..**.** On 
3b30: 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c  success, a handl
3b40: 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 66  e for the open f
3b50: 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  ile is written t
3b60: 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52  o *id.** and *pR
3b70: 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74 20 74  eadonly is set t
3b80: 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c 65 20  o 0 if the file 
3b90: 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  was opened for r
3ba0: 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72  eading and.** wr
3bb0: 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20 74 68  iting or 1 if th
3bc0: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
3bd0: 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68  d read-only.  Th
3be0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
3bf0: 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  ns.** SQLITE_OK.
3c00: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
3c10: 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  e, the function 
3c20: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
3c30: 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76  ANTOPEN and leav
3c40: 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70  es.** *id and *p
3c50: 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67  Readonly unchang
3c60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3c70: 65 33 57 69 6e 4f 70 65 6e 52 65 61 64 57 72 69  e3WinOpenReadWri
3c80: 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te(.  const char
3c90: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f   *zFilename,.  O
3ca0: 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a 20 20 69  sFile **pId,.  i
3cb0: 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt *pReadonly.){
3cc0: 0a 20 20 77 69 6e 46 69 6c 65 20 66 3b 0a 20 20  .  winFile f;.  
3cd0: 48 41 4e 44 4c 45 20 68 3b 0a 20 20 57 43 48 41  HANDLE h;.  WCHA
3ce0: 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54  R *zWide = utf8T
3cf0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
3d00: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  me);.  assert( *
3d10: 70 49 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pId==0 );.  if( 
3d20: 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20 3d  zWide ){.    h =
3d30: 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57 69   CreateFileW(zWi
3d40: 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52  de,.       GENER
3d50: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
3d60: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  C_WRITE,.       
3d70: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
3d80: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
3d90: 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c  TE,.       NULL,
3da0: 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57  .       OPEN_ALW
3db0: 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45  AYS,.       FILE
3dc0: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
3dd0: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
3de0: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
3df0: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
3e00: 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c      if( h==INVAL
3e10: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
3e20: 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65  ){.      h = Cre
3e30: 61 74 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a  ateFileW(zWide,.
3e40: 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49 43           GENERIC
3e50: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
3e60: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
3e70: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
3e80: 54 45 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c  TE,.         NUL
3e90: 4c 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 45 4e  L,.         OPEN
3ea0: 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20  _ALWAYS,.       
3eb0: 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
3ec0: 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46  _NORMAL | FILE_F
3ed0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
3ee0: 53 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  S,.         NULL
3ef0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
3f00: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
3f10: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
3f20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
3f30: 65 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 20 20  e(zWide);.      
3f40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3f50: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
3f60: 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e  }.      *pReadon
3f70: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ly = 1;.    }els
3f80: 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f  e{.      *pReado
3f90: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nly = 0;.    }.#
3fa0: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  if OS_WINCE.    
3fb0: 69 66 20 28 21 77 69 6e 63 65 43 72 65 61 74 65  if (!winceCreate
3fc0: 4c 6f 63 6b 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Lock(zFilename, 
3fd0: 26 66 29 29 7b 0a 20 20 20 20 20 20 43 6c 6f 73  &f)){.      Clos
3fe0: 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
3ff0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69    sqliteFree(zWi
4000: 64 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  de);.      retur
4010: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4020: 4e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  N;.    }.#endif.
4030: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4040: 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Wide);.  }else{.
4050: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
4060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4070: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
4080: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
4090: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
40a0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
40b0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
40c0: 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52         FILE_SHAR
40d0: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
40e0: 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  ARE_WRITE,.     
40f0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f    NULL,.       O
4100: 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
4110: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
4120: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
4130: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
4140: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
4150: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 68      );.    if( h
4160: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
4170: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
4180: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
4190: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
41a0: 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44      GENERIC_READ
41b0: 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f  ,.         FILE_
41c0: 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
41d0: 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20  E_SHARE_WRITE,. 
41e0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
41f0: 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41         OPEN_ALWA
4200: 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c  YS,.         FIL
4210: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
4220: 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  AL | FILE_FLAG_R
4230: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20  ANDOM_ACCESS,.  
4240: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
4250: 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68    );.      if( h
4260: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
4270: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
4280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4290: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
42a0: 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e  }.      *pReadon
42b0: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ly = 1;.    }els
42c0: 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f  e{.      *pReado
42d0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nly = 0;.    }.#
42e0: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 43  endif /* OS_WINC
42f0: 45 20 2a 2f 0a 20 20 7d 0a 20 20 66 2e 68 20 3d  E */.  }.  f.h =
4300: 20 68 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45   h;.#if OS_WINCE
4310: 0a 20 20 66 2e 7a 44 65 6c 65 74 65 4f 6e 43 6c  .  f.zDeleteOnCl
4320: 6f 73 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ose = 0;.#endif.
4330: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 52    TRACE3("OPEN R
4340: 2f 57 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  /W %d \"%s\"\n",
4350: 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a   h, zFilename);.
4360: 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74    return allocat
4370: 65 57 69 6e 46 69 6c 65 28 26 66 2c 20 70 49 64  eWinFile(&f, pId
4380: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  );.}.../*.** Att
4390: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
43a0: 65 77 20 66 69 6c 65 20 66 6f 72 20 65 78 63 6c  ew file for excl
43b0: 75 73 69 76 65 20 61 63 63 65 73 73 20 62 79 20  usive access by 
43c0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
43d0: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
43e0: 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 62 6f 74  e opened for bot
43f0: 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  h reading and wr
4400: 69 74 69 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64  iting.  To avoid
4410: 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69 61 6c 20  .** a potential 
4420: 73 65 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d  security problem
4430: 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  , we do not allo
4440: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  w the file to ha
4450: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
4460: 20 65 78 69 73 74 65 64 2e 20 20 4e 6f 72 20 64   existed.  Nor d
4470: 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68 65 20 66  o we allow the f
4480: 69 6c 65 20 74 6f 20 62 65 20 61 20 73 79 6d 62  ile to be a symb
4490: 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a  olic.** link..**
44a0: 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61 67 20 69  .** If delFlag i
44b0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b  s true, then mak
44c0: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
44d0: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
44e0: 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65 20 66 69  delete.** the fi
44f0: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
4500: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  osed..**.** On s
4510: 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68  uccess, write th
4520: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e  e file handle in
4530: 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72  to *id and retur
4540: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  n SQLITE_OK..**.
4550: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72  ** On failure, r
4560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
4570: 54 4f 50 45 4e 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  TOPEN..**.** Som
4580: 65 74 69 6d 65 73 20 69 66 20 77 65 20 68 61 76  etimes if we hav
4590: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
45a0: 20 70 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 20 66   prior journal f
45b0: 69 6c 65 2c 20 77 69 6e 64 6f 77 73 0a 2a 2a 20  ile, windows.** 
45c0: 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20 6f 70 65  will fail to ope
45d0: 6e 20 61 20 6e 65 77 20 6f 6e 65 20 62 65 63 61  n a new one beca
45e0: 75 73 65 20 74 68 65 72 65 20 69 73 20 61 20 22  use there is a "
45f0: 70 65 6e 64 69 6e 67 20 64 65 6c 65 74 65 22 2e  pending delete".
4600: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4610: 6e 64 20 74 68 69 73 20 62 75 67 2c 20 77 65 20  nd this bug, we 
4620: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
4630: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 61  lliseconds and a
4640: 74 74 65 6d 70 74 0a 2a 2a 20 61 20 73 65 63 6f  ttempt.** a seco
4650: 6e 64 20 6f 70 65 6e 20 61 66 74 65 72 20 74 68  nd open after th
4660: 65 20 66 69 72 73 74 20 6f 6e 65 20 66 61 69 6c  e first one fail
4670: 73 2e 20 20 54 68 65 20 77 68 6f 6c 65 20 6f 70  s.  The whole op
4680: 65 72 61 74 69 6f 6e 20 6f 6e 6c 79 0a 2a 2a 20  eration only.** 
4690: 66 61 69 6c 73 20 69 66 20 62 6f 74 68 20 6f 70  fails if both op
46a0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  en attempts are 
46b0: 75 6e 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  unsuccessful..*/
46c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 4f  .int sqlite3WinO
46d0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e  penExclusive(con
46e0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
46f0: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  me, OsFile **pId
4700: 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
4710: 20 20 77 69 6e 46 69 6c 65 20 66 3b 0a 20 20 48    winFile f;.  H
4720: 41 4e 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66  ANDLE h;.  int f
4730: 69 6c 65 66 6c 61 67 73 3b 0a 20 20 57 43 48 41  ileflags;.  WCHA
4740: 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54  R *zWide = utf8T
4750: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
4760: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  me);.  assert( *
4770: 70 49 64 20 3d 3d 20 30 20 29 3b 0a 20 20 66 69  pId == 0 );.  fi
4780: 6c 65 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46  leflags = FILE_F
4790: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
47a0: 53 3b 0a 23 69 66 20 21 4f 53 5f 57 49 4e 43 45  S;.#if !OS_WINCE
47b0: 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29  .  if( delFlag )
47c0: 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73 20  {.    fileflags 
47d0: 7c 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54  |= FILE_ATTRIBUT
47e0: 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 46 49  E_TEMPORARY | FI
47f0: 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
4800: 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6e  N_CLOSE;.  }.#en
4810: 64 69 66 0a 20 20 69 66 28 20 7a 57 69 64 65 20  dif.  if( zWide 
4820: 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
4830: 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
4840: 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65    h = CreateFile
4850: 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20 20  W(zWide,.       
4860: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
4870: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
4880: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
4890: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
48a0: 20 20 20 20 43 52 45 41 54 45 5f 41 4c 57 41 59      CREATE_ALWAY
48b0: 53 2c 0a 20 20 20 20 20 20 20 20 20 66 69 6c 65  S,.         file
48c0: 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  flags,.         
48d0: 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20  NULL.      );.  
48e0: 20 20 7d 77 68 69 6c 65 28 20 68 3d 3d 49 4e 56    }while( h==INV
48f0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
4900: 45 20 26 26 20 63 6e 74 2b 2b 20 3c 20 32 20 26  E && cnt++ < 2 &
4910: 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31  & (Sleep(100), 1
4920: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) );.    sqliteF
4930: 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65  ree(zWide);.  }e
4940: 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  lse{.#if OS_WINC
4950: 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  E.    return SQL
4960: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65  ITE_NOMEM;.#else
4970: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
4980: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
4990: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
49a0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
49b0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20     GENERIC_READ 
49c0: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  | GENERIC_WRITE,
49d0: 0a 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20  .        0,.    
49e0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
49f0: 20 20 43 52 45 41 54 45 5f 41 4c 57 41 59 53 2c    CREATE_ALWAYS,
4a00: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 66 6c 61  .        filefla
4a10: 67 73 2c 0a 20 20 20 20 20 20 20 20 4e 55 4c 4c  gs,.        NULL
4a20: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 77  .      );.    }w
4a30: 68 69 6c 65 28 20 68 3d 3d 49 4e 56 41 4c 49 44  hile( h==INVALID
4a40: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
4a50: 20 63 6e 74 2b 2b 20 3c 20 32 20 26 26 20 28 53   cnt++ < 2 && (S
4a60: 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
4a70: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49  .#endif /* OS_WI
4a80: 4e 43 45 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  NCE */.  }.  if(
4a90: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
4aa0: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
4ab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
4ac0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e  NTOPEN;.  }.  f.
4ad0: 68 20 3d 20 68 3b 0a 23 69 66 20 4f 53 5f 57 49  h = h;.#if OS_WI
4ae0: 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65 74 65 4f  NCE.  f.zDeleteO
4af0: 6e 43 6c 6f 73 65 20 3d 20 64 65 6c 46 6c 61 67  nClose = delFlag
4b00: 20 3f 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   ? utf8ToUnicode
4b10: 28 7a 46 69 6c 65 6e 61 6d 65 29 20 3a 20 30 3b  (zFilename) : 0;
4b20: 0a 20 20 66 2e 68 4d 75 74 65 78 20 3d 20 4e 55  .  f.hMutex = NU
4b30: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 54 52 41  LL;.#endif.  TRA
4b40: 43 45 33 28 22 4f 50 45 4e 20 45 58 20 25 64 20  CE3("OPEN EX %d 
4b50: 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46  \"%s\"\n", h, zF
4b60: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  ilename);.  retu
4b70: 72 6e 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69  rn allocateWinFi
4b80: 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a  le(&f, pId);.}..
4b90: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
4ba0: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
4bb0: 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61   for read-only a
4bc0: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ccess..**.** On 
4bd0: 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74  success, write t
4be0: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69  he file handle i
4bf0: 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75  nto *id and retu
4c00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
4c10: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
4c20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
4c30: 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  NTOPEN..*/.int s
4c40: 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52 65 61  qlite3WinOpenRea
4c50: 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72  dOnly(const char
4c60: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46   *zFilename, OsF
4c70: 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69  ile **pId){.  wi
4c80: 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c  nFile f;.  HANDL
4c90: 45 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57  E h;.  WCHAR *zW
4ca0: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
4cb0: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
4cc0: 20 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d    assert( *pId==
4cd0: 30 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  0 );.  if( zWide
4ce0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61   ){.    h = Crea
4cf0: 74 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20  teFileW(zWide,. 
4d00: 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45        GENERIC_RE
4d10: 41 44 2c 0a 20 20 20 20 20 20 20 30 2c 0a 20 20  AD,.       0,.  
4d20: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
4d30: 20 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c    OPEN_EXISTING,
4d40: 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54  .       FILE_ATT
4d50: 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20  RIBUTE_NORMAL | 
4d60: 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
4d70: 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20  _ACCESS,.       
4d80: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20  NULL.    );.    
4d90: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65  sqliteFree(zWide
4da0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  );.  }else{.#if 
4db0: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74  OS_WINCE.    ret
4dc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4dd0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
4de0: 43 72 65 61 74 65 46 69 6c 65 41 28 7a 46 69 6c  CreateFileA(zFil
4df0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 47 45  ename,.       GE
4e00: 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20  NERIC_READ,.    
4e10: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c     0,.       NUL
4e20: 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45  L,.       OPEN_E
4e30: 58 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20  XISTING,.       
4e40: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
4e50: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
4e60: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
4e70: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20  .       NULL.   
4e80: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20   );.#endif.  }. 
4e90: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
4ea0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
4eb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4ec0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
4ed0: 20 20 66 2e 68 20 3d 20 68 3b 0a 23 69 66 20 4f    f.h = h;.#if O
4ee0: 53 5f 57 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c  S_WINCE.  f.zDel
4ef0: 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a  eteOnClose = 0;.
4f00: 20 20 66 2e 68 4d 75 74 65 78 20 3d 20 4e 55 4c    f.hMutex = NUL
4f10: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 54 52 41 43  L;.#endif.  TRAC
4f20: 45 33 28 22 4f 50 45 4e 20 52 4f 20 25 64 20 5c  E3("OPEN RO %d \
4f30: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
4f40: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
4f50: 6e 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c  n allocateWinFil
4f60: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f  e(&f, pId);.}../
4f70: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
4f80: 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  open a file desc
4f90: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64  riptor for the d
4fa0: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
4fb0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65  ntains a.** file
4fc0: 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 73  .  This file des
4fd0: 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75  criptor can be u
4fe0: 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74  sed to fsync() t
4ff0: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
5000: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
5010: 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74 69   sure the creati
5020: 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65  on of a new file
5030: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69   is actually wri
5040: 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  tten.** to disk.
5050: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5060: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e  ine is only mean
5070: 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e  ingful for Unix.
5080: 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20    It is a no-op 
5090: 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73  under.** windows
50a0: 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64   since windows d
50b0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
50c0: 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a  hard links..**.*
50d0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
50e0: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
50f0: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
5100: 65 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a 2a  e is at *id is.*
5110: 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  * updated with t
5120: 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79  he new directory
5130: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5140: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
5150: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
5160: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
5170: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
5180: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
5190: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
51a0: 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65  .** *id unchange
51b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
51c0: 20 77 69 6e 4f 70 65 6e 44 69 72 65 63 74 6f 72   winOpenDirector
51d0: 79 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c  y(.  OsFile *id,
51e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
51f0: 44 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74  Dirname.){.  ret
5200: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5210: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
5220: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
5230: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
5240: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
5250: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
5260: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
5270: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
5280: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
5290: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65  d to store.** te
52a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
52b0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
52c0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
52d0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74   0;../*.** Creat
52e0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
52f0: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
5300: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
5310: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
5320: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
5330: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
5340: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
5350: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
5360: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61  TempFileName(cha
5370: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
5380: 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
5390: 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
53a0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
53b0: 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
53c0: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
53d0: 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
53e0: 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20  6789";.  int i, 
53f0: 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50  j;.  char zTempP
5400: 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ath[SQLITE_TEMPN
5410: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69 66 28  AME_SIZE];.  if(
5420: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
5430: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
5440: 74 72 6e 63 70 79 28 7a 54 65 6d 70 50 61 74 68  trncpy(zTempPath
5450: 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
5460: 69 72 65 63 74 6f 72 79 2c 20 53 51 4c 49 54 45  irectory, SQLITE
5470: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33  _TEMPNAME_SIZE-3
5480: 30 29 3b 0a 20 20 20 20 7a 54 65 6d 70 50 61 74  0);.    zTempPat
5490: 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h[SQLITE_TEMPNAM
54a0: 45 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a  E_SIZE-30] = 0;.
54b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54    }else if( isNT
54c0: 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
54d0: 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41  zMulti;.    WCHA
54e0: 52 20 7a 57 69 64 65 50 61 74 68 5b 53 51 4c 49  R zWidePath[SQLI
54f0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
5500: 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61  ];.    GetTempPa
5510: 74 68 57 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e  thW(SQLITE_TEMPN
5520: 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 57 69  AME_SIZE-30, zWi
5530: 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75  dePath);.    zMu
5540: 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  lti = unicodeToU
5550: 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  tf8(zWidePath);.
5560: 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29      if( zMulti )
5570: 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
5580: 7a 54 65 6d 70 50 61 74 68 2c 20 7a 4d 75 6c 74  zTempPath, zMult
5590: 69 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  i, SQLITE_TEMPNA
55a0: 4d 45 5f 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20  ME_SIZE-30);.   
55b0: 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c     zTempPath[SQL
55c0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
55d0: 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  E-30] = 0;.     
55e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 75 6c   sqliteFree(zMul
55f0: 74 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ti);.    }.  }el
5600: 73 65 7b 0a 20 20 20 20 47 65 74 54 65 6d 70 50  se{.    GetTempP
5610: 61 74 68 41 28 53 51 4c 49 54 45 5f 54 45 4d 50  athA(SQLITE_TEMP
5620: 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54  NAME_SIZE-30, zT
5630: 65 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  empPath);.  }.  
5640: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65  for(i=strlen(zTe
5650: 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20  mpPath); i>0 && 
5660: 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d  zTempPath[i-1]==
5670: 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  '\\'; i--){}.  z
5680: 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b  TempPath[i] = 0;
5690: 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
56a0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
56b0: 73 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52  s\\"TEMP_FILE_PR
56c0: 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29  EFIX, zTempPath)
56d0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
56e0: 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
56f0: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35  te3Randomness(15
5700: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
5710: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
5720: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
5730: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
5740: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
5750: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
5760: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
5770: 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
5780: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
5790: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f     if( !sqlite3O
57a0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75 66  sFileExists(zBuf
57b0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
57c0: 20 54 52 41 43 45 32 28 22 54 45 4d 50 20 46 49   TRACE2("TEMP FI
57d0: 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a  LENAME: %s\n", z
57e0: 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Buf);.  return S
57f0: 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
5800: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
5810: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
5820: 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
5830: 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
5840: 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
5850: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
5860: 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
5870: 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
5880: 65 73 75 6c 74 2c 20 62 75 74 20 77 69 6e 64 6f  esult, but windo
5890: 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
58a0: 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
58b0: 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
58c0: 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
58d0: 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
58e0: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
58f0: 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
5900: 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
5910: 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
5920: 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
5930: 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
5940: 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
5950: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
5960: 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
5970: 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
5980: 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
5990: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
59a0: 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
59b0: 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
59c0: 74 20 77 69 6e 43 6c 6f 73 65 28 4f 73 46 69 6c  t winClose(OsFil
59d0: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e 46  e **pId){.  winF
59e0: 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e  ile *pFile;.  in
59f0: 74 20 72 63 20 3d 20 31 3b 0a 20 20 69 66 28 20  t rc = 1;.  if( 
5a00: 70 49 64 20 26 26 20 28 70 46 69 6c 65 20 3d 20  pId && (pFile = 
5a10: 28 77 69 6e 46 69 6c 65 2a 29 2a 70 49 64 29 21  (winFile*)*pId)!
5a20: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
5a30: 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 54  , cnt = 0;.    T
5a40: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
5a50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
5a60: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20     do{.      rc 
5a70: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  = CloseHandle(pF
5a80: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 7d 77 68  ile->h);.    }wh
5a90: 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 63 6e  ile( rc==0 && cn
5aa0: 74 2b 2b 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  t++ < MX_CLOSE_A
5ab0: 54 54 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70  TTEMPT && (Sleep
5ac0: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
5ad0: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 77 69   OS_WINCE.    wi
5ae0: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70  nceDestroyLock(p
5af0: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 70  File);.    if( p
5b00: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
5b10: 6c 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 44 65  lose ){.      De
5b20: 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
5b30: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
5b40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
5b50: 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  ee(pFile->zDelet
5b60: 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 7d  eOnClose);.    }
5b70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 70 65 6e  .#endif.    Open
5b80: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20  Counter(-1);.   
5b90: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c   sqliteFree(pFil
5ba0: 65 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30  e);.    *pId = 0
5bb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5bc0: 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  c ? SQLITE_OK : 
5bd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a  SQLITE_IOERR;.}.
5be0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
5bf0: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
5c00: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
5c10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
5c20: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
5c30: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
5c40: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
5c50: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
5c60: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
5c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5c80: 69 6e 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69  inRead(OsFile *i
5c90: 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  d, void *pBuf, i
5ca0: 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57 4f 52 44  nt amt){.  DWORD
5cb0: 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
5cc0: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
5cd0: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
5ce0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  n SQLITE_IOERR);
5cf0: 0a 20 20 54 52 41 43 45 33 28 22 52 45 41 44 20  .  TRACE3("READ 
5d00: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28  %d lock=%d\n", (
5d10: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (winFile*)id)->h
5d20: 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  , ((winFile*)id)
5d30: 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69  ->locktype);.  i
5d40: 66 28 20 21 52 65 61 64 46 69 6c 65 28 28 28 77  f( !ReadFile(((w
5d50: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  inFile*)id)->h, 
5d60: 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c  pBuf, amt, &got,
5d70: 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d   0) ){.    got =
5d80: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f   0;.  }.  if( go
5d90: 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  t==(DWORD)amt ){
5da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5db0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
5dc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5dd0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a  E_IOERR;.  }.}..
5de0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
5df0: 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
5e00: 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
5e10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
5e20: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
5e30: 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
5e40: 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
5e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5e60: 69 6e 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a  inWrite(OsFile *
5e70: 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  id, const void *
5e80: 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a  pBuf, int amt){.
5e90: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
5ea0: 44 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 61  DWORD wrote;.  a
5eb0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
5ec0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5ed0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
5ee0: 49 4f 45 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61  IOERR);.  Simula
5ef0: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
5f00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
5f10: 4c 4c 29 3b 0a 20 20 54 52 41 43 45 33 28 22 57  LL);.  TRACE3("W
5f20: 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  RITE %d lock=%d\
5f30: 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  n", ((winFile*)i
5f40: 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c 65  d)->h, ((winFile
5f50: 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 29  *)id)->locktype)
5f60: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
5f70: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d  0 );.  while( am
5f80: 74 3e 30 20 26 26 20 28 72 63 20 3d 20 57 72 69  t>0 && (rc = Wri
5f90: 74 65 46 69 6c 65 28 28 28 77 69 6e 46 69 6c 65  teFile(((winFile
5fa0: 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20  *)id)->h, pBuf, 
5fb0: 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29  amt, &wrote, 0))
5fc0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
5fd0: 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61  wrote>0 ){.    a
5fe0: 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
5ff0: 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
6000: 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
6010: 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c 20   }.  if( !rc || 
6020: 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20 29  amt>(int)wrote )
6030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6040: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
6050: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  ;.}../*.** Some 
6070: 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  microsoft compil
6080: 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
6090: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
60a0: 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54  ndef INVALID_SET
60b0: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20  _FILE_POINTER.# 
60c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53  define INVALID_S
60d0: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
60e0: 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
60f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
6100: 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f  he read/write po
6110: 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e  inter in a file.
6120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
6130: 69 6e 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69  inSeek(OsFile *i
6140: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a  d, i64 offset){.
6150: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
6160: 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a 20   = offset>>32;. 
6170: 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20   LONG lowerBits 
6180: 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  = offset & 0xfff
6190: 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44 20 72  fffff;.  DWORD r
61a0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  c;.  assert( id!
61b0: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
61c0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f  ITE_TEST.  if( o
61d0: 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65  ffset ) Simulate
61e0: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
61f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
6200: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 53 45 45 4b  );.#endif.  SEEK
6210: 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b 20 31  (offset/1024 + 1
6220: 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46 69 6c  );.  rc = SetFil
6230: 65 50 6f 69 6e 74 65 72 28 28 28 77 69 6e 46 69  ePointer(((winFi
6240: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6c 6f 77 65  le*)id)->h, lowe
6250: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
6260: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
6270: 20 20 54 52 41 43 45 33 28 22 53 45 45 4b 20 25    TRACE3("SEEK %
6280: 64 20 25 6c 6c 64 5c 6e 22 2c 20 28 28 77 69 6e  d %lld\n", ((win
6290: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6f 66  File*)id)->h, of
62a0: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
62b0: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
62c0: 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74  E_POINTER && Get
62d0: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f  LastError()!=NO_
62e0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ERROR ){.    ret
62f0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
6300: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6320: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
6330: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
6340: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
6350: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
6360: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
6370: 20 77 69 6e 53 79 6e 63 28 4f 73 46 69 6c 65 20   winSync(OsFile 
6380: 2a 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  *id, int dataOnl
6390: 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  y){.  assert( id
63a0: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
63b0: 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64  "SYNC %d lock=%d
63c0: 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29  \n", ((winFile*)
63d0: 69 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c  id)->h, ((winFil
63e0: 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65  e*)id)->locktype
63f0: 29 3b 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69  );.  if( FlushFi
6400: 6c 65 42 75 66 66 65 72 73 28 28 28 77 69 6e 46  leBuffers(((winF
6410: 69 6c 65 2a 29 69 64 29 2d 3e 68 29 20 29 7b 0a  ile*)id)->h) ){.
6420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6430: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
6440: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6450: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _IOERR;.  }.}../
6460: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69  *.** Sync the di
6470: 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65  rectory zDirname
6480: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
6490: 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73  p on operating s
64a0: 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20  ystems other.** 
64b0: 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e  than UNIX..*/.in
64c0: 74 20 73 71 6c 69 74 65 33 57 69 6e 53 79 6e 63  t sqlite3WinSync
64d0: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
64e0: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
64f0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
6500: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
6510: 5f 49 4f 45 52 52 29 3b 0a 20 20 72 65 74 75 72  _IOERR);.  retur
6520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6530: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
6540: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
6550: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
6560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6570: 6e 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65  nTruncate(OsFile
6580: 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
6590: 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69  {.  LONG upperBi
65a0: 74 73 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a  ts = nByte>>32;.
65b0: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
65c0: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 54 52 55  );.  TRACE3("TRU
65d0: 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22  NCATE %d %lld\n"
65e0: 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  , ((winFile*)id)
65f0: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53  ->h, nByte);.  S
6600: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
6610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6620: 52 52 29 3b 0a 20 20 53 65 74 46 69 6c 65 50 6f  RR);.  SetFilePo
6630: 69 6e 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a  inter(((winFile*
6640: 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  )id)->h, nByte, 
6650: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
6660: 5f 42 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e  _BEGIN);.  SetEn
6670: 64 4f 66 46 69 6c 65 28 28 28 77 69 6e 46 69 6c  dOfFile(((winFil
6680: 65 2a 29 69 64 29 2d 3e 68 29 3b 0a 20 20 72 65  e*)id)->h);.  re
6690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
66a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
66b0: 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
66c0: 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
66d0: 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
66e0: 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
66f0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
6700: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52   *pSize){.  DWOR
6710: 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77  D upperBits, low
6720: 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65 72 74  erBits;.  assert
6730: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d  ( id!=0 );.  Sim
6740: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
6750: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
6760: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
6770: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 28 28 77   GetFileSize(((w
6780: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  inFile*)id)->h, 
6790: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 2a  &upperBits);.  *
67a0: 70 53 69 7a 65 20 3d 20 28 28 28 69 36 34 29 75  pSize = (((i64)u
67b0: 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b  pperBits)<<32) +
67c0: 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65   lowerBits;.  re
67d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
67e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
67f0: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
6800: 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
6810: 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
6820: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
6830: 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
6840: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
6850: 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
6860: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
6870: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
6880: 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65   Acquire a reade
6890: 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65  r lock..** Diffe
68a0: 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65  rent API routine
68b0: 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70  s are called dep
68c0: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
68d0: 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a  r or not this.**
68e0: 20 69 73 20 57 69 6e 39 35 20 6f 72 20 57 69 6e   is Win95 or Win
68f0: 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NT..*/.static in
6900: 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  t getReadLock(wi
6910: 6e 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  nFile *id){.  in
6920: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e  t res;.  if( isN
6930: 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c  T() ){.    OVERL
6940: 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20  APPED ovlp;.    
6950: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48  ovlp.Offset = SH
6960: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
6970: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
6980: 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45  = 0;.    ovlp.hE
6990: 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  vent = 0;.    re
69a0: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69  s = LockFileEx(i
69b0: 64 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46  d->h, LOCKFILE_F
69c0: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c  AIL_IMMEDIATELY,
69d0: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
69e0: 30 2c 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  0,&ovlp);.  }els
69f0: 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20  e{.    int lk;. 
6a00: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
6a10: 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c  ness(sizeof(lk),
6a20: 20 26 6c 6b 29 3b 0a 20 20 20 20 69 64 2d 3e 73   &lk);.    id->s
6a30: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
6a40: 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66  (lk & 0x7fffffff
6a50: 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
6a60: 20 31 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c   1);.    res = L
6a70: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53  ockFile(id->h, S
6a80: 48 41 52 45 44 5f 46 49 52 53 54 2b 69 64 2d 3e  HARED_FIRST+id->
6a90: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
6aa0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
6ab0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
6ac0: 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
6ad0: 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
6ae0: 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  nt unlockReadLoc
6af0: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
6b00: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
6b10: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
6b20: 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69    res = UnlockFi
6b30: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
6b40: 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
6b50: 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
6b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20   }else{.    res 
6b70: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  = UnlockFile(pFi
6b80: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
6b90: 52 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61  RST + pFile->sha
6ba0: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
6bb0: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
6bc0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e  urn res;.}..#ifn
6bd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6be0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a  PAGER_PRAGMAS./*
6bf0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
6c00: 20 67 69 76 65 6e 20 70 61 74 68 6e 61 6d 65 20   given pathname 
6c10: 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 61  is a directory a
6c20: 6e 64 20 69 73 20 77 72 69 74 61 62 6c 65 20 0a  nd is writable .
6c30: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
6c40: 33 57 69 6e 49 73 44 69 72 57 72 69 74 61 62 6c  3WinIsDirWritabl
6c50: 65 28 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65  e(char *zDirname
6c60: 29 7b 0a 20 20 69 6e 74 20 66 69 6c 65 41 74 74  ){.  int fileAtt
6c70: 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64  r;.  WCHAR *zWid
6c80: 65 3b 0a 20 20 69 66 28 20 7a 44 69 72 6e 61 6d  e;.  if( zDirnam
6c90: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
6ca0: 0a 20 20 69 66 28 20 21 69 73 4e 54 28 29 20 26  .  if( !isNT() &
6cb0: 26 20 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  & strlen(zDirnam
6cc0: 65 29 3e 4d 41 58 5f 50 41 54 48 20 29 20 72 65  e)>MAX_PATH ) re
6cd0: 74 75 72 6e 20 30 3b 0a 20 20 7a 57 69 64 65 20  turn 0;.  zWide 
6ce0: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
6cf0: 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28  zDirname);.  if(
6d00: 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 66 69   zWide ){.    fi
6d10: 6c 65 41 74 74 72 20 3d 20 47 65 74 46 69 6c 65  leAttr = GetFile
6d20: 41 74 74 72 69 62 75 74 65 73 57 28 7a 57 69 64  AttributesW(zWid
6d30: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
6d40: 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c  ee(zWide);.  }el
6d50: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
6d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  .    return 0;.#
6d70: 65 6c 73 65 0a 20 20 20 20 66 69 6c 65 41 74 74  else.    fileAtt
6d80: 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  r = GetFileAttri
6d90: 62 75 74 65 73 41 28 7a 44 69 72 6e 61 6d 65 29  butesA(zDirname)
6da0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
6db0: 66 28 20 66 69 6c 65 41 74 74 72 20 3d 3d 20 30  f( fileAttr == 0
6dc0: 78 66 66 66 66 66 66 66 66 20 29 20 72 65 74 75  xffffffff ) retu
6dd0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 66 69 6c  rn 0;.  if( (fil
6de0: 65 41 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  eAttr & FILE_ATT
6df0: 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
6e00: 29 20 21 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  ) != FILE_ATTRIB
6e10: 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b  UTE_DIRECTORY ){
6e20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6e30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
6e40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6e50: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
6e60: 47 4d 41 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  GMAS */../*.** L
6e70: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
6e80: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
6e90: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
6ea0: 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
6eb0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
6ec0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
6ed0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
6ee0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
6ef0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
6f00: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
6f10: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
6f20: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
6f30: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
6f40: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
6f50: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
6f60: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
6f70: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
6f80: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
6f90: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
6fa0: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
6fb0: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
6fc0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
6fd0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
6fe0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
6ff0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
7000: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
7010: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
7020: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
7030: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
7040: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
7050: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
7060: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
7070: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
7080: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
7090: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
70a0: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
70b0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
70c0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
70d0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
70e0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
70f0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
7100: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
7110: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
7120: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
7130: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
7140: 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
7150: 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
7160: 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
7170: 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
7180: 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
7190: 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
71a0: 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
71b0: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
71c0: 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
71d0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
71e0: 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
71f0: 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
7200: 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
7210: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
7220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7230: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Lock(OsFile *id,
7240: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
7250: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7260: 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
7270: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
7280: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
7290: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
72a0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
72b0: 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a windows lock
72c0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
72d0: 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
72e0: 20 20 2f 2a 20 53 65 74 20 69 64 2d 3e 6c 6f 63    /* Set id->loc
72f0: 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
7300: 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
7310: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
7320: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
7330: 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
7340: 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
7350: 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
7360: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
7370: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
7380: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
7390: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 54 52 41 43  ile!=0 );.  TRAC
73a0: 45 35 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77  E5("LOCK %d %d w
73b0: 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  as %d(%d)\n",.  
73c0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
73d0: 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  , locktype, pFil
73e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
73f0: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
7400: 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  te);..  /* If th
7410: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
7420: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
7430: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
7440: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
7450: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
7460: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
7470: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
7480: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
7490: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
74a0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
74b0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
74c0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
74d0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
74e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
74f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7500: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
7510: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
7520: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
7530: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
7540: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
7550: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
7560: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
7570: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
7580: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
7590: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
75a0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
75b0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
75c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
75d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
75e0: 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
75f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
7600: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
7610: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
7620: 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
7630: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
7640: 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
7650: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
7660: 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
7670: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
7680: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
7690: 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
76a0: 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
76b0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
76c0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
76d0: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
76e0: 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65  .   || (locktype
76f0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
7700: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
7710: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
7720: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
7730: 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
7740: 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
7750: 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28  (res = LockFile(
7760: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
7770: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
7780: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
7790: 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
77a0: 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
77b0: 6c 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69  lock.  The pendi
77c0: 6e 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65  ng lock might be
77d0: 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  .      ** held b
77e0: 79 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72  y another reader
77f0: 20 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c   process who wil
7800: 6c 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d  l release it mom
7810: 65 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20  entarily..      
7820: 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  */.      TRACE2(
7830: 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61  "could not get a
7840: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63   PENDING lock. c
7850: 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a  nt=%d\n", cnt);.
7860: 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a        Sleep(1);.
7870: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e      }.    gotPen
7880: 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a  dingLock = res;.
7890: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
78a0: 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
78b0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
78c0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
78d0: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
78e0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
78f0: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
7900: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74  );.    res = get
7910: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
7920: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
7930: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
7940: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
7950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7960: 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
7970: 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
7980: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
7990: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
79a0: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
79b0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
79c0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
79d0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b  ;.    res = Lock
79e0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
79f0: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
7a00: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
7a10: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
7a20: 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
7a30: 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  VED_LOCK;.    }.
7a40: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
7a50: 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
7a60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
7a70: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
7a80: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
7a90: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
7aa0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
7ab0: 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
7ac0: 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
7ad0: 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
7ae0: 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
7af0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
7b00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
7b10: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
7b20: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
7b30: 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
7b40: 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75  K );.    res = u
7b50: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
7b60: 69 6c 65 29 3b 0a 20 20 20 20 54 52 41 43 45 32  ile);.    TRACE2
7b70: 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25  ("unreadlock = %
7b80: 64 5c 6e 22 2c 20 72 65 73 29 3b 0a 20 20 20 20  d\n", res);.    
7b90: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
7ba0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
7bb0: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
7bc0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
7bd0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
7be0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
7bf0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
7c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
7c10: 52 41 43 45 32 28 22 65 72 72 6f 72 2d 63 6f 64  RACE2("error-cod
7c20: 65 20 3d 20 25 64 5c 6e 22 2c 20 47 65 74 4c 61  e = %d\n", GetLa
7c30: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
7c40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
7c50: 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
7c60: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61  PENDING lock tha
7c70: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65  t ought to be re
7c80: 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a  leased, then.  *
7c90: 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77  * release it now
7ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74  ..  */.  if( got
7cb0: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c  PendingLock && l
7cc0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
7cd0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
7ce0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
7cf0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
7d00: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
7d10: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
7d20: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
7d30: 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
7d40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
7d50: 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
7d60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
7d70: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
7d80: 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
7d90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7da0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
7db0: 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 46 41   TRACE4("LOCK FA
7dc0: 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
7dd0: 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
7de0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
7df0: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
7e00: 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
7e10: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
7e20: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46  E_BUSY;.  }.  pF
7e30: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
7e40: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  newLocktype;.  r
7e50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7e60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7e70: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
7e80: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
7e90: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
7ea0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
7eb0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
7ec0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
7ed0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
7ee0: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
7ef0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
7f00: 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
7f10: 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
7f20: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
7f30: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
7f40: 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
7f50: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
7f60: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
7f70: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  pFile!=0 );.  if
7f80: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
7f90: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
7fa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
7fb0: 20 20 20 20 54 52 41 43 45 33 28 22 54 45 53 54      TRACE3("TEST
7fc0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28   WR-LOCK %d %d (
7fd0: 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
7fe0: 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73  ->h, rc);.  }els
7ff0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b  e{.    rc = Lock
8000: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
8010: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
8020: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
8030: 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f  rc ){.      Unlo
8040: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
8050: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
8060: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
8070: 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20      rc = !rc;.  
8080: 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57    TRACE3("TEST W
8090: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65  R-LOCK %d %d (re
80a0: 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
80b0: 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  >h, rc);.  }.  r
80c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
80d0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
80e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
80f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64  le descriptor id
8100: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
8110: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
8120: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
8130: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
8140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
8150: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
8160: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
8170: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
8180: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
8190: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
81a0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
81b0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
81c0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  op..**.** It is 
81d0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
81e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
81f0: 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63   fail if the sec
8200: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
8210: 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20  is NO_LOCK.  If 
8220: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8230: 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f  ent is SHARED_LO
8240: 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  CK then this rou
8250: 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65  tine.** might re
8260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8270: 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R;.*/.static int
8280: 20 77 69 6e 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c   winUnlock(OsFil
8290: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
82a0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
82b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
82c0: 49 54 45 5f 4f 4b 3b 0a 20 20 77 69 6e 46 69 6c  ITE_OK;.  winFil
82d0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
82e0: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
82f0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
8300: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
8310: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
8320: 3b 0a 20 20 54 52 41 43 45 35 28 22 55 4e 4c 4f  ;.  TRACE5("UNLO
8330: 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20  CK %d to %d was 
8340: 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  %d(%d)\n", pFile
8350: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
8360: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
8370: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
8380: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
8390: 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
83a0: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
83b0: 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
83c0: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  E_LOCK ){.    Un
83d0: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
83e0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
83f0: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
8400: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63   0);.    if( loc
8410: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8420: 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f  CK && !getReadLo
8430: 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
8440: 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
8450: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
8460: 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
8470: 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
8480: 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
8490: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
84a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
84b0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
84c0: 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
84d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
84e0: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
84f0: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
8500: 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
8510: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
8520: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
8530: 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
8540: 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  OCK ){.    unloc
8550: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
8560: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
8570: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
8580: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
8590: 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  (pFile->h, PENDI
85a0: 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
85b0: 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
85c0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
85d0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
85e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
85f0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
8600: 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
8610: 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72  pathname.  Retur
8620: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
8630: 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  o the full pathn
8640: 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70  ame stored in sp
8650: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
8660: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
8670: 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
8680: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
8690: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
86a0: 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20  eing this space 
86b0: 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  once it.** is no
86c0: 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a   longer needed..
86d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
86e0: 57 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  WinFullPathname(
86f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
8700: 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a  ative){.  char *
8710: 7a 46 75 6c 6c 3b 0a 23 69 66 20 64 65 66 69 6e  zFull;.#if defin
8720: 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
8730: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 6e 42   int nByte;.  nB
8740: 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65  yte = strlen(zRe
8750: 6c 61 74 69 76 65 29 20 2b 20 4d 41 58 5f 50 41  lative) + MAX_PA
8760: 54 48 20 2b 20 31 30 30 31 3b 0a 20 20 7a 46 75  TH + 1001;.  zFu
8770: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
8780: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
8790: 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74  ( zFull==0 ) ret
87a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 79 67  urn 0;.  if( cyg
87b0: 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c  win_conv_to_full
87c0: 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c  _win32_path(zRel
87d0: 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 20 29 20  ative, zFull) ) 
87e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 69 66 20  return 0;.#elif 
87f0: 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 57 69  OS_WINCE.  /* Wi
8800: 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
8810: 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
8820: 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
8830: 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
8840: 20 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 53   zFull = sqliteS
8850: 74 72 44 75 70 28 7a 52 65 6c 61 74 69 76 65 29  trDup(zRelative)
8860: 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20 2a  ;.#else.  char *
8870: 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 57 43 48 41  zNotUsed;.  WCHA
8880: 52 20 2a 7a 57 69 64 65 3b 0a 20 20 69 6e 74 20  R *zWide;.  int 
8890: 6e 42 79 74 65 3b 0a 20 20 7a 57 69 64 65 20 3d  nByte;.  zWide =
88a0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
88b0: 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28  Relative);.  if(
88c0: 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 57 43   zWide ){.    WC
88d0: 48 41 52 20 2a 7a 54 65 6d 70 2c 20 2a 7a 4e 6f  HAR *zTemp, *zNo
88e0: 74 55 73 65 64 57 3b 0a 20 20 20 20 6e 42 79 74  tUsedW;.    nByt
88f0: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
8900: 61 6d 65 57 28 7a 57 69 64 65 2c 20 30 2c 20 30  ameW(zWide, 0, 0
8910: 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29 20 2b 20  , &zNotUsedW) + 
8920: 31 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  1;.    zTemp = s
8930: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
8940: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
8950: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
8960: 54 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  Temp==0 ) return
8970: 20 30 3b 0a 20 20 20 20 47 65 74 46 75 6c 6c 50   0;.    GetFullP
8980: 61 74 68 4e 61 6d 65 57 28 7a 57 69 64 65 2c 20  athNameW(zWide, 
8990: 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 26 7a  nByte, zTemp, &z
89a0: 4e 6f 74 55 73 65 64 57 29 3b 0a 20 20 20 20 73  NotUsedW);.    s
89b0: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29  qliteFree(zWide)
89c0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20 75 6e  ;.    zFull = un
89d0: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
89e0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  p);.    sqliteFr
89f0: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  ee(zTemp);.  }el
8a00: 73 65 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  se{.    nByte = 
8a10: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
8a20: 28 7a 52 65 6c 61 74 69 76 65 2c 20 30 2c 20 30  (zRelative, 0, 0
8a30: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 20 2b 20 31  , &zNotUsed) + 1
8a40: 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20 73 71  ;.    zFull = sq
8a50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
8a60: 65 2a 73 69 7a 65 6f 66 28 7a 46 75 6c 6c 5b 30  e*sizeof(zFull[0
8a70: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  ]) );.    if( zF
8a80: 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ull==0 ) return 
8a90: 30 3b 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61  0;.    GetFullPa
8aa0: 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69 76  thNameA(zRelativ
8ab0: 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75 6c 6c 2c  e, nByte, zFull,
8ac0: 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 7d   &zNotUsed);.  }
8ad0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
8ae0: 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zFull;.}../*.**
8af0: 20 54 68 65 20 66 75 6c 6c 53 79 6e 63 20 6f 70   The fullSync op
8b00: 74 69 6f 6e 20 69 73 20 6d 65 61 6e 69 6e 67 6c  tion is meaningl
8b10: 65 73 73 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 20  ess on windows. 
8b20: 20 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f    This is a no-o
8b30: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
8b40: 64 20 77 69 6e 53 65 74 46 75 6c 6c 53 79 6e 63  d winSetFullSync
8b50: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
8b60: 20 76 29 7b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   v){.  return;.}
8b70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8b80: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
8b90: 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  le handle for an
8ba0: 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69   OsFile.*/.stati
8bb0: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 48 61 6e  c int winFileHan
8bc0: 64 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b  dle(OsFile *id){
8bd0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28  .  return (int)(
8be0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (winFile*)id)->h
8bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8c00: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  n an integer tha
8c10: 74 20 69 6e 64 69 63 65 73 20 74 68 65 20 74 79  t indices the ty
8c20: 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65  pe of lock curre
8c30: 6e 74 6c 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20  ntly held.** by 
8c40: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 28 55  this handle.  (U
8c50: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
8c60: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
8c70: 79 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y.).*/.static in
8c80: 74 20 77 69 6e 4c 6f 63 6b 53 74 61 74 65 28 4f  t winLockState(O
8c90: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
8ca0: 74 75 72 6e 20 28 28 77 69 6e 46 69 6c 65 2a 29  turn ((winFile*)
8cb0: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d  id)->locktype;.}
8cc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
8cd0: 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
8ce0: 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
8cf0: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
8d00: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72  an OsFile.** for
8d10: 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
8d20: 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64  c const IoMethod
8d30: 20 73 71 6c 69 74 65 33 57 69 6e 49 6f 4d 65 74   sqlite3WinIoMet
8d40: 68 6f 64 20 3d 20 7b 0a 20 20 77 69 6e 43 6c 6f  hod = {.  winClo
8d50: 73 65 2c 0a 20 20 77 69 6e 4f 70 65 6e 44 69 72  se,.  winOpenDir
8d60: 65 63 74 6f 72 79 2c 0a 20 20 77 69 6e 52 65 61  ectory,.  winRea
8d70: 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a 20  d,.  winWrite,. 
8d80: 20 77 69 6e 53 65 65 6b 2c 0a 20 20 77 69 6e 54   winSeek,.  winT
8d90: 72 75 6e 63 61 74 65 2c 0a 20 20 77 69 6e 53 79  runcate,.  winSy
8da0: 6e 63 2c 0a 20 20 77 69 6e 53 65 74 46 75 6c 6c  nc,.  winSetFull
8db0: 53 79 6e 63 2c 0a 20 20 77 69 6e 46 69 6c 65 48  Sync,.  winFileH
8dc0: 61 6e 64 6c 65 2c 0a 20 20 77 69 6e 46 69 6c 65  andle,.  winFile
8dd0: 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f 63 6b 2c  Size,.  winLock,
8de0: 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 0a 20 20  .  winUnlock,.  
8df0: 77 69 6e 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20  winLockState,.  
8e00: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
8e10: 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  Lock,.};../*.** 
8e20: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
8e30: 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 2e 20 20  for an OsFile.  
8e40: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  Initialize the n
8e50: 65 77 20 4f 73 46 69 6c 65 0a 2a 2a 20 74 6f 20  ew OsFile.** to 
8e60: 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e 20  the value given 
8e70: 69 6e 20 70 49 6e 69 74 20 61 6e 64 20 72 65 74  in pInit and ret
8e80: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8e90: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 4f 73 46 69   the new.** OsFi
8ea0: 6c 65 2e 20 20 49 66 20 77 65 20 72 75 6e 20 6f  le.  If we run o
8eb0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c  ut of memory, cl
8ec0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
8ed0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
8ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
8ef0: 63 61 74 65 57 69 6e 46 69 6c 65 28 77 69 6e 46  cateWinFile(winF
8f00: 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69  ile *pInit, OsFi
8f10: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e  le **pId){.  win
8f20: 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  File *pNew;.  pN
8f30: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
8f40: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
8f50: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
8f60: 30 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61  0 ){.    CloseHa
8f70: 6e 64 6c 65 28 70 49 6e 69 74 2d 3e 68 29 3b 0a  ndle(pInit->h);.
8f80: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
8f90: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 69   sqliteFree(pIni
8fa0: 74 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  t->zDeleteOnClos
8fb0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2a  e);.#endif.    *
8fc0: 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  pId = 0;.    ret
8fd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8fe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
8ff0: 70 4e 65 77 20 3d 20 2a 70 49 6e 69 74 3b 0a 20  pNew = *pInit;. 
9000: 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
9010: 20 3d 20 26 73 71 6c 69 74 65 33 57 69 6e 49 6f   = &sqlite3WinIo
9020: 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 4e 65 77  Method;.    pNew
9030: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
9040: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  LOCK;.    pNew->
9050: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
9060: 20 30 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28   0;.    *pId = (
9070: 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20  OsFile*)pNew;.  
9080: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
9090: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
90a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
90b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
90c0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
90d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
9120: 20 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76   Everything abov
9130: 65 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c  e deals with fil
9140: 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69  e I/O.  Everythi
9150: 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ng that follows 
9160: 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74  deals.** with ot
9170: 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73  her miscellanous
9180: 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20   aspects of the 
9190: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
91a0: 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a   interface.*****
91b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
9200: 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
9210: 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
9220: 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
9230: 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
9240: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
9250: 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
9260: 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
9270: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
9280: 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
9290: 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
92a0: 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
92b0: 20 73 71 6c 69 74 65 33 57 69 6e 52 61 6e 64 6f   sqlite3WinRando
92c0: 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75 66  mSeed(char *zBuf
92d0: 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ){.  /* We have 
92e0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
92f0: 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
9300: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
9310: 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
9320: 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
9330: 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
9340: 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
9350: 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
9360: 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
9370: 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
9380: 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
9390: 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
93a0: 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
93b0: 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
93c0: 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
93d0: 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
93e0: 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
93f0: 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
9400: 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
9410: 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
9420: 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
9430: 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
9440: 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
9450: 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
9460: 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
9470: 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
9480: 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
9490: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
94a0: 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
94b0: 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
94c0: 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
94d0: 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
94e0: 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
94f0: 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
9500: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
9510: 65 71 75 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d  equence.* This m
9520: 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
9530: 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
9540: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
9550: 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 20 20 47  uf, 0, 256);.  G
9560: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50  etSystemTime((LP
9570: 53 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29  SYSTEMTIME)zBuf)
9580: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9590: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
95a0: 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
95b0: 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
95c0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
95d0: 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
95e0: 74 20 73 71 6c 69 74 65 33 57 69 6e 53 6c 65 65  t sqlite3WinSlee
95f0: 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 53 6c 65  p(int ms){.  Sle
9600: 65 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e  ep(ms);.  return
9610: 20 6d 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   ms;.}../*.** St
9620: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
9630: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
9640: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
9650: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
9660: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
9670: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
9680: 41 44 53 0a 20 20 73 74 61 74 69 63 20 44 57 4f  ADS.  static DWO
9690: 52 44 20 6d 75 74 65 78 4f 77 6e 65 72 3b 0a 20  RD mutexOwner;. 
96a0: 20 73 74 61 74 69 63 20 43 52 49 54 49 43 41 4c   static CRITICAL
96b0: 5f 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65 6e  _SECTION cs;.#en
96c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
96d0: 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f 66  ollowing pair of
96e0: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
96f0: 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75  ent mutual exclu
9700: 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74  sion for.** mult
9710: 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65  i-threaded proce
9720: 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69  sses.  Only a si
9730: 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61  ngle thread is a
9740: 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65  llowed to.** exe
9750: 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  cuted code that 
9760: 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  is surrounded by
9770: 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e   EnterMutex() an
9780: 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a  d LeaveMutex()..
9790: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
97a0: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
97b0: 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73  Mutex.  There is
97c0: 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63   not much critic
97d0: 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77  al.** code and w
97e0: 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65  hat little there
97f0: 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69   is executes qui
9800: 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74  ckly and without
9810: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   blocking..**.**
9820: 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20 61   Version 3.3.1 a
9830: 6e 64 20 65 61 72 6c 69 65 72 20 75 73 65 64 20  nd earlier used 
9840: 61 20 73 69 6d 70 6c 65 20 6d 75 74 65 78 2e 20  a simple mutex. 
9850: 20 42 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 0a   Beginning with.
9860: 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32  ** version 3.3.2
9870: 2c 20 61 20 72 65 63 75 72 73 69 76 65 20 6d 75  , a recursive mu
9880: 74 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  tex is required.
9890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
98a0: 57 69 6e 45 6e 74 65 72 4d 75 74 65 78 28 29 7b  WinEnterMutex(){
98b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
98c0: 33 32 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61  32_THREADS.  sta
98d0: 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d  tic int isInit =
98e0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 69 73   0;.  while( !is
98f0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 74 61 74  Init ){.    stat
9900: 69 63 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30  ic long lock = 0
9910: 3b 0a 20 20 20 20 69 66 28 20 49 6e 74 65 72 6c  ;.    if( Interl
9920: 6f 63 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 26  ockedIncrement(&
9930: 6c 6f 63 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20  lock)==1 ){.    
9940: 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74    InitializeCrit
9950: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29  icalSection(&cs)
9960: 3b 0a 20 20 20 20 20 20 69 73 49 6e 69 74 20 3d  ;.      isInit =
9970: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
9980: 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20       Sleep(1);. 
9990: 20 20 20 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72     }.  }.  Enter
99a0: 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28  CriticalSection(
99b0: 26 63 73 29 3b 0a 20 20 6d 75 74 65 78 4f 77 6e  &cs);.  mutexOwn
99c0: 65 72 20 3d 20 47 65 74 43 75 72 72 65 6e 74 54  er = GetCurrentT
99d0: 68 72 65 61 64 49 64 28 29 3b 0a 23 65 6e 64 69  hreadId();.#endi
99e0: 66 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a 7d  f.  inMutex++;.}
99f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
9a00: 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20  LeaveMutex(){.  
9a10: 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 20  assert( inMutex 
9a20: 29 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a  );.  inMutex--;.
9a30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33  #ifdef SQLITE_W3
9a40: 32 5f 54 48 52 45 41 44 53 0a 20 20 61 73 73 65  2_THREADS.  asse
9a50: 72 74 28 20 6d 75 74 65 78 4f 77 6e 65 72 3d 3d  rt( mutexOwner==
9a60: 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64  GetCurrentThread
9a70: 49 64 28 29 20 29 3b 0a 20 20 4c 65 61 76 65 43  Id() );.  LeaveC
9a80: 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26  riticalSection(&
9a90: 63 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  cs);.#endif.}../
9aa0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
9ab0: 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 69 73   if the mutex is
9ac0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e   currently held.
9ad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  .**.** If the th
9ae0: 69 73 54 68 72 65 61 64 4f 6e 6c 79 20 70 61 72  isThreadOnly par
9af0: 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20  ameter is true, 
9b00: 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  return true if a
9b10: 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a  nd only if the.*
9b20: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64  * calling thread
9b30: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
9b40: 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
9b50: 74 65 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65  ter is false, re
9b60: 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
9b70: 61 6e 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73  any thread holds
9b80: 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69   the mutex..*/.i
9b90: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 49 6e 4d  nt sqlite3WinInM
9ba0: 75 74 65 78 28 69 6e 74 20 74 68 69 73 54 68 72  utex(int thisThr
9bb0: 65 61 64 4f 6e 6c 79 29 7b 0a 23 69 66 64 65 66  eadOnly){.#ifdef
9bc0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
9bd0: 41 44 53 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d  ADS.  return inM
9be0: 75 74 65 78 3e 30 20 26 26 20 28 74 68 69 73 54  utex>0 && (thisT
9bf0: 68 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  hreadOnly==0 || 
9c00: 6d 75 74 65 78 4f 77 6e 65 72 3d 3d 47 65 74 43  mutexOwner==GetC
9c10: 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29  urrentThreadId()
9c20: 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
9c30: 6e 20 69 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e  n inMutex>0;.#en
9c40: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
9c50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
9c60: 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
9c70: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
9c80: 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  , becomes the re
9c90: 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64  sult.** returned
9ca0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43   from sqlite3OsC
9cb0: 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54  urrentTime().  T
9cc0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
9cd0: 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
9ce0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
9cf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
9d00: 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e  nt_time = 0;.#en
9d10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
9d20: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
9d30: 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
9d40: 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
9d50: 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
9d60: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
9d70: 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
9d80: 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
9d90: 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
9da0: 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
9db0: 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
9dc0: 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
9dd0: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
9de0: 20 73 71 6c 69 74 65 33 57 69 6e 43 75 72 72 65   sqlite3WinCurre
9df0: 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70  ntTime(double *p
9e00: 72 4e 6f 77 29 7b 0a 20 20 46 49 4c 45 54 49 4d  rNow){.  FILETIM
9e10: 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45 54  E ft;.  /* FILET
9e20: 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
9e30: 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
9e40: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
9e50: 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
9e60: 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
9e70: 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
9e80: 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
9e90: 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
9ea0: 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  . .  */.  double
9eb0: 20 6e 6f 77 3b 0a 23 69 66 20 4f 53 5f 57 49 4e   now;.#if OS_WIN
9ec0: 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
9ed0: 74 69 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65  time;.  GetSyste
9ee0: 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
9ef0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
9f00: 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 3b  Time(&time,&ft);
9f10: 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74  .#else.  GetSyst
9f20: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
9f30: 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
9f40: 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65    now = ((double
9f50: 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
9f60: 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39 36  me) * 4294967296
9f70: 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  .0; .  *prNow = 
9f80: 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44  (now + ft.dwLowD
9f90: 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30  ateTime)/8640000
9fa0: 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31  00000.0 + 230581
9fb0: 33 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  3.5;.#ifdef SQLI
9fc0: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
9fd0: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
9fe0: 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  me ){.    *prNow
9ff0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65   = sqlite3_curre
a000: 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20  nt_time/86400.0 
a010: 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d  + 2440587.5;.  }
a020: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
a030: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   0;.}../*.** Rem
a040: 65 6d 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72  ember the number
a050: 20 6f 66 20 74 68 72 65 61 64 2d 73 70 65 63 69   of thread-speci
a060: 66 69 63 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20  fic-data blocks 
a070: 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73  allocated..** Us
a080: 65 20 74 68 69 73 20 74 6f 20 76 65 72 69 66 79  e this to verify
a090: 20 74 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74   that we are not
a0a0: 20 6c 65 61 6b 69 6e 67 20 74 68 72 65 61 64 2d   leaking thread-
a0b0: 73 70 65 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a  specific-data..*
a0c0: 2a 20 54 69 63 6b 65 74 20 23 31 36 30 31 0a 2a  * Ticket #1601.*
a0d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
a0e0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
a0f0: 5f 74 73 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  _tsd_count = 0;.
a100: 23 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55  # define TSD_COU
a110: 4e 54 45 52 5f 49 4e 43 52 20 49 6e 74 65 72 6c  NTER_INCR Interl
a120: 6f 63 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 26  ockedIncrement(&
a130: 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
a140: 74 29 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f  t).# define TSD_
a150: 43 4f 55 4e 54 45 52 5f 44 45 43 52 20 49 6e 74  COUNTER_DECR Int
a160: 65 72 6c 6f 63 6b 65 64 44 65 63 72 65 6d 65 6e  erlockedDecremen
a170: 74 28 26 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  t(&sqlite3_tsd_c
a180: 6f 75 6e 74 29 0a 23 65 6c 73 65 0a 23 20 64 65  ount).#else.# de
a190: 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52  fine TSD_COUNTER
a1a0: 5f 49 4e 43 52 20 20 2f 2a 20 6e 6f 2d 6f 70 20  _INCR  /* no-op 
a1b0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f  */.# define TSD_
a1c0: 43 4f 55 4e 54 45 52 5f 44 45 43 52 20 20 2f 2a  COUNTER_DECR  /*
a1d0: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
a1e0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c  ..../*.** If cal
a1f0: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
a200: 65 46 6c 61 67 3e 31 2c 20 74 68 65 6e 20 72 65  eFlag>1, then re
a210: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a220: 6f 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63  o thread.** spec
a230: 69 66 69 63 20 64 61 74 61 20 66 6f 72 20 74 68  ific data for th
a240: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
a250: 2e 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  .  Allocate and 
a260: 7a 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65  zero the.** thre
a270: 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
a280: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
a290: 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6e 65  already exist ne
a2a0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
a2b0: 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
a2c0: 6c 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c 20 74  locateFlag==0, t
a2d0: 68 65 6e 20 63 68 65 63 6b 20 74 68 65 20 63 75  hen check the cu
a2e0: 72 72 65 6e 74 20 74 68 72 65 61 64 0a 2a 2a 20  rrent thread.** 
a2f0: 73 70 65 63 69 66 69 63 20 64 61 74 61 2e 20 20  specific data.  
a300: 52 65 74 75 72 6e 20 69 74 20 69 66 20 69 74 20  Return it if it 
a310: 65 78 69 73 74 73 2e 20 20 49 66 20 69 74 20 64  exists.  If it d
a320: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a  oes not exist,.*
a330: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  * then return NU
a340: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  LL..**.** If cal
a350: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
a360: 65 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b 20 74  eFlag<0, check t
a370: 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 68 72  o see if the thr
a380: 65 61 64 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead specific.** 
a390: 64 61 74 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  data is allocate
a3a0: 64 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a 65 72  d and is all zer
a3b0: 6f 2e 20 20 49 66 20 69 74 20 69 73 20 74 68 65  o.  If it is the
a3c0: 6e 20 64 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e  n deallocate it.
a3d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
a3e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 68 72 65  nter to the thre
a3f0: 61 64 20 73 70 65 63 69 66 69 63 20 64 61 74 61  ad specific data
a400: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 69   or NULL if it i
a410: 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64  s.** unallocated
a420: 20 6f 72 20 67 65 74 73 20 64 65 61 6c 6c 6f 63   or gets dealloc
a430: 61 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44  ated..*/.ThreadD
a440: 61 74 61 20 2a 73 71 6c 69 74 65 33 57 69 6e 54  ata *sqlite3WinT
a450: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
a460: 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74 65 46 6c  a(int allocateFl
a470: 61 67 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  ag){.  static in
a480: 74 20 6b 65 79 3b 0a 20 20 73 74 61 74 69 63 20  t key;.  static 
a490: 69 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b  int keyInit = 0;
a4a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a4b0: 54 68 72 65 61 64 44 61 74 61 20 7a 65 72 6f 44  ThreadData zeroD
a4c0: 61 74 61 20 3d 20 7b 30 7d 3b 0a 20 20 54 68 72  ata = {0};.  Thr
a4d0: 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a  eadData *pTsd;..
a4e0: 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29    if( !keyInit )
a4f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45  {.    sqlite3OsE
a500: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
a510: 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b   if( !keyInit ){
a520: 0a 20 20 20 20 20 20 6b 65 79 20 3d 20 54 6c 73  .      key = Tls
a530: 41 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 69  Alloc();.      i
a540: 66 28 20 6b 65 79 3d 3d 30 78 66 66 66 66 66 66  f( key==0xffffff
a550: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
a560: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
a570: 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  x();.        ret
a580: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
a590: 20 20 20 20 20 6b 65 79 49 6e 69 74 20 3d 20 31       keyInit = 1
a5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a5b0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
a5c0: 29 3b 0a 20 20 7d 0a 20 20 70 54 73 64 20 3d 20  );.  }.  pTsd = 
a5d0: 54 6c 73 47 65 74 56 61 6c 75 65 28 6b 65 79 29  TlsGetValue(key)
a5e0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65  ;.  if( allocate
a5f0: 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66  Flag>0 ){.    if
a600: 28 20 21 70 54 73 64 20 29 7b 0a 20 20 20 20 20  ( !pTsd ){.     
a610: 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f   pTsd = sqlite3O
a620: 73 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  sMalloc( sizeof(
a630: 7a 65 72 6f 44 61 74 61 29 20 29 3b 0a 20 20 20  zeroData) );.   
a640: 20 20 20 69 66 28 20 70 54 73 64 20 29 7b 0a 20     if( pTsd ){. 
a650: 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d 20 7a         *pTsd = z
a660: 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20 20 20  eroData;.       
a670: 20 54 6c 73 53 65 74 56 61 6c 75 65 28 6b 65 79   TlsSetValue(key
a680: 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20 20 20  , pTsd);.       
a690: 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 49 4e 43   TSD_COUNTER_INC
a6a0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
a6b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 73  .  }else if( pTs
a6c0: 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74 65  d!=0 && allocate
a6d0: 46 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20 20  Flag<0 .        
a6e0: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
a6f0: 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c  pTsd, &zeroData,
a700: 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61   sizeof(ThreadDa
a710: 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ta))==0 ){.    s
a720: 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54 73  qlite3OsFree(pTs
a730: 64 29 3b 0a 20 20 20 20 54 6c 73 53 65 74 56 61  d);.    TlsSetVa
a740: 6c 75 65 28 6b 65 79 2c 20 30 29 3b 0a 20 20 20  lue(key, 0);.   
a750: 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 44 45 43   TSD_COUNTER_DEC
a760: 52 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30 3b  R;.    pTsd = 0;
a770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
a780: 73 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sd;.}.#endif /* 
a790: 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.