/ Hex Artifact Content
Login

Artifact eb6642f708b1b183446bf121e0dbd84711d7d883:


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 6e 43 68 61 72 20  ename;..  nChar 
0f50: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
0f60: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
0f70: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
0f80: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69   NULL, 0);.  zWi
0f90: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  deFilename = sql
0fa0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 43 68 61 72  iteMalloc( nChar
0fb0: 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c  *sizeof(zWideFil
0fc0: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
0fd0: 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  f( zWideFilename
0fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
0ff0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
1000: 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
1010: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
1020: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
1030: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
1040: 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e   nChar);.  if( n
1050: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Char==0 ){.    s
1060: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 46  qliteFree(zWideF
1070: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57  ilename);.    zW
1080: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ideFilename = 0;
1090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
10a0: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ideFilename;.}..
10b0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54  /*.** Convert UT
10c0: 46 2d 33 32 20 74 6f 20 55 54 46 2d 38 2e 20 20  F-32 to UTF-8.  
10d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
10e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
10f0: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
1100: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1110: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
1120: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55  char *unicodeToU
1130: 74 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20  tf8(const WCHAR 
1140: 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b  *zWideFilename){
1150: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
1160: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1170: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65  ..  nByte = Wide
1180: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
1190: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
11a0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
11b0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46  , 0, 0, 0);.  zF
11c0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
11d0: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
11e0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
11f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1200: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
1210: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1220: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
1230: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1240: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
1250: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
1280: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
1290: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
12a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
12b0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
12c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
12d0: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
12e0: 43 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74 69 62  Convert a multib
12f0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
1300: 72 69 6e 67 20 74 6f 20 55 54 46 2d 33 32 2c 20  ring to UTF-32, 
1310: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
1320: 72 65 6e 74 0a 2a 2a 20 41 6e 73 69 20 63 6f 64  rent.** Ansi cod
1330: 65 70 61 67 65 20 28 43 50 5f 41 43 50 29 2e 20  epage (CP_ACP). 
1340: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1350: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
1360: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
1370: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1380: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43  oc..*/.static WC
1390: 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e 69 63 6f  HAR *mbcsToUnico
13a0: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
13b0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
13c0: 20 6e 42 79 74 65 3b 0a 20 20 57 43 48 41 52 20   nByte;.  WCHAR 
13d0: 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a  *zMbcsFilename;.
13e0: 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69  .  nByte = Multi
13f0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
1400: 50 5f 41 43 50 2c 20 30 2c 20 7a 46 69 6c 65 6e  P_ACP, 0, zFilen
1410: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
1420: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
1430: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
1440: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1450: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
1460: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
1470: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
1480: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
1490: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14a0: 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79   nByte = MultiBy
14b0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
14c0: 41 43 50 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  ACP, 0, zFilenam
14d0: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
14e0: 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  name, nByte);.  
14f0: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
1500: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1510: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  MbcsFilename);. 
1520: 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65     zMbcsFilename
1530: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1540: 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  rn zMbcsFilename
1550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1560: 72 74 20 55 54 46 2d 33 32 20 74 6f 20 6d 75 6c  rt UTF-32 to mul
1570: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
1580: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
1590: 6e 20 74 68 65 20 75 73 65 72 27 73 20 41 6e 73  n the user's Ans
15a0: 69 0a 2a 2a 20 63 6f 64 65 70 61 67 65 20 28 43  i.** codepage (C
15b0: 50 5f 41 43 50 29 2e 20 53 70 61 63 65 20 74 6f  P_ACP). Space to
15c0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
15d0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
15e0: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
15f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  liteMalloc()..*/
1600: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
1610: 69 63 6f 64 65 54 6f 4d 62 63 73 28 63 6f 6e 73  icodeToMbcs(cons
1620: 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69  t WCHAR *zWideFi
1630: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
1640: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
1650: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
1660: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
1670: 6c 74 69 42 79 74 65 28 43 50 5f 41 43 50 2c 20  ltiByte(CP_ACP, 
1680: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1690: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
16a0: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
16b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
16c0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
16d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
16e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16f0: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1700: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1710: 5f 41 43 50 2c 20 30 2c 20 7a 57 69 64 65 46 69  _ACP, 0, zWideFi
1720: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
1730: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
1760: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
1770: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
1780: 65 46 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  eFree(zFilename)
1790: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
17a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
17b0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
17c0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
17d0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
17e0: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
17f0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
1800: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
1810: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
1820: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1830: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  Malloc()..*/.sta
1840: 74 69 63 20 63 68 61 72 20 2a 6d 62 63 73 54 6f  tic char *mbcsTo
1850: 55 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  Utf8(const char 
1860: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
1870: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
1880: 66 38 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d  f8;.  WCHAR *zTm
1890: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
18a0: 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f  de = mbcsToUnico
18b0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
18c0: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
18d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
18e0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
18f0: 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54  eUtf8 = unicodeT
1900: 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b  oUtf8(zTmpWide);
1910: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
1920: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
1930: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
1940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1950: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
1960: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
1970: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
1980: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
1990: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
19a0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
19b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  qliteMalloc()..*
19c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
19d0: 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20  tf8ToMbcs(const 
19e0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
19f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
1a00: 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41 52  ameMbcs;.  WCHAR
1a10: 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a   *zTmpWide;..  z
1a20: 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f  TmpWide = utf8To
1a30: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
1a40: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
1a50: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
1a60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
1a70: 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69  lenameMbcs = uni
1a80: 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57  codeToMbcs(zTmpW
1a90: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ide);.  sqliteFr
1aa0: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
1ab0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
1ac0: 4d 62 63 73 3b 0a 7d 0a 0a 23 69 66 20 4f 53 5f  Mbcs;.}..#if OS_
1ad0: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b20: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
1b30: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
1b40: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
1b50: 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 43  /./*.** WindowsC
1b60: 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  E does not have 
1b70: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
1b80: 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61  nction.  So crea
1b90: 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75  te a.** substitu
1ba0: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
1bb0: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
1bc0: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
1bd0: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
1be0: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
1bf0: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
1c00: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
1c10: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
1c20: 20 70 54 6d 3b 0a 20 20 69 36 34 20 74 36 34 3b   pTm;.  i64 t64;
1c30: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
1c40: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
1c50: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
1c60: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
1c70: 74 65 54 69 6d 65 20 3d 20 74 36 34 20 26 20 30  teTime = t64 & 0
1c80: 78 46 46 46 46 46 46 46 46 3b 0a 20 20 75 54 6d  xFFFFFFFF;.  uTm
1c90: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
1ca0: 20 74 36 34 20 3e 3e 20 33 32 3b 0a 20 20 46 69   t64 >> 32;.  Fi
1cb0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
1cc0: 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29  eTime(&uTm,&lTm)
1cd0: 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 53 79  ;.  FileTimeToSy
1ce0: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
1cf0: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
1d00: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
1d10: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
1d20: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
1d30: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
1d40: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
1d50: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
1d60: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
1d70: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
1d80: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
1d90: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
1da0: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
1db0: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
1dc0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69 6c  ;.}../* This wil
1dd0: 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65  l never be calle
1de0: 64 2c 20 62 75 74 20 64 65 66 69 6e 65 64 20 74  d, but defined t
1df0: 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20  o make the code 
1e00: 63 6f 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66 69  compile */.#defi
1e10: 6e 65 20 47 65 74 54 65 6d 70 50 61 74 68 41 28  ne GetTempPathA(
1e20: 61 2c 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c 6f  a,b)..#define Lo
1e30: 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65  ckFile(a,b,c,d,e
1e40: 29 20 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63  )       winceLoc
1e50: 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20  kFile(&a, b, c, 
1e60: 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 55 6e  d, e).#define Un
1e70: 6c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64  lockFile(a,b,c,d
1e80: 2c 65 29 20 20 20 20 20 77 69 6e 63 65 55 6e 6c  ,e)     winceUnl
1e90: 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63  ockFile(&a, b, c
1ea0: 2c 20 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20  , d, e).#define 
1eb0: 4c 6f 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63  LockFileEx(a,b,c
1ec0: 2c 64 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c  ,d,e,f)   winceL
1ed0: 6f 63 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c  ockFileEx(&a, b,
1ee0: 20 63 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23 64   c, d, e, f)..#d
1ef0: 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
1f00: 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
1f10: 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
1f20: 5b 2d 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69  [-offsetof(winFi
1f30: 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63  le,h)]../*.** Ac
1f40: 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20  quire a lock on 
1f50: 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a  the handle h.*/.
1f60: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
1f70: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41  eMutexAcquire(HA
1f80: 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52  NDLE h){.   DWOR
1f90: 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b  D dwErr;.   do {
1fa0: 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 57 61  .     dwErr = Wa
1fb0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
1fc0: 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  t(h, INFINITE);.
1fd0: 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72     } while (dwEr
1fe0: 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54  r != WAIT_OBJECT
1ff0: 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57  _0 && dwErr != W
2000: 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a  AIT_ABANDONED);.
2010: 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  }./*.** Release 
2020: 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20  a lock acquired 
2030: 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  by winceMutexAcq
2040: 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  uire().*/.#defin
2050: 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65  e winceMutexRele
2060: 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75  ase(h) ReleaseMu
2070: 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72  tex(h)../*.** Cr
2080: 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  eate the mutex a
2090: 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  nd shared memory
20a0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
20b0: 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  g in the file.**
20c0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
20d0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
20e0: 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
20f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
2100: 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20  lename, winFile 
2110: 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43 48 41 52  *pFile){.  WCHAR
2120: 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20   *zTok;.  WCHAR 
2130: 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55  *zName = utf8ToU
2140: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
2150: 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  );.  BOOL bInit 
2160: 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e  = TRUE;..  /* In
2170: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
2180: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
2190: 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69   ZeroMemory(&pFi
21a0: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f  le->local, sizeo
21b0: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
21c0: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
21d0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
21e0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
21f0: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
2200: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
2210: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
2220: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72  */.  zTok = Char
2230: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
2240: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
2250: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
2260: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
2270: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
2280: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
2290: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
22a0: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
22b0: 65 78 20 3d 20 43 72 65 61 74 65 4d 75 74 65 78  ex = CreateMutex
22c0: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
22d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
22e0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
22f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
2300: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2310: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FALSE;.  }..  /*
2320: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
2330: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ex before contin
2340: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d  uing */.  winceM
2350: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
2360: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20  e->hMutex);.  . 
2370: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61   /* Since the na
2380: 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74  mes of named mut
2390: 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73  exes, semaphores
23a0: 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20  , file mappings 
23b0: 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61  etc are .  ** ca
23c0: 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61  se-sensitive, ta
23d0: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
23e0: 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73  that by uppercas
23f0: 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61  ing the mutex na
2400: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e  me.  ** and usin
2410: 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68  g that as the sh
2420: 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67  ared filemapping
2430: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68   name..  */.  Ch
2440: 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b  arUpperW(zName);
2450: 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  .  pFile->hShare
2460: 64 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61  d = CreateFileMa
2470: 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48  ppingW(INVALID_H
2480: 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c  ANDLE_VALUE, NUL
2490: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
24c0: 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
24d0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
2510: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
2520: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
2530: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
2540: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
2550: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
2560: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
2570: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
2580: 69 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72  if (GetLastError
2590: 28 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  () == ERROR_ALRE
25a0: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
25b0: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
25c0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72 65    }..  sqliteFre
25d0: 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  e(zName);..  /* 
25e0: 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  If we succeeded 
25f0: 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68  in making the sh
2600: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
2610: 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20  le, map it. */. 
2620: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61   if (pFile->hSha
2630: 72 65 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  red){.    pFile-
2640: 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65  >shared = (wince
2650: 4c 6f 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46  Lock*)MapViewOfF
2660: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
2670: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
2680: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
2690: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
26a0: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
26b0: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
26c0: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
26d0: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
26e0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
26f0: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
2700: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
2710: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
2720: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
2730: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
2740: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
2750: 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
2760: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
2770: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
2780: 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
2790: 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
27a0: 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
27b0: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
27c0: 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c  >hShared == NULL
27d0: 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  ){.    winceMute
27e0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
27f0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c 6f  hMutex);.    Clo
2800: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
2810: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
2820: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
2830: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
2840: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
2850: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2860: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
2870: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
2880: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
2890: 74 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65 6d  t) {.    ZeroMem
28a0: 6f 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  ory(pFile->share
28b0: 64 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  d, sizeof(winceL
28c0: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
28d0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
28e0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
28f0: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d    return TRUE;.}
2900: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
2910: 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
2920: 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
2930: 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
2940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2950: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
2960: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
2970: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
2980: 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
2990: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
29a0: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
29b0: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
29c0: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
29d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
29e0: 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
29f0: 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
2a00: 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
2a10: 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
2a20: 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
2a30: 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
2a40: 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
2a50: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
2a60: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
2a70: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
2a80: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
2a90: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
2aa0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
2ab0: 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
2ac0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
2ad0: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
2ae0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
2af0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
2b00: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
2b10: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
2b20: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
2b30: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
2b40: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
2b50: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
2b60: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
2b70: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
2b80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
2b90: 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
2ba0: 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
2bb0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
2bc0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55 6e  handle */.    Un
2bd0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
2be0: 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
2bf0: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
2c00: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
2c10: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
2c20: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
2c30: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
2c40: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
2c50: 78 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f 73  x);    .    Clos
2c60: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
2c70: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
2c80: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
2c90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
2ca0: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
2cb0: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
2cc0: 65 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64 6f  e() API of windo
2cd0: 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a  ws for wince.*/.
2ce0: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
2cf0: 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e  eLockFile(.  HAN
2d00: 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44  DLE *phFile,.  D
2d10: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
2d20: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
2d30: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
2d40: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
2d50: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
2d60: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
2d70: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
2d80: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
2d90: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
2da0: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
2db0: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
2dc0: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 69 66  n = FALSE;..  if
2dd0: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
2de0: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
2df0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
2e00: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
2e10: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
2e20: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2e30: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
2e40: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
2e50: 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20  SHARED_FIRST.   
2e60: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
2e70: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
2e80: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  = SHARED_SIZE){.
2e90: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
2ea0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
2eb0: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
2ec0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
2ed0: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
2ee0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
2ef0: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
2f00: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
2f10: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
2f20: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
2f30: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
2f40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2f50: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
2f60: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
2f70: 20 69 66 20 28 28 64 77 46 69 6c 65 4f 66 66 73   if ((dwFileOffs
2f80: 65 74 4c 6f 77 20 3e 3d 20 53 48 41 52 45 44 5f  etLow >= SHARED_
2f90: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
2fa0: 20 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65       dwFileOffse
2fb0: 74 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49  tLow < SHARED_FI
2fc0: 52 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a  RST + SHARED_SIZ
2fd0: 45 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  E) &&.          
2fe0: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
2ff0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3000: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3010: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
3020: 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
3030: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
3040: 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
3050: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3060: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
3070: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
3080: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
3090: 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
30a0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
30b0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
30c0: 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
30d0: 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
30e0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
30f0: 65 74 4c 6f 77 20 3d 3d 20 50 45 4e 44 49 4e 47  etLow == PENDING
3100: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
3110: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
3120: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49   == 1){.    /* I
3130: 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63  f no pending loc
3140: 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69  k has been acqui
3150: 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72  red, then acquir
3160: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  e it */.    if (
3170: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3180: 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a  Pending == 0) {.
3190: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
31a0: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
31b0: 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
31c0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
31d0: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
31e0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
31f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 57      }.  }.  /* W
3200: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
3210: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
3220: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
3230: 6f 77 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 42  ow == RESERVED_B
3240: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
3250: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
3260: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
3270: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
3280: 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20  served == 0) {. 
3290: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
32a0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
32b0: 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
32c0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
32d0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
32e0: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
32f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
3300: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
3310: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
3320: 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
3330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  ;.}../*.** An im
3340: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3350: 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41  the UnlockFile A
3360: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
3370: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
3380: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f  c BOOL winceUnlo
3390: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45  ckFile(.  HANDLE
33a0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
33b0: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
33c0: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
33d0: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
33e0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
33f0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a  tesToUnlockLow,.
3400: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
3410: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
3420: 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
3430: 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
3440: 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
3450: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
3460: 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 69  rn = FALSE;..  i
3470: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
3480: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
3490: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
34a0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
34b0: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
34c0: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
34d0: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
34e0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
34f0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3500: 3e 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  >= SHARED_FIRST 
3510: 26 26 0a 20 20 20 20 20 20 20 64 77 46 69 6c 65  &&.       dwFile
3520: 4f 66 66 73 65 74 4c 6f 77 20 3c 20 53 48 41 52  OffsetLow < SHAR
3530: 45 44 5f 46 49 52 53 54 20 2b 20 53 48 41 52 45  ED_FIRST + SHARE
3540: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 2f 2a 20  D_SIZE){.    /* 
3550: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
3560: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
3570: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
3580: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
3590: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
35a0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
35b0: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
35c0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
35d0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
35e0: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
35f0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3600: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
3610: 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
3620: 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
3630: 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
3640: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
3650: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
3660: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
3670: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
3680: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
3690: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
36a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
36b0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
36c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36d0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
36e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36f0: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
3700: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
3710: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
3720: 73 65 74 4c 6f 77 20 3d 3d 20 50 45 4e 44 49 4e  setLow == PENDIN
3730: 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65  G_BYTE && nNumbe
3740: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
3750: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
3760: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3770: 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
3780: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
3790: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
37a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
37b0: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
37c0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
37d0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
37e0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
37f0: 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
3800: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
3810: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
3820: 4c 6f 77 20 3d 3d 20 52 45 53 45 52 56 45 44 5f  Low == RESERVED_
3830: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
3840: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
3850: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
3860: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
3870: 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20  eserved) {.     
3880: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
3890: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
38a0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
38b0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
38c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
38d0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
38e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63     }.  }..  winc
38f0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
3900: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
3910: 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a  return bReturn;.
3920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
3930: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3940: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
3950: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
3960: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
3970: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
3980: 46 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45  FileEx(.  HANDLE
3990: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
39a0: 44 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f  D dwFlags,.  DWO
39b0: 52 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20  RD dwReserved,. 
39c0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
39d0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
39e0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
39f0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
3a00: 2c 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44  ,.  LPOVERLAPPED
3a10: 20 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b   lpOverlapped.){
3a20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
3a30: 6c 65 72 20 77 61 6e 74 73 20 61 20 73 68 61 72  ler wants a shar
3a40: 65 64 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f  ed read lock, fo
3a50: 72 77 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a  rward this call.
3a60: 20 20 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63    ** to winceLoc
3a70: 6b 46 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c  kFile */.  if (l
3a80: 70 4f 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66  pOverlapped->Off
3a90: 73 65 74 20 3d 3d 20 53 48 41 52 45 44 5f 46 49  set == SHARED_FI
3aa0: 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46  RST &&.      dwF
3ab0: 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20  lags == 1 &&.   
3ac0: 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
3ad0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48  sToLockLow == SH
3ae0: 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20  ARED_SIZE){.    
3af0: 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b  return winceLock
3b00: 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 53 48 41  File(phFile, SHA
3b10: 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
3b20: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
3b30: 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a  n FALSE;.}./*.**
3b40: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63   End of the spec
3b50: 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e  ial code for win
3b60: 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
3b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bb0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  /.#endif /* OS_W
3bc0: 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  INCE */../*.** C
3bd0: 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
3be0: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
3bf0: 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
3c00: 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
3c10: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
3c20: 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
3c30: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
3c40: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
3c50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3c60: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 20 61 6e 64  sqliteMalloc and
3c70: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
3c80: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
3c90: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
3ca0: 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65  atic void *conve
3cb0: 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  rtUtf8Filename(c
3cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3cd0: 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a  name){.  void *z
3ce0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
3cf0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
3d00: 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
3d10: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  utf8ToUnicode(zF
3d20: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
3d30: 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
3d40: 64 20 3d 20 75 74 66 38 54 6f 4d 62 63 73 28 7a  d = utf8ToMbcs(z
3d50: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
3d60: 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
3d70: 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
3d80: 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
3d90: 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
3da0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
3db0: 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
3dc0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 6e  ** Note that win
3dd0: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
3de0: 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
3df0: 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
3e00: 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
3e10: 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
3e20: 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
3e30: 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
3e40: 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
3e50: 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
3e60: 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
3e70: 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
3e80: 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
3e90: 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
3ea0: 20 69 74 20 69 73 20 69 74 20 64 6f 65 73 2e 20   it is it does. 
3eb0: 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
3ec0: 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
3ed0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
3ee0: 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
3ef0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
3f00: 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
3f10: 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
3f20: 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
3f30: 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
3f40: 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
3f50: 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
3f60: 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
3f70: 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
3f80: 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
3f90: 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
3fa0: 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
3fb0: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
3fc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 44 45  */.#define MX_DE
3fd0: 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20  LETION_ATTEMPTS 
3fe0: 33 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  3.int sqlite3Win
3ff0: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
4000: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
4010: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4020: 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a  int rc;.  void *
4030: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
4040: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
4050: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
4060: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
4070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4080: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
4090: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
40a0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72  .    do{.      r
40b0: 63 20 3d 20 44 65 6c 65 74 65 46 69 6c 65 57 28  c = DeleteFileW(
40c0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
40d0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
40e0: 26 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  & GetFileAttribu
40f0: 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
4100: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
4110: 20 20 20 20 20 20 20 20 20 20 26 26 20 63 6e 74            && cnt
4120: 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  ++ < MX_DELETION
4130: 5f 41 54 54 45 4d 50 54 53 20 26 26 20 28 53 6c  _ATTEMPTS && (Sl
4140: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
4150: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f    }else{.#if OS_
4160: 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e  WINCE.    return
4170: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23   SQLITE_NOMEM;.#
4180: 65 6c 73 65 0a 20 20 20 20 64 6f 7b 0a 20 20 20  else.    do{.   
4190: 20 20 20 72 63 20 3d 20 44 65 6c 65 74 65 46 69     rc = DeleteFi
41a0: 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  leA(zConverted);
41b0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
41c0: 3d 30 20 26 26 20 47 65 74 46 69 6c 65 41 74 74  =0 && GetFileAtt
41d0: 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
41e0: 74 65 64 29 21 3d 30 78 66 66 66 66 66 66 66 66  ted)!=0xffffffff
41f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
4200: 63 6e 74 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45 54  cnt++ < MX_DELET
4210: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 26 26 20  ION_ATTEMPTS && 
4220: 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  (Sleep(100), 1) 
4230: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
4240: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76  sqliteFree(zConv
4250: 65 72 74 65 64 29 3b 0a 20 20 54 52 41 43 45 32  erted);.  TRACE2
4260: 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c  ("DELETE \"%s\"\
4270: 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  n", zFilename);.
4280: 20 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f    return rc!=0 ?
4290: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
42a0: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a  ITE_IOERR;.}../*
42b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
42c0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
42d0: 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74  e exists..*/.int
42e0: 20 73 71 6c 69 74 65 33 57 69 6e 46 69 6c 65 45   sqlite3WinFileE
42f0: 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72  xists(const char
4300: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
4310: 69 6e 74 20 65 78 69 73 74 73 20 3d 20 30 3b 0a  int exists = 0;.
4320: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
4330: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
4340: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
4350: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
4360: 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
4370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4380: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
4390: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 65 78 69  sNT() ){.    exi
43a0: 73 74 73 20 3d 20 47 65 74 46 69 6c 65 41 74 74  sts = GetFileAtt
43b0: 72 69 62 75 74 65 73 57 28 28 57 43 48 41 52 2a  ributesW((WCHAR*
43c0: 29 7a 43 6f 6e 76 65 72 74 65 64 29 20 21 3d 20  )zConverted) != 
43d0: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65  0xffffffff;.  }e
43e0: 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  lse{.#if OS_WINC
43f0: 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  E.    return SQL
4400: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65  ITE_NOMEM;.#else
4410: 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65  .    exists = Ge
4420: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
4430: 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
4440: 65 64 29 20 21 3d 20 30 78 66 66 66 66 66 66 66  ed) != 0xfffffff
4450: 66 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  f;.#endif.  }.  
4460: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76  sqliteFree(zConv
4470: 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
4480: 20 65 78 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 20 46   exists;.}../* F
4490: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
44a0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
44b0: 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65   allocateWinFile
44c0: 28 77 69 6e 46 69 6c 65 20 2a 70 49 6e 69 74 2c  (winFile *pInit,
44d0: 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 3b 0a   OsFile **pId);.
44e0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
44f0: 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f  o open a file fo
4500: 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
4510: 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20  nd writing.  If 
4520: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74  that.** fails, t
4530: 72 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65  ry opening it re
4540: 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65  ad-only.  If the
4550: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
4560: 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20  xist,.** try to 
4570: 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  create it..**.**
4580: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
4590: 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70  andle for the op
45a0: 65 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74  en file is writt
45b0: 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64  en to *id.** and
45c0: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73   *pReadonly is s
45d0: 65 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 66  et to 0 if the f
45e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66  ile was opened f
45f0: 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a  or reading and.*
4600: 2a 20 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69  * writing or 1 i
4610: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  f the file was o
4620: 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
4630: 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72    The function r
4640: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
4650: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
4660: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
4670: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
4680: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
4690: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e  leaves.** *id an
46a0: 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63  d *pReadonly unc
46b0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
46c0: 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52 65 61  qlite3WinOpenRea
46d0: 64 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20  dWrite(.  const 
46e0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
46f0: 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c  .  OsFile **pId,
4700: 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c  .  int *pReadonl
4710: 79 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 66  y.){.  winFile f
4720: 3b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  ;.  HANDLE h;.  
4730: 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
4740: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
4750: 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
4760: 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
4770: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
4780: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
4790: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
47a0: 20 2a 70 49 64 3d 3d 30 20 29 3b 0a 0a 20 20 69   *pId==0 );..  i
47b0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
47c0: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57   h = CreateFileW
47d0: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
47e0: 74 65 64 2c 0a 20 20 20 20 20 20 20 47 45 4e 45  ted,.       GENE
47f0: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
4800: 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20  IC_WRITE,.      
4810: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
4820: 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
4830: 49 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  ITE,.       NULL
4840: 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c  ,.       OPEN_AL
4850: 57 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c  WAYS,.       FIL
4860: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
4870: 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  AL | FILE_FLAG_R
4880: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20  ANDOM_ACCESS,.  
4890: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b       NULL.    );
48a0: 0a 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  .    if( h==INVA
48b0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
48c0: 20 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72   ){.      h = Cr
48d0: 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41 52  eateFileW((WCHAR
48e0: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
48f0: 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52         GENERIC_R
4900: 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 46 49  EAD,.         FI
4910: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
4920: 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
4930: 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  ,.         NULL,
4940: 0a 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41  .         OPEN_A
4950: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20  LWAYS,.         
4960: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
4970: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
4980: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
4990: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  .         NULL. 
49a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
49b0: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
49c0: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
49d0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
49e0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
49f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
4a00: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
4a10: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 65 61     }.      *pRea
4a20: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
4a30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 65  else{.      *pRe
4a40: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
4a50: 7d 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  }.#if OS_WINCE. 
4a60: 20 20 20 69 66 20 28 21 77 69 6e 63 65 43 72 65     if (!winceCre
4a70: 61 74 65 4c 6f 63 6b 28 7a 46 69 6c 65 6e 61 6d  ateLock(zFilenam
4a80: 65 2c 20 26 66 29 29 7b 0a 20 20 20 20 20 20 43  e, &f)){.      C
4a90: 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
4aa0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4ab0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
4ac0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4ad0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
4ae0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
4af0: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
4b00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4b10: 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20  NOMEM;.#else.   
4b20: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41   h = CreateFileA
4b30: 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
4b40: 65 64 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52  ed,.       GENER
4b50: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
4b60: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  C_WRITE,.       
4b70: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
4b80: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
4b90: 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c  TE,.       NULL,
4ba0: 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57  .       OPEN_ALW
4bb0: 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45  AYS,.       FILE
4bc0: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
4bd0: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
4be0: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
4bf0: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
4c00: 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c      if( h==INVAL
4c10: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
4c20: 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65  ){.      h = Cre
4c30: 61 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a 29  ateFileA((char*)
4c40: 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
4c50: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
4c60: 44 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45  D,.         FILE
4c70: 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
4c80: 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a  LE_SHARE_WRITE,.
4c90: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
4ca0: 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57          OPEN_ALW
4cb0: 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46 49  AYS,.         FI
4cc0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
4cd0: 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f  MAL | FILE_FLAG_
4ce0: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20  RANDOM_ACCESS,. 
4cf0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20          NULL.   
4d00: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
4d10: 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
4d20: 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
4d30: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43     sqliteFree(zC
4d40: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
4d50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4d60: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
4d70: 20 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f   }.      *pReado
4d80: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  nly = 1;.    }el
4d90: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61 64  se{.      *pRead
4da0: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  only = 0;.    }.
4db0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e  #endif /* OS_WIN
4dc0: 43 45 20 2a 2f 0a 20 20 7d 0a 0a 20 20 73 71 6c  CE */.  }..  sql
4dd0: 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72 74  iteFree(zConvert
4de0: 65 64 29 3b 0a 0a 20 20 66 2e 68 20 3d 20 68 3b  ed);..  f.h = h;
4df0: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
4e00: 66 2e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  f.zDeleteOnClose
4e10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 54   = 0;.#endif.  T
4e20: 52 41 43 45 33 28 22 4f 50 45 4e 20 52 2f 57 20  RACE3("OPEN R/W 
4e30: 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c  %d \"%s\"\n", h,
4e40: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72   zFilename);.  r
4e50: 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 57 69  eturn allocateWi
4e60: 6e 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a  nFile(&f, pId);.
4e70: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  }.../*.** Attemp
4e80: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
4e90: 66 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69  file for exclusi
4ea0: 76 65 20 61 63 63 65 73 73 20 62 79 20 74 68 69  ve access by thi
4eb0: 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68  s process..** Th
4ec0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  e file will be o
4ed0: 70 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72  pened for both r
4ee0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
4ef0: 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a  ng.  To avoid.**
4f00: 20 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63   a potential sec
4f10: 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77  urity problem, w
4f20: 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74  e do not allow t
4f30: 68 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a  he file to have.
4f40: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  ** previously ex
4f50: 69 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77  isted.  Nor do w
4f60: 65 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65  e allow the file
4f70: 20 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69   to be a symboli
4f80: 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a  c.** link..**.**
4f90: 20 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74   If delFlag is t
4fa0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  rue, then make a
4fb0: 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61  rrangements to a
4fc0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
4fd0: 65 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ete.** the file 
4fe0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
4ff0: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  d..**.** On succ
5000: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66  ess, write the f
5010: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20  ile handle into 
5020: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *id and return S
5030: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
5040: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75  On failure, retu
5050: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
5060: 45 4e 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  EN..**.** Someti
5070: 6d 65 73 20 69 66 20 77 65 20 68 61 76 65 20 6a  mes if we have j
5080: 75 73 74 20 64 65 6c 65 74 65 64 20 61 20 70 72  ust deleted a pr
5090: 69 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ior journal file
50a0: 2c 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 77 69 6c  , windows.** wil
50b0: 6c 20 66 61 69 6c 20 74 6f 20 6f 70 65 6e 20 61  l fail to open a
50c0: 20 6e 65 77 20 6f 6e 65 20 62 65 63 61 75 73 65   new one because
50d0: 20 74 68 65 72 65 20 69 73 20 61 20 22 70 65 6e   there is a "pen
50e0: 64 69 6e 67 20 64 65 6c 65 74 65 22 2e 0a 2a 2a  ding delete"..**
50f0: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
5100: 74 68 69 73 20 62 75 67 2c 20 77 65 20 70 61 75  this bug, we pau
5110: 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
5120: 73 65 63 6f 6e 64 73 20 61 6e 64 20 61 74 74 65  seconds and atte
5130: 6d 70 74 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20  mpt.** a second 
5140: 6f 70 65 6e 20 61 66 74 65 72 20 74 68 65 20 66  open after the f
5150: 69 72 73 74 20 6f 6e 65 20 66 61 69 6c 73 2e 20  irst one fails. 
5160: 20 54 68 65 20 77 68 6f 6c 65 20 6f 70 65 72 61   The whole opera
5170: 74 69 6f 6e 20 6f 6e 6c 79 0a 2a 2a 20 66 61 69  tion only.** fai
5180: 6c 73 20 69 66 20 62 6f 74 68 20 6f 70 65 6e 20  ls if both open 
5190: 61 74 74 65 6d 70 74 73 20 61 72 65 20 75 6e 73  attempts are uns
51a0: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
51b0: 74 20 73 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e  t sqlite3WinOpen
51c0: 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20  Exclusive(const 
51d0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
51e0: 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69   OsFile **pId, i
51f0: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 77  nt delFlag){.  w
5200: 69 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44  inFile f;.  HAND
5210: 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 66 69  LE h;.  DWORD fi
5220: 6c 65 66 6c 61 67 73 3b 0a 20 20 76 6f 69 64 20  leflags;.  void 
5230: 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
5240: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
5250: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
5260: 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
5270: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5280: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5290: 7d 0a 20 20 61 73 73 65 72 74 28 20 2a 70 49 64  }.  assert( *pId
52a0: 20 3d 3d 20 30 20 29 3b 0a 20 20 66 69 6c 65 66   == 0 );.  filef
52b0: 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47  lags = FILE_FLAG
52c0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
52d0: 23 69 66 20 21 4f 53 5f 57 49 4e 43 45 0a 20 20  #if !OS_WINCE.  
52e0: 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20  if( delFlag ){. 
52f0: 20 20 20 66 69 6c 65 66 6c 61 67 73 20 7c 3d 20     fileflags |= 
5300: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
5310: 45 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f  EMPORARY | FILE_
5320: 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
5330: 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LOSE;.  }.#endif
5340: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
5350: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
5360: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
5370: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
5380: 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
5390: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 47 45 4e  ed,.         GEN
53a0: 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
53b0: 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  RIC_WRITE,.     
53c0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
53d0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 43  NULL,.         C
53e0: 52 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20  REATE_ALWAYS,.  
53f0: 20 20 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73         fileflags
5400: 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a  ,.         NULL.
5410: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 77 68        );.    }wh
5420: 69 6c 65 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f  ile( h==INVALID_
5430: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 20  HANDLE_VALUE && 
5440: 63 6e 74 2b 2b 20 3c 20 32 20 26 26 20 28 53 6c  cnt++ < 2 && (Sl
5450: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
5460: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f    }else{.#if OS_
5470: 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e  WINCE.    return
5480: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23   SQLITE_NOMEM;.#
5490: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 63 6e 74  else.    int cnt
54a0: 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   = 0;.    do{.  
54b0: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
54c0: 6c 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  leA((char*)zConv
54d0: 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 47  erted,.        G
54e0: 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
54f0: 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20  NERIC_WRITE,.   
5500: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
5510: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 43 52  NULL,.        CR
5520: 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20  EATE_ALWAYS,.   
5530: 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a       fileflags,.
5540: 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20          NULL.   
5550: 20 20 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65     );.    }while
5560: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
5570: 44 4c 45 5f 56 41 4c 55 45 20 26 26 20 63 6e 74  DLE_VALUE && cnt
5580: 2b 2b 20 3c 20 32 20 26 26 20 28 53 6c 65 65 70  ++ < 2 && (Sleep
5590: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e  (100), 1) );.#en
55a0: 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 43 45 20  dif /* OS_WINCE 
55b0: 2a 2f 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  */.  }.  sqliteF
55c0: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
55d0: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
55e0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
55f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5600: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
5610: 7d 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 23 69 66  }.  f.h = h;.#if
5620: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 66 2e 7a 44   OS_WINCE.  f.zD
5630: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 64  eleteOnClose = d
5640: 65 6c 46 6c 61 67 20 3f 20 75 74 66 38 54 6f 55  elFlag ? utf8ToU
5650: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
5660: 29 20 3a 20 30 3b 0a 20 20 66 2e 68 4d 75 74 65  ) : 0;.  f.hMute
5670: 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  x = NULL;.#endif
5680: 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20  .  TRACE3("OPEN 
5690: 45 58 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  EX %d \"%s\"\n",
56a0: 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a   h, zFilename);.
56b0: 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74    return allocat
56c0: 65 57 69 6e 46 69 6c 65 28 26 66 2c 20 70 49 64  eWinFile(&f, pId
56d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  );.}../*.** Atte
56e0: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  mpt to open a ne
56f0: 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d  w file for read-
5700: 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a  only access..**.
5710: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
5720: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
5730: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
5740: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
5750: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
5760: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
5770: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
5780: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 4f  .int sqlite3WinO
5790: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73  penReadOnly(cons
57a0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
57b0: 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  e, OsFile **pId)
57c0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 66 3b 0a 20  {.  winFile f;. 
57d0: 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69   HANDLE h;.  voi
57e0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
57f0: 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
5800: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
5810: 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
5820: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5830: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5840: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 2a 70    }.  assert( *p
5850: 49 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  Id==0 );.  if( i
5860: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d  sNT() ){.    h =
5870: 20 43 72 65 61 74 65 46 69 6c 65 57 28 28 57 43   CreateFileW((WC
5880: 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
5890: 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f  .       GENERIC_
58a0: 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30 2c 0a  READ,.       0,.
58b0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
58c0: 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e      OPEN_EXISTIN
58d0: 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41  G,.       FILE_A
58e0: 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20  TTRIBUTE_NORMAL 
58f0: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  | FILE_FLAG_RAND
5900: 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20  OM_ACCESS,.     
5910: 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20    NULL.    );.  
5920: 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49  }else{.#if OS_WI
5930: 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53  NCE.    return S
5940: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c  QLITE_NOMEM;.#el
5950: 73 65 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  se.    h = Creat
5960: 65 46 69 6c 65 41 28 28 63 68 61 72 2a 29 7a 43  eFileA((char*)zC
5970: 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
5980: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20   GENERIC_READ,. 
5990: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
59a0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45  NULL,.       OPE
59b0: 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20  N_EXISTING,.    
59c0: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
59d0: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
59e0: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
59f0: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
5a00: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
5a10: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
5a20: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 69 66  Converted);.  if
5a30: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
5a40: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
5a50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
5a60: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66  ANTOPEN;.  }.  f
5a70: 2e 68 20 3d 20 68 3b 0a 23 69 66 20 4f 53 5f 57  .h = h;.#if OS_W
5a80: 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65 74 65  INCE.  f.zDelete
5a90: 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 66  OnClose = 0;.  f
5aa0: 2e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  .hMutex = NULL;.
5ab0: 23 65 6e 64 69 66 0a 20 20 54 52 41 43 45 33 28  #endif.  TRACE3(
5ac0: 22 4f 50 45 4e 20 52 4f 20 25 64 20 5c 22 25 73  "OPEN RO %d \"%s
5ad0: 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  \"\n", h, zFilen
5ae0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ame);.  return a
5af0: 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28 26  llocateWinFile(&
5b00: 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  f, pId);.}../*.*
5b10: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
5b20: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
5b30: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
5b40: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
5b50: 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20  ins a.** file.  
5b60: 54 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  This file descri
5b70: 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  ptor can be used
5b80: 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20   to fsync() the 
5b90: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20  directory.** in 
5ba0: 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75  order to make su
5bb0: 72 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  re the creation 
5bc0: 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  of a new file is
5bd0: 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
5be0: 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  n.** to disk..**
5bf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5c00: 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67   is only meaning
5c10: 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49  ful for Unix.  I
5c20: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64  t is a no-op und
5c30: 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69  er.** windows si
5c40: 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73  nce windows does
5c50: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72   not support har
5c60: 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4f  d links..**.** O
5c70: 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e  n success, a han
5c80: 64 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f  dle for a previo
5c90: 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20 69  usly open file i
5ca0: 73 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  s at *id is.** u
5cb0: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
5cc0: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
5cd0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
5ce0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
5cf0: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
5d00: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
5d10: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
5d20: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
5d30: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
5d40: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
5d50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
5d60: 6e 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a  nOpenDirectory(.
5d70: 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20    OsFile *id,.  
5d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
5d90: 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e  name.){.  return
5da0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5db0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c  *.** If the foll
5dc0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
5dd0: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
5de0: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69  a string which i
5df0: 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
5e00: 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68   a directory, th
5e10: 65 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  en that director
5e20: 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  y will be used t
5e30: 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f  o store.** tempo
5e40: 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63  rary files..*/.c
5e50: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
5e60: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
5e70: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
5e80: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
5e90: 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
5ea0: 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20  Buf must be big 
5eb0: 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c  enough to.** hol
5ec0: 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  d at least SQLIT
5ed0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
5ee0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 69  characters..*/.i
5ef0: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 54 65 6d  nt sqlite3WinTem
5f00: 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a  pFileName(char *
5f10: 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
5f20: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
5f30: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
5f40: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
5f50: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
5f60: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
5f70: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
5f80: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
5f90: 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68    char zTempPath
5fa0: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
5fb0: 5f 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20 73 71  _SIZE];.  if( sq
5fc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
5fd0: 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 74 72 6e  tory ){.    strn
5fe0: 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 73  cpy(zTempPath, s
5ff0: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
6000: 63 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f 54 45  ctory, SQLITE_TE
6010: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b  MPNAME_SIZE-30);
6020: 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 53  .    zTempPath[S
6030: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
6040: 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 7d  IZE-30] = 0;.  }
6050: 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20  else if( isNT() 
6060: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
6070: 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a  lti;.    WCHAR z
6080: 57 69 64 65 50 61 74 68 5b 53 51 4c 49 54 45 5f  WidePath[SQLITE_
6090: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
60a0: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 57      GetTempPathW
60b0: 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  (SQLITE_TEMPNAME
60c0: 5f 53 49 5a 45 2d 33 30 2c 20 7a 57 69 64 65 50  _SIZE-30, zWideP
60d0: 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69  ath);.    zMulti
60e0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
60f0: 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
6100: 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
6110: 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a 54 65       strncpy(zTe
6120: 6d 70 50 61 74 68 2c 20 7a 4d 75 6c 74 69 2c 20  mpPath, zMulti, 
6130: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
6140: 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20 20 20  SIZE-30);.      
6150: 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45  zTempPath[SQLITE
6160: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33  _TEMPNAME_SIZE-3
6170: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  0] = 0;.      sq
6180: 6c 69 74 65 46 72 65 65 28 7a 4d 75 6c 74 69 29  liteFree(zMulti)
6190: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
61a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
61b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
61c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
61d0: 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
61e0: 20 7a 4d 62 63 73 50 61 74 68 5b 53 51 4c 49 54   zMbcsPath[SQLIT
61f0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
6200: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
6210: 68 41 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  hA(SQLITE_TEMPNA
6220: 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 4d 62 63  ME_SIZE-30, zMbc
6230: 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66  sPath);.    zUtf
6240: 38 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28 7a  8 = mbcsToUtf8(z
6250: 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
6260: 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
6270: 20 20 73 74 72 6e 63 70 79 28 7a 54 65 6d 70 50    strncpy(zTempP
6280: 61 74 68 2c 20 7a 55 74 66 38 2c 20 53 51 4c 49  ath, zUtf8, SQLI
6290: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
62a0: 2d 33 30 29 3b 0a 20 20 20 20 20 20 7a 54 65 6d  -30);.      zTem
62b0: 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d  pPath[SQLITE_TEM
62c0: 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 5d 20 3d  PNAME_SIZE-30] =
62d0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
62e0: 46 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  Free(zUtf8);.   
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
6300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6310: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  M;.    }.  }.  f
6320: 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d  or(i=strlen(zTem
6330: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
6340: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
6350: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
6360: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
6370: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73    for(;;){.    s
6380: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73  printf(zBuf, "%s
6390: 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  \\"TEMP_FILE_PRE
63a0: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b  FIX, zTempPath);
63b0: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
63c0: 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
63d0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  e3Randomness(15,
63e0: 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
63f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
6400: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
6410: 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
6420: 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
6430: 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
6440: 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
6450: 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
6460: 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
6470: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73    if( !sqlite3Os
6480: 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75 66 29  FileExists(zBuf)
6490: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
64a0: 54 52 41 43 45 32 28 22 54 45 4d 50 20 46 49 4c  TRACE2("TEMP FIL
64b0: 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42  ENAME: %s\n", zB
64c0: 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  uf);.  return SQ
64d0: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
64e0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
64f0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
6500: 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
6510: 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
6520: 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
6530: 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
6540: 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
6550: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
6560: 73 75 6c 74 2c 20 62 75 74 20 77 69 6e 64 6f 77  sult, but window
6570: 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
6580: 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
6590: 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
65a0: 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
65b0: 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
65c0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
65d0: 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
65e0: 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
65f0: 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
6600: 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
6610: 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
6620: 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
6630: 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
6640: 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
6650: 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
6660: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
6670: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
6680: 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
6690: 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
66a0: 20 77 69 6e 43 6c 6f 73 65 28 4f 73 46 69 6c 65   winClose(OsFile
66b0: 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e 46 69   **pId){.  winFi
66c0: 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le *pFile;.  int
66d0: 20 72 63 20 3d 20 31 3b 0a 20 20 69 66 28 20 70   rc = 1;.  if( p
66e0: 49 64 20 26 26 20 28 70 46 69 6c 65 20 3d 20 28  Id && (pFile = (
66f0: 77 69 6e 46 69 6c 65 2a 29 2a 70 49 64 29 21 3d  winFile*)*pId)!=
6700: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c  0 ){.    int rc,
6710: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 54 52   cnt = 0;.    TR
6720: 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
6730: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
6740: 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d    do{.      rc =
6750: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
6760: 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 7d 77 68 69  le->h);.    }whi
6770: 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 63 6e 74  le( rc==0 && cnt
6780: 2b 2b 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  ++ < MX_CLOSE_AT
6790: 54 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70 28  TEMPT && (Sleep(
67a0: 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20  100), 1) );.#if 
67b0: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 77 69 6e  OS_WINCE.    win
67c0: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
67d0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ile);.    if( pF
67e0: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
67f0: 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 44 65 6c  ose ){.      Del
6800: 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
6810: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
6820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6830: 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  e(pFile->zDelete
6840: 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 7d 0a  OnClose);.    }.
6850: 23 65 6e 64 69 66 0a 20 20 20 20 4f 70 65 6e 43  #endif.    OpenC
6860: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20  ounter(-1);.    
6870: 73 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65  sqliteFree(pFile
6880: 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30 3b  );.    *pId = 0;
6890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
68a0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
68b0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a  QLITE_IOERR;.}..
68c0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
68d0: 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
68e0: 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
68f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
6900: 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
6910: 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
6920: 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
6930: 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
6940: 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
6950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6960: 6e 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64  nRead(OsFile *id
6970: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
6980: 74 20 61 6d 74 29 7b 0a 20 20 44 57 4f 52 44 20  t amt){.  DWORD 
6990: 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
69a0: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
69b0: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
69c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a   SQLITE_IOERR);.
69d0: 20 20 54 52 41 43 45 33 28 22 52 45 41 44 20 25    TRACE3("READ %
69e0: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28  d lock=%d\n", ((
69f0: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  winFile*)id)->h,
6a00: 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d   ((winFile*)id)-
6a10: 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69 66  >locktype);.  if
6a20: 28 20 21 52 65 61 64 46 69 6c 65 28 28 28 77 69  ( !ReadFile(((wi
6a30: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 70  nFile*)id)->h, p
6a40: 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20  Buf, amt, &got, 
6a50: 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20  0) ){.    got = 
6a60: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f  -1;.  }.  if( go
6a70: 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  t==(DWORD)amt ){
6a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6a90: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
6aa0: 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
6ab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6ac0: 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
6ad0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
6ae0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
6af0: 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
6b00: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
6b10: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
6b20: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
6b30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
6b40: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
6b50: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
6b60: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
6b70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6b80: 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64  Write(OsFile *id
6b90: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
6ba0: 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20  uf, int amt){.  
6bb0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
6bc0: 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73  ORD wrote;.  ass
6bd0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
6be0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
6bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6c00: 45 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ERR);.  Simulate
6c10: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
6c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
6c30: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 57 52 49  );.  TRACE3("WRI
6c40: 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  TE %d lock=%d\n"
6c50: 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  , ((winFile*)id)
6c60: 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29  ->h, ((winFile*)
6c70: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a  id)->locktype);.
6c80: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
6c90: 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  );.  while( amt>
6ca0: 30 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65  0 && (rc = Write
6cb0: 46 69 6c 65 28 28 28 77 69 6e 46 69 6c 65 2a 29  File(((winFile*)
6cc0: 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  id)->h, pBuf, am
6cd0: 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21 3d  t, &wrote, 0))!=
6ce0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 77 72  0.         && wr
6cf0: 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  ote>0 ){.    amt
6d00: 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   -= wrote;.    p
6d10: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
6d20: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
6d30: 0a 20 20 69 66 28 20 21 72 63 20 7c 7c 20 61 6d  .  if( !rc || am
6d40: 74 3e 28 69 6e 74 29 77 72 6f 74 65 20 29 7b 0a  t>(int)wrote ){.
6d50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6d60: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
6d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69  }../*.** Some mi
6d90: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
6da0: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
6db0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
6dc0: 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ef INVALID_SET_F
6dd0: 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65  ILE_POINTER.# de
6de0: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54  fine INVALID_SET
6df0: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28  _FILE_POINTER ((
6e00: 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66  DWORD)-1).#endif
6e10: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
6e20: 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69 6e   read/write poin
6e30: 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a  ter in a file..*
6e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6e50: 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Seek(OsFile *id,
6e60: 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a 20 20   i64 offset){.  
6e70: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d  LONG upperBits =
6e80: 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a 20 20 4c   offset>>32;.  L
6e90: 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ONG lowerBits = 
6ea0: 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
6eb0: 66 66 66 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b  fff;.  DWORD rc;
6ec0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
6ed0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
6ee0: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66 66  E_TEST.  if( off
6ef0: 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44 69  set ) SimulateDi
6f00: 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
6f10: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
6f20: 0a 23 65 6e 64 69 66 0a 20 20 53 45 45 4b 28 6f  .#endif.  SEEK(o
6f30: 66 66 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b  ffset/1024 + 1);
6f40: 0a 20 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50  .  rc = SetFileP
6f50: 6f 69 6e 74 65 72 28 28 28 77 69 6e 46 69 6c 65  ointer(((winFile
6f60: 2a 29 69 64 29 2d 3e 68 2c 20 6c 6f 77 65 72 42  *)id)->h, lowerB
6f70: 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c  its, &upperBits,
6f80: 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20   FILE_BEGIN);.  
6f90: 54 52 41 43 45 33 28 22 53 45 45 4b 20 25 64 20  TRACE3("SEEK %d 
6fa0: 25 6c 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69  %lld\n", ((winFi
6fb0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6f 66 66 73  le*)id)->h, offs
6fc0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49  et);.  if( rc==I
6fd0: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
6fe0: 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61  POINTER && GetLa
6ff0: 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52  stError()!=NO_ER
7000: 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ROR ){.    retur
7010: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
7020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7030: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7040: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
7050: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
7060: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
7070: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
7080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7090: 69 6e 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69  inSync(OsFile *i
70a0: 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  d, int dataOnly)
70b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  {.  assert( id!=
70c0: 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22 53  0 );.  TRACE3("S
70d0: 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  YNC %d lock=%d\n
70e0: 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  ", ((winFile*)id
70f0: 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c 65 2a  )->h, ((winFile*
7100: 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b  )id)->locktype);
7110: 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65  .  if( FlushFile
7120: 42 75 66 66 65 72 73 28 28 28 77 69 6e 46 69 6c  Buffers(((winFil
7130: 65 2a 29 69 64 29 2d 3e 68 29 20 29 7b 0a 20 20  e*)id)->h) ){.  
7140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7150: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
7160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7170: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
7180: 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69 72 65  ** Sync the dire
7190: 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20  ctory zDirname. 
71a0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
71b0: 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  on operating sys
71c0: 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68  tems other.** th
71d0: 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e 74 20  an UNIX..*/.int 
71e0: 73 71 6c 69 74 65 33 57 69 6e 53 79 6e 63 44 69  sqlite3WinSyncDi
71f0: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
7200: 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20  ar *zDirname){. 
7210: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7220: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
7230: 4f 45 52 52 29 3b 0a 20 20 72 65 74 75 72 6e 20  OERR);.  return 
7240: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7250: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
7260: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
7270: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
7280: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54  .static int winT
7290: 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a  runcate(OsFile *
72a0: 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
72b0: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
72c0: 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a 20 20   = nByte>>32;.  
72d0: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
72e0: 0a 20 20 54 52 41 43 45 33 28 22 54 52 55 4e 43  .  TRACE3("TRUNC
72f0: 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20  ATE %d %lld\n", 
7300: 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e  ((winFile*)id)->
7310: 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53 69 6d  h, nByte);.  Sim
7320: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
7330: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7340: 29 3b 0a 20 20 53 65 74 46 69 6c 65 50 6f 69 6e  );.  SetFilePoin
7350: 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ter(((winFile*)i
7360: 64 29 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75  d)->h, nByte, &u
7370: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
7380: 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f  EGIN);.  SetEndO
7390: 66 46 69 6c 65 28 28 28 77 69 6e 46 69 6c 65 2a  fFile(((winFile*
73a0: 29 69 64 29 2d 3e 68 29 3b 0a 20 20 72 65 74 75  )id)->h);.  retu
73b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
73c0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
73d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
73e0: 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
73f0: 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
7400: 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 4f  nt winFileSize(O
7410: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  sFile *id, i64 *
7420: 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52 44 20  pSize){.  DWORD 
7430: 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77 65 72  upperBits, lower
7440: 42 69 74 73 3b 0a 20 20 61 73 73 65 72 74 28 20  Bits;.  assert( 
7450: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
7460: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
7470: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  n SQLITE_IOERR);
7480: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47  .  lowerBits = G
7490: 65 74 46 69 6c 65 53 69 7a 65 28 28 28 77 69 6e  etFileSize(((win
74a0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 75  File*)id)->h, &u
74b0: 70 70 65 72 42 69 74 73 29 3b 0a 20 20 2a 70 53  pperBits);.  *pS
74c0: 69 7a 65 20 3d 20 28 28 28 69 36 34 29 75 70 70  ize = (((i64)upp
74d0: 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c  erBits)<<32) + l
74e0: 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75  owerBits;.  retu
74f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7500: 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
7510: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
7520: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
7530: 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
7540: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
7550: 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
7560: 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
7570: 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
7580: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
7590: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
75a0: 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20  cquire a reader 
75b0: 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65  lock..** Differe
75c0: 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20  nt API routines 
75d0: 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e  are called depen
75e0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
75f0: 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69  or not this.** i
7600: 73 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54  s Win95 or WinNT
7610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7620: 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  getReadLock(winF
7630: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
7640: 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
7650: 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
7660: 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76  PED ovlp;.    ov
7670: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52  lp.Offset = SHAR
7680: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76  ED_FIRST;.    ov
7690: 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
76a0: 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65  0;.    ovlp.hEve
76b0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20  nt = 0;.    res 
76c0: 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69 64 2d  = LockFileEx(id-
76d0: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
76e0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 20 30  L_IMMEDIATELY, 0
76f0: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 30 2c  , SHARED_SIZE,0,
7700: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
7710: 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
7720: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
7730: 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26  ss(sizeof(lk), &
7740: 6c 6b 29 3b 0a 20 20 20 20 69 64 2d 3e 73 68 61  lk);.    id->sha
7750: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c  redLockByte = (l
7760: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
7770: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
7780: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  );.    res = Loc
7790: 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41  kFile(id->h, SHA
77a0: 52 45 44 5f 46 49 52 53 54 2b 69 64 2d 3e 73 68  RED_FIRST+id->sh
77b0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
77c0: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
77d0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
77e0: 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
77f0: 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
7800: 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
7810: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
7820: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66  .  int res;.  if
7830: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
7840: 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65  res = UnlockFile
7850: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
7860: 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
7870: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d  ED_SIZE, 0);.  }
7880: 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
7890: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
78a0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
78b0: 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  T + pFile->share
78c0: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
78d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
78e0: 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e 64 65  n res;.}..#ifnde
78f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
7900: 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a  GER_PRAGMAS./*.*
7910: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 20 67  * Check that a g
7920: 69 76 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73  iven pathname is
7930: 20 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64   a directory and
7940: 20 69 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a   is writable .**
7950: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
7960: 69 6e 49 73 44 69 72 57 72 69 74 61 62 6c 65 28  inIsDirWritable(
7970: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
7980: 0a 20 20 69 6e 74 20 66 69 6c 65 41 74 74 72 3b  .  int fileAttr;
7990: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
79a0: 74 65 64 3b 0a 20 20 69 66 28 20 7a 44 69 72 6e  ted;.  if( zDirn
79b0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
79c0: 30 3b 0a 20 20 69 66 28 20 21 69 73 4e 54 28 29  0;.  if( !isNT()
79d0: 20 26 26 20 73 74 72 6c 65 6e 28 7a 44 69 72 6e   && strlen(zDirn
79e0: 61 6d 65 29 3e 4d 41 58 5f 50 41 54 48 20 29 20  ame)>MAX_PATH ) 
79f0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 7a 43 6f  return 0;..  zCo
7a00: 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
7a10: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44  tUtf8Filename(zD
7a20: 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  irname);.  if( z
7a30: 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
7a40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
7a60: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
7a70: 20 66 69 6c 65 41 74 74 72 20 3d 20 47 65 74 46   fileAttr = GetF
7a80: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 28  ileAttributesW((
7a90: 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
7aa0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  d);.  }else{.#if
7ab0: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65   OS_WINCE.    re
7ac0: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
7ad0: 20 20 66 69 6c 65 41 74 74 72 20 3d 20 47 65 74    fileAttr = Get
7ae0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
7af0: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
7b00: 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
7b10: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e   sqliteFree(zCon
7b20: 76 65 72 74 65 64 29 3b 0a 20 20 69 66 28 20 66  verted);.  if( f
7b30: 69 6c 65 41 74 74 72 20 3d 3d 20 30 78 66 66 66  ileAttr == 0xfff
7b40: 66 66 66 66 66 20 29 20 72 65 74 75 72 6e 20 30  fffff ) return 0
7b50: 3b 0a 20 20 69 66 28 20 28 66 69 6c 65 41 74 74  ;.  if( (fileAtt
7b60: 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
7b70: 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20 21 3d  TE_DIRECTORY) !=
7b80: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
7b90: 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
7ba0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7bb0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
7bc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7bd0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
7be0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20   */../*.** Lock 
7bf0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
7c00: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
7c10: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
7c20: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
7c30: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7c40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
7c50: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
7c60: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
7c70: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
7c80: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
7c90: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
7ca0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
7cb0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
7cc0: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
7cd0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
7ce0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
7cf0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
7d00: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
7d10: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
7d20: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
7d30: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
7d40: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
7d50: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
7d60: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
7d70: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
7d80: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
7d90: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
7da0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
7db0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
7dc0: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
7dd0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
7de0: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
7df0: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
7e00: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
7e10: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
7e20: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
7e30: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
7e40: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
7e50: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
7e60: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
7e70: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
7e80: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
7e90: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
7ea0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
7eb0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
7ec0: 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
7ed0: 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
7ee0: 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
7ef0: 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
7f00: 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
7f10: 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
7f20: 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
7f30: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
7f40: 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
7f50: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
7f60: 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
7f70: 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
7f80: 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
7f90: 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
7fa0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
7fb0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
7fc0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
7fd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7fe0: 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
7ff0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
8000: 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
8010: 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
8020: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
8030: 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  windows lock cal
8040: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
8050: 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
8060: 20 53 65 74 20 69 64 2d 3e 6c 6f 63 6b 74 79 70   Set id->locktyp
8070: 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
8080: 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
8090: 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
80a0: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
80b0: 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
80c0: 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
80d0: 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
80e0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
80f0: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
8100: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
8110: 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 35 28 22  =0 );.  TRACE5("
8120: 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25  LOCK %d %d was %
8130: 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  d(%d)\n",.      
8140: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
8150: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c  cktype, pFile->l
8160: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
8170: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b  sharedLockByte);
8180: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
8190: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
81a0: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
81b0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
81c0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
81d0: 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
81e0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
81f0: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
8200: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
8210: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
8220: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
8230: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
8240: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
8250: 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
8260: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
8280: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
8290: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
82a0: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
82b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
82c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
82d0: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
82e0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
82f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
8300: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
8310: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
8320: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
8330: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
8340: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
8350: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
8360: 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e   Lock the PENDIN
8370: 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77  G_LOCK byte if w
8380: 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72  e need to acquir
8390: 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
83a0: 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45   or.  ** a SHARE
83b0: 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61  D lock.  If we a
83c0: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
83d0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
83e0: 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20  acquisition of. 
83f0: 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   ** the PENDING_
8400: 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d  LOCK byte is tem
8410: 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e  porary..  */.  n
8420: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69  ewLocktype = pFi
8430: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
8440: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
8450: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20  ype==NO_LOCK.   
8460: 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
8470: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
8480: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
8490: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a  =RESERVED_LOCK).
84a0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
84b0: 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
84c0: 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
84d0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
84e0: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
84f0: 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30  TE, 0, 1, 0))==0
8500: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
8510: 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20   3 times to get 
8520: 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  the pending lock
8530: 2e 20 20 54 68 65 20 70 65 6e 64 69 6e 67 20 6c  .  The pending l
8540: 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ock might be.   
8550: 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 61 6e     ** held by an
8560: 6f 74 68 65 72 20 72 65 61 64 65 72 20 70 72 6f  other reader pro
8570: 63 65 73 73 20 77 68 6f 20 77 69 6c 6c 20 72 65  cess who will re
8580: 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e 74 61  lease it momenta
8590: 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rily..      */. 
85a0: 20 20 20 20 20 54 52 41 43 45 32 28 22 63 6f 75       TRACE2("cou
85b0: 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e  ld not get a PEN
85c0: 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25  DING lock. cnt=%
85d0: 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20  d\n", cnt);.    
85e0: 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20    Sleep(1);.    
85f0: 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
8600: 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 7d 0a  Lock = res;.  }.
8610: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
8620: 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
8630: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
8640: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
8650: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
8660: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
8670: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
8680: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
8690: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
86a0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
86b0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
86c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
86d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
86e0: 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
86f0: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
8700: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
8710: 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
8720: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
8730: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
8740: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
8750: 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65    res = LockFile
8760: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
8770: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
8780: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
8790: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
87a0: 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
87b0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
87c0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
87d0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
87e0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
87f0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
8800: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
8810: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
8820: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
8830: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
8840: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
8850: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
8860: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
8870: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
8880: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
8890: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
88a0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
88b0: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
88c0: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
88d0: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
88e0: 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 75 6e  ;.    TRACE2("un
88f0: 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
8900: 2c 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20  , res);.    res 
8910: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
8920: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
8930: 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
8940: 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
8950: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
8960: 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
8970: 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
8980: 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
8990: 32 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  2("error-code = 
89a0: 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45 72  %d\n", GetLastEr
89b0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ror());.    }.  
89c0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
89d0: 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
89e0: 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
89f0: 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
8a00: 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
8a10: 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
8a20: 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
8a30: 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
8a40: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
8a50: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
8a60: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
8a70: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
8a80: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
8a90: 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
8aa0: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
8ab0: 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
8ac0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
8ad0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
8ae0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
8af0: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
8b00: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
8b10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
8b30: 43 45 34 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44  CE4("LOCK FAILED
8b40: 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25   %d trying for %
8b50: 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c  d but got %d\n",
8b60: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
8b70: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20        locktype, 
8b80: 6e 65 77 4c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  newLocktype);.  
8b90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
8ba0: 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  SY;.  }.  pFile-
8bb0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77 4c  >locktype = newL
8bc0: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
8bd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
8bf0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
8c00: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
8c10: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
8c20: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
8c30: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
8c40: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
8c50: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
8c60: 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
8c70: 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
8c80: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
8c90: 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
8ca0: 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65  ervedLock(OsFile
8cb0: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b   *id){.  int rc;
8cc0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
8cd0: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
8ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
8cf0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  e!=0 );.  if( pF
8d00: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
8d10: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
8d20: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8d30: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
8d40: 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61  LOCK %d %d (loca
8d50: 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  l)\n", pFile->h,
8d60: 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   rc);.  }else{. 
8d70: 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65     rc = LockFile
8d80: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
8d90: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
8da0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
8db0: 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69  {.      UnlockFi
8dc0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
8dd0: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
8de0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8df0: 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 54 52  rc = !rc;.    TR
8e00: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
8e10: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
8e20: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
8e30: 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
8e40: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
8e50: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
8e60: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
8e70: 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
8e80: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
8e90: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
8ea0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
8eb0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
8ec0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
8ed0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
8ee0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8ef0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
8f00: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
8f10: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
8f20: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
8f30: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
8f40: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
8f50: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
8f60: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
8f70: 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
8f80: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
8f90: 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
8fa0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
8fb0: 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
8fc0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8fd0: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
8fe0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
8ff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9000: 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
9010: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
9020: 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
9030: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9040: 4f 4b 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  OK;.  winFile *p
9050: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
9060: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  )id;.  assert( p
9070: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
9080: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
9090: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
90a0: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25  TRACE5("UNLOCK %
90b0: 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25  d to %d was %d(%
90c0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
90d0: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
90e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
90f0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
9100: 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20  redLockByte);.  
9110: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
9120: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79  cktype;.  if( ty
9130: 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe>=EXCLUSIVE_LO
9140: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b  CK ){.    Unlock
9150: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
9160: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
9170: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
9180: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
9190: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
91a0: 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70  & !getReadLock(p
91b0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
91c0: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
91d0: 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
91e0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
91f0: 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
9200: 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
9210: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
9220: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
9230: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
9240: 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
9250: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
9260: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
9270: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
9280: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
9290: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
92a0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
92b0: 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
92c0: 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
92d0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
92e0: 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
92f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
9300: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
9310: 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
9320: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
9330: 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
9340: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
9350: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9360: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
9370: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
9380: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
9390: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
93a0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
93b0: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
93c0: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
93d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
93e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
93f0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
9400: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
9410: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
9420: 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
9430: 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
9440: 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
9450: 68 61 72 20 2a 73 71 6c 69 74 65 33 57 69 6e 46  har *sqlite3WinF
9460: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e 73  ullPathname(cons
9470: 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
9480: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  e){.  char *zFul
9490: 6c 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  l;.#if defined(_
94a0: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
94b0: 20 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74 65 20   nByte;.  nByte 
94c0: 3d 20 73 74 72 6c 65 6e 28 7a 52 65 6c 61 74 69  = strlen(zRelati
94d0: 76 65 29 20 2b 20 4d 41 58 5f 50 41 54 48 20 2b  ve) + MAX_PATH +
94e0: 20 31 30 30 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d   1001;.  zFull =
94f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
9500: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
9510: 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ull==0 ) return 
9520: 30 3b 0a 20 20 69 66 28 20 63 79 67 77 69 6e 5f  0;.  if( cygwin_
9530: 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
9540: 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76  32_path(zRelativ
9550: 65 2c 20 7a 46 75 6c 6c 29 20 29 20 72 65 74 75  e, zFull) ) retu
9560: 72 6e 20 30 3b 0a 23 65 6c 69 66 20 4f 53 5f 57  rn 0;.#elif OS_W
9570: 49 4e 43 45 0a 20 20 2f 2a 20 57 69 6e 43 45 20  INCE.  /* WinCE 
9580: 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
9590: 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
95a0: 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
95b0: 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 7a 46 75  m told. */.  zFu
95c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  ll = sqliteStrDu
95d0: 70 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65  p(zRelative);.#e
95e0: 6c 73 65 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  lse.  int nByte;
95f0: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
9600: 74 65 64 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ted;.  zConverte
9610: 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
9620: 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
9630: 65 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  e);.  if( isNT()
9640: 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a   ){.    WCHAR *z
9650: 54 65 6d 70 2c 20 2a 7a 4e 6f 74 55 73 65 64 57  Temp, *zNotUsedW
9660: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65  ;.    nByte = Ge
9670: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
9680: 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
9690: 64 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  d, 0, 0, &zNotUs
96a0: 65 64 57 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54  edW) + 1;.    zT
96b0: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
96c0: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
96d0: 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
96e0: 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
96f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
9700: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
9710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9720: 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c      }.    GetFul
9730: 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
9740: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  R*)zConverted, n
9750: 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 26 7a 4e  Byte, zTemp, &zN
9760: 6f 74 55 73 65 64 57 29 3b 0a 20 20 20 20 73 71  otUsedW);.    sq
9770: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72  liteFree(zConver
9780: 74 65 64 29 3b 0a 20 20 20 20 7a 46 75 6c 6c 20  ted);.    zFull 
9790: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
97a0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
97b0: 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  teFree(zTemp);. 
97c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
97d0: 20 2a 7a 54 65 6d 70 2c 20 2a 7a 4e 6f 74 55 73   *zTemp, *zNotUs
97e0: 65 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ed;.    nByte = 
97f0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
9800: 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
9810: 65 64 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55  ed, 0, 0, &zNotU
9820: 73 65 64 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54  sed) + 1;.    zT
9830: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
9840: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
9850: 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
9860: 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
9870: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
9880: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
9890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
98a0: 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c      }.    GetFul
98b0: 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
98c0: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  *)zConverted, nB
98d0: 79 74 65 2c 20 7a 54 65 6d 70 2c 20 26 7a 4e 6f  yte, zTemp, &zNo
98e0: 74 55 73 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  tUsed);.    sqli
98f0: 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  teFree(zConverte
9900: 64 29 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20  d);.    zFull = 
9910: 6d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70  mbcsToUtf8(zTemp
9920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
9930: 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
9940: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 46  ndif.  return zF
9950: 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ull;.}../*.** Th
9960: 65 20 66 75 6c 6c 53 79 6e 63 20 6f 70 74 69 6f  e fullSync optio
9970: 6e 20 69 73 20 6d 65 61 6e 69 6e 67 6c 65 73 73  n is meaningless
9980: 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 20 20 20 54   on windows.   T
9990: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
99a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
99b0: 69 6e 53 65 74 46 75 6c 6c 53 79 6e 63 28 4f 73  inSetFullSync(Os
99c0: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 76 29  File *id, int v)
99d0: 7b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  {.  return;.}../
99e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
99f0: 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
9a00: 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73  handle for an Os
9a10: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  File.*/.static i
9a20: 6e 74 20 77 69 6e 46 69 6c 65 48 61 6e 64 6c 65  nt winFileHandle
9a30: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
9a40: 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 77 69  return (int)((wi
9a50: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a 7d  nFile*)id)->h;.}
9a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9a70: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  n integer that i
9a80: 6e 64 69 63 65 73 20 74 68 65 20 74 79 70 65 20  ndices the type 
9a90: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
9aa0: 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69  y held.** by thi
9ab0: 73 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64  s handle.  (Used
9ac0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
9ad0: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29   analysis only.)
9ae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9af0: 69 6e 4c 6f 63 6b 53 74 61 74 65 28 4f 73 46 69  inLockState(OsFi
9b00: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
9b10: 6e 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  n ((winFile*)id)
9b20: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f  ->locktype;.}../
9b30: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
9b40: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
9b50: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
9b60: 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
9b70: 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72 20 77 69  OsFile.** for wi
9b80: 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
9b90: 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71  onst IoMethod sq
9ba0: 6c 69 74 65 33 57 69 6e 49 6f 4d 65 74 68 6f 64  lite3WinIoMethod
9bb0: 20 3d 20 7b 0a 20 20 77 69 6e 43 6c 6f 73 65 2c   = {.  winClose,
9bc0: 0a 20 20 77 69 6e 4f 70 65 6e 44 69 72 65 63 74  .  winOpenDirect
9bd0: 6f 72 79 2c 0a 20 20 77 69 6e 52 65 61 64 2c 0a  ory,.  winRead,.
9be0: 20 20 77 69 6e 57 72 69 74 65 2c 0a 20 20 77 69    winWrite,.  wi
9bf0: 6e 53 65 65 6b 2c 0a 20 20 77 69 6e 54 72 75 6e  nSeek,.  winTrun
9c00: 63 61 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c  cate,.  winSync,
9c10: 0a 20 20 77 69 6e 53 65 74 46 75 6c 6c 53 79 6e  .  winSetFullSyn
9c20: 63 2c 0a 20 20 77 69 6e 46 69 6c 65 48 61 6e 64  c,.  winFileHand
9c30: 6c 65 2c 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a  le,.  winFileSiz
9c40: 65 2c 0a 20 20 77 69 6e 4c 6f 63 6b 2c 0a 20 20  e,.  winLock,.  
9c50: 77 69 6e 55 6e 6c 6f 63 6b 2c 0a 20 20 77 69 6e  winUnlock,.  win
9c60: 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 77 69 6e  LockState,.  win
9c70: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
9c80: 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  k,.};../*.** All
9c90: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
9ca0: 20 61 6e 20 4f 73 46 69 6c 65 2e 20 20 49 6e 69   an OsFile.  Ini
9cb0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 77 20  tialize the new 
9cc0: 4f 73 46 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65  OsFile.** to the
9cd0: 20 76 61 6c 75 65 20 67 69 76 65 6e 20 69 6e 20   value given in 
9ce0: 70 49 6e 69 74 20 61 6e 64 20 72 65 74 75 72 6e  pInit and return
9cf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
9d00: 65 20 6e 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e  e new.** OsFile.
9d10: 20 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20    If we run out 
9d20: 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65  of memory, close
9d30: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
9d40: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
9d50: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
9d60: 65 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65  eWinFile(winFile
9d70: 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20   *pInit, OsFile 
9d80: 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e 46 69 6c  **pId){.  winFil
9d90: 65 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  e *pNew;.  pNew 
9da0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
9db0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
9dc0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
9dd0: 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  {.    CloseHandl
9de0: 65 28 70 49 6e 69 74 2d 3e 68 29 3b 0a 23 69 66  e(pInit->h);.#if
9df0: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 73 71   OS_WINCE.    sq
9e00: 6c 69 74 65 46 72 65 65 28 70 49 6e 69 74 2d 3e  liteFree(pInit->
9e10: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
9e20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2a 70 49 64  .#endif.    *pId
9e30: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
9e40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65   }else{.    *pNe
9e60: 77 20 3d 20 2a 70 49 6e 69 74 3b 0a 20 20 20 20  w = *pInit;.    
9e70: 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
9e80: 26 73 71 6c 69 74 65 33 57 69 6e 49 6f 4d 65 74  &sqlite3WinIoMet
9e90: 68 6f 64 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  hod;.    pNew->l
9ea0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
9eb0: 4b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 68 61  K;.    pNew->sha
9ec0: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b  redLockByte = 0;
9ed0: 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46  .    *pId = (OsF
9ee0: 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f  ile*)pNew;.    O
9ef0: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
9f00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9f10: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 65  E_OK;.  }.}...#e
9f20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9f30: 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a  MIT_DISKIO */./*
9f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76  **********.** Ev
9f90: 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20 64  erything above d
9fa0: 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20 49  eals with file I
9fb0: 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20  /O.  Everything 
9fc0: 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65 61  that follows dea
9fd0: 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65 72  ls.** with other
9fe0: 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61 73   miscellanous as
9ff0: 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65  pects of the ope
a000: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
a010: 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  terface.********
a020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a060: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ****/../*.** Get
a070: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
a080: 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20  seed the random 
a090: 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
a0a0: 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69  .  The seed.** i
a0b0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
a0c0: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32  he buffer zBuf[2
a0d0: 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  56].  The callin
a0e0: 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a  g function must.
a0f0: 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66 66  ** supply a suff
a100: 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62  iciently large b
a110: 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uffer..*/.int sq
a120: 6c 69 74 65 33 57 69 6e 52 61 6e 64 6f 6d 53 65  lite3WinRandomSe
a130: 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  ed(char *zBuf){.
a140: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
a150: 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
a160: 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
a170: 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
a180: 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
a190: 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
a1a0: 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
a1b0: 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
a1c0: 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
a1d0: 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
a1e0: 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
a1f0: 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
a200: 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
a210: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
a220: 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
a230: 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
a240: 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
a250: 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
a260: 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
a270: 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
a280: 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
a290: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
a2a0: 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
a2b0: 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
a2c0: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
a2d0: 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
a2e0: 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
a2f0: 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
a300: 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
a310: 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
a320: 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
a330: 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
a340: 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
a350: 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
a360: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
a370: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
a380: 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65  ence.* This make
a390: 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
a3a0: 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
a3b0: 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
a3c0: 20 30 2c 20 32 35 36 29 3b 0a 20 20 47 65 74 53   0, 256);.  GetS
a3d0: 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53  ystemTime((LPSYS
a3e0: 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20  TEMTIME)zBuf);. 
a3f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a400: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
a410: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
a420: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
a430: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
a440: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
a450: 71 6c 69 74 65 33 57 69 6e 53 6c 65 65 70 28 69  qlite3WinSleep(i
a460: 6e 74 20 6d 73 29 7b 0a 20 20 53 6c 65 65 70 28  nt ms){.  Sleep(
a470: 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73  ms);.  return ms
a480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69  ;.}../*.** Stati
a490: 63 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64  c variables used
a4a0: 20 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63   for thread sync
a4b0: 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73  hronization.*/.s
a4c0: 74 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65  tatic int inMute
a4d0: 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  x = 0;.#ifdef SQ
a4e0: 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53  LITE_W32_THREADS
a4f0: 0a 20 20 73 74 61 74 69 63 20 44 57 4f 52 44 20  .  static DWORD 
a500: 6d 75 74 65 78 4f 77 6e 65 72 3b 0a 20 20 73 74  mutexOwner;.  st
a510: 61 74 69 63 20 43 52 49 54 49 43 41 4c 5f 53 45  atic CRITICAL_SE
a520: 43 54 49 4f 4e 20 63 73 3b 0a 23 65 6e 64 69 66  CTION cs;.#endif
a530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
a540: 6f 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f  owing pair of ro
a550: 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
a560: 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f   mutual exclusio
a570: 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74  n for.** multi-t
a580: 68 72 65 61 64 65 64 20 70 72 6f 63 65 73 73 65  hreaded processe
a590: 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  s.  Only a singl
a5a0: 65 20 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f  e thread is allo
a5b0: 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74  wed to.** execut
a5c0: 65 64 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  ed code that is 
a5d0: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e  surrounded by En
a5e0: 74 65 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c  terMutex() and L
a5f0: 65 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a  eaveMutex()..**.
a600: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f  ** SQLite uses o
a610: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74  nly a single Mut
a620: 65 78 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ex.  There is no
a630: 74 20 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a  t much critical.
a640: 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74  ** code and what
a650: 20 6c 69 74 74 6c 65 20 74 68 65 72 65 20 69 73   little there is
a660: 20 65 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c   executes quickl
a670: 79 20 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c  y and without bl
a680: 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 56 65  ocking..**.** Ve
a690: 72 73 69 6f 6e 20 33 2e 33 2e 31 20 61 6e 64 20  rsion 3.3.1 and 
a6a0: 65 61 72 6c 69 65 72 20 75 73 65 64 20 61 20 73  earlier used a s
a6b0: 69 6d 70 6c 65 20 6d 75 74 65 78 2e 20 20 42 65  imple mutex.  Be
a6c0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 0a 2a 2a 20  ginning with.** 
a6d0: 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 61  version 3.3.2, a
a6e0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
a6f0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
a700: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
a710: 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69  EnterMutex(){.#i
a720: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f  fdef SQLITE_W32_
a730: 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
a740: 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b   int isInit = 0;
a750: 0a 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69  .  while( !isIni
a760: 74 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  t ){.    static 
a770: 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20  long lock = 0;. 
a780: 20 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b     if( Interlock
a790: 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63  edIncrement(&loc
a7a0: 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 49  k)==1 ){.      I
a7b0: 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61  nitializeCritica
a7c0: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20  lSection(&cs);. 
a7d0: 20 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b       isInit = 1;
a7e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a7f0: 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20    Sleep(1);.    
a800: 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72 69  }.  }.  EnterCri
a810: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73  ticalSection(&cs
a820: 29 3b 0a 20 20 6d 75 74 65 78 4f 77 6e 65 72 20  );.  mutexOwner 
a830: 3d 20 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  = GetCurrentThre
a840: 61 64 49 64 28 29 3b 0a 23 65 6e 64 69 66 0a 20  adId();.#endif. 
a850: 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a 7d 0a 76 6f   inMutex++;.}.vo
a860: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 4c 65 61  id sqlite3WinLea
a870: 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61 73 73  veMutex(){.  ass
a880: 65 72 74 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a  ert( inMutex );.
a890: 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a 23 69 66    inMutex--;.#if
a8a0: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  def SQLITE_W32_T
a8b0: 48 52 45 41 44 53 0a 20 20 61 73 73 65 72 74 28  HREADS.  assert(
a8c0: 20 6d 75 74 65 78 4f 77 6e 65 72 3d 3d 47 65 74   mutexOwner==Get
a8d0: 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28  CurrentThreadId(
a8e0: 29 20 29 3b 0a 20 20 4c 65 61 76 65 43 72 69 74  ) );.  LeaveCrit
a8f0: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29  icalSection(&cs)
a900: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a910: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
a920: 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 63 75   the mutex is cu
a930: 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a 2a  rrently held..**
a940: 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 73 54  .** If the thisT
a950: 68 72 65 61 64 4f 6e 6c 79 20 70 61 72 61 6d 65  hreadOnly parame
a960: 74 65 72 20 69 73 20 74 72 75 65 2c 20 72 65 74  ter is true, ret
a970: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
a980: 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20 63  only if the.** c
a990: 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 68 6f  alling thread ho
a9a0: 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 20 20  lds the mutex.  
a9b0: 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
a9c0: 20 69 73 20 66 61 6c 73 65 2c 20 72 65 74 75 72   is false, retur
a9d0: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 61 6e 79  n.** true if any
a9e0: 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68   thread holds th
a9f0: 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74 20  e mutex..*/.int 
aa00: 73 71 6c 69 74 65 33 57 69 6e 49 6e 4d 75 74 65  sqlite3WinInMute
aa10: 78 28 69 6e 74 20 74 68 69 73 54 68 72 65 61 64  x(int thisThread
aa20: 4f 6e 6c 79 29 7b 0a 23 69 66 64 65 66 20 53 51  Only){.#ifdef SQ
aa30: 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53  LITE_W32_THREADS
aa40: 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65  .  return inMute
aa50: 78 3e 30 20 26 26 20 28 74 68 69 73 54 68 72 65  x>0 && (thisThre
aa60: 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 6d 75 74  adOnly==0 || mut
aa70: 65 78 4f 77 6e 65 72 3d 3d 47 65 74 43 75 72 72  exOwner==GetCurr
aa80: 65 6e 74 54 68 72 65 61 64 49 64 28 29 29 3b 0a  entThreadId());.
aa90: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 69  #else.  return i
aaa0: 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e 64 69 66  nMutex>0;.#endif
aab0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
aac0: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
aad0: 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
aae0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62  on-zero value, b
aaf0: 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c  ecomes the resul
ab00: 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72  t.** returned fr
ab10: 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  om sqlite3OsCurr
ab20: 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73  entTime().  This
ab30: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
ab40: 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
ab50: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
ab60: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
ab70: 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  time = 0;.#endif
ab80: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
ab90: 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
aba0: 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
abb0: 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
abc0: 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
abd0: 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
abe0: 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
abf0: 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
ac00: 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
ac10: 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
ac20: 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
ac30: 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
ac40: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
ac50: 6c 69 74 65 33 57 69 6e 43 75 72 72 65 6e 74 54  lite3WinCurrentT
ac60: 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ime(double *prNo
ac70: 77 29 7b 0a 20 20 46 49 4c 45 54 49 4d 45 20 66  w){.  FILETIME f
ac80: 74 3b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  t;.  /* FILETIME
ac90: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
aca0: 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
acb0: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
acc0: 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30  mber of .     10
acd0: 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
ace0: 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
acf0: 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
ad00: 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a  JD 2305813.5). .
ad10: 20 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 6f    */.  double no
ad20: 77 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  w;.#if OS_WINCE.
ad30: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
ad40: 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  e;.  GetSystemTi
ad50: 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 53 79 73  me(&time);.  Sys
ad60: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
ad70: 65 28 26 74 69 6d 65 2c 26 66 74 29 3b 0a 23 65  e(&time,&ft);.#e
ad80: 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54  lse.  GetSystemT
ad90: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
ada0: 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6e  ft );.#endif.  n
adb0: 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74  ow = ((double)ft
adc0: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
add0: 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b   * 4294967296.0;
ade0: 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f   .  *prNow = (no
adf0: 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65  w + ft.dwLowDate
ae00: 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30  Time)/8640000000
ae10: 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35  00.0 + 2305813.5
ae20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ae30: 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
ae40: 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
ae50: 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
ae60: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
ae70: 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32  time/86400.0 + 2
ae80: 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65  440587.5;.  }.#e
ae90: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b  ndif.  return 0;
aea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
aeb0: 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  er the number of
aec0: 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
aed0: 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20 61 6c 6c  -data blocks all
aee0: 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73 65 20 74  ocated..** Use t
aef0: 68 69 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  his to verify th
af00: 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 6c 65  at we are not le
af10: 61 6b 69 6e 67 20 74 68 72 65 61 64 2d 73 70 65  aking thread-spe
af20: 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a 2a 20 54  cific-data..** T
af30: 69 63 6b 65 74 20 23 31 36 30 31 0a 2a 2f 0a 23  icket #1601.*/.#
af40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
af50: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 73  T.int sqlite3_ts
af60: 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 20 64  d_count = 0;.# d
af70: 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45  efine TSD_COUNTE
af80: 52 5f 49 4e 43 52 20 49 6e 74 65 72 6c 6f 63 6b  R_INCR Interlock
af90: 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 73 71 6c  edIncrement(&sql
afa0: 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 29 0a  ite3_tsd_count).
afb0: 23 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55  # define TSD_COU
afc0: 4e 54 45 52 5f 44 45 43 52 20 49 6e 74 65 72 6c  NTER_DECR Interl
afd0: 6f 63 6b 65 64 44 65 63 72 65 6d 65 6e 74 28 26  ockedDecrement(&
afe0: 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
aff0: 74 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  t).#else.# defin
b000: 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 49 4e  e TSD_COUNTER_IN
b010: 43 52 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  CR  /* no-op */.
b020: 23 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55  # define TSD_COU
b030: 4e 54 45 52 5f 44 45 43 52 20 20 2f 2a 20 6e 6f  NTER_DECR  /* no
b040: 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a  -op */.#endif...
b050: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64  ./*.** If called
b060: 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c   with allocateFl
b070: 61 67 3e 31 2c 20 74 68 65 6e 20 72 65 74 75 72  ag>1, then retur
b080: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b090: 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69  hread.** specifi
b0a0: 63 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  c data for the c
b0b0: 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  urrent thread.  
b0c0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72  Allocate and zer
b0d0: 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d  o the.** thread-
b0e0: 73 70 65 63 69 66 69 63 20 64 61 74 61 20 69 66  specific data if
b0f0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
b100: 65 61 64 79 20 65 78 69 73 74 20 6e 65 63 65 73  eady exist neces
b110: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  sary..**.** If c
b120: 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63  alled with alloc
b130: 61 74 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e  ateFlag==0, then
b140: 20 63 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   check the curre
b150: 6e 74 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65  nt thread.** spe
b160: 63 69 66 69 63 20 64 61 74 61 2e 20 20 52 65 74  cific data.  Ret
b170: 75 72 6e 20 69 74 20 69 66 20 69 74 20 65 78 69  urn it if it exi
b180: 73 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  sts.  If it does
b190: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
b1a0: 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  hen return NULL.
b1b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64  .**.** If called
b1c0: 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c   with allocateFl
b1d0: 61 67 3c 30 2c 20 63 68 65 63 6b 20 74 6f 20 73  ag<0, check to s
b1e0: 65 65 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ee if the thread
b1f0: 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74   specific.** dat
b200: 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  a is allocated a
b210: 6e 64 20 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20  nd is all zero. 
b220: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 64   If it is then d
b230: 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a  eallocate it..**
b240: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b250: 72 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20  r to the thread 
b260: 73 70 65 63 69 66 69 63 20 64 61 74 61 20 6f 72  specific data or
b270: 20 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a   NULL if it is.*
b280: 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72  * unallocated or
b290: 20 67 65 74 73 20 64 65 61 6c 6c 6f 63 61 74 65   gets deallocate
b2a0: 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74 61  d..*/.ThreadData
b2b0: 20 2a 73 71 6c 69 74 65 33 57 69 6e 54 68 72 65   *sqlite3WinThre
b2c0: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 28 69  adSpecificData(i
b2d0: 6e 74 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 29  nt allocateFlag)
b2e0: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b  {.  static int k
b2f0: 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ey;.  static int
b300: 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20   keyInit = 0;.  
b310: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72  static const Thr
b320: 65 61 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61  eadData zeroData
b330: 20 3d 20 7b 30 7d 3b 0a 20 20 54 68 72 65 61 64   = {0};.  Thread
b340: 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20 69  Data *pTsd;..  i
b350: 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20  f( !keyInit ){. 
b360: 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65     sqlite3OsEnte
b370: 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
b380: 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20  ( !keyInit ){.  
b390: 20 20 20 20 6b 65 79 20 3d 20 54 6c 73 41 6c 6c      key = TlsAll
b3a0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oc();.      if( 
b3b0: 6b 65 79 3d 3d 30 78 66 66 66 66 66 66 66 66 20  key==0xffffffff 
b3c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b3d0: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
b3e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
b3f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
b400: 20 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b 0a 20    keyInit = 1;. 
b410: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b420: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
b430: 20 20 7d 0a 20 20 70 54 73 64 20 3d 20 54 6c 73    }.  pTsd = Tls
b440: 47 65 74 56 61 6c 75 65 28 6b 65 79 29 3b 0a 20  GetValue(key);. 
b450: 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
b460: 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  g>0 ){.    if( !
b470: 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 70 54  pTsd ){.      pT
b480: 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61  sd = sqlite3OsMa
b490: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 7a 65 72  lloc( sizeof(zer
b4a0: 6f 44 61 74 61 29 20 29 3b 0a 20 20 20 20 20 20  oData) );.      
b4b0: 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20  if( pTsd ){.    
b4c0: 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f      *pTsd = zero
b4d0: 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 54 6c  Data;.        Tl
b4e0: 73 53 65 74 56 61 6c 75 65 28 6b 65 79 2c 20 70  sSetValue(key, p
b4f0: 54 73 64 29 3b 0a 20 20 20 20 20 20 20 20 54 53  Tsd);.        TS
b500: 44 5f 43 4f 55 4e 54 45 52 5f 49 4e 43 52 3b 0a  D_COUNTER_INCR;.
b510: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b520: 7d 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d  }else if( pTsd!=
b530: 30 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61  0 && allocateFla
b540: 67 3c 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  g<0 .           
b550: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73     && memcmp(pTs
b560: 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69  d, &zeroData, si
b570: 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74 61 29  zeof(ThreadData)
b580: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b590: 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b  te3OsFree(pTsd);
b5a0: 0a 20 20 20 20 54 6c 73 53 65 74 56 61 6c 75 65  .    TlsSetValue
b5b0: 28 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 54 53  (key, 0);.    TS
b5c0: 44 5f 43 4f 55 4e 54 45 52 5f 44 45 43 52 3b 0a  D_COUNTER_DECR;.
b5d0: 20 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20      pTsd = 0;.  
b5e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b  }.  return pTsd;
b5f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
b600: 57 49 4e 20 2a 2f 0a                             WIN */.