/ Hex Artifact Content
Login

Artifact ca46001d4ec446885f72d3b7fd6a657136156228:


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 6d 69  F-8 string to mi
0ea0: 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20  crosoft unicode 
0eb0: 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a  (UTF-16?). .**.*
0ec0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
0ed0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
0ee0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
0ef0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
0f00: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48  c..*/.static WCH
0f10: 41 52 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64  AR *utf8ToUnicod
0f20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
0f30: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
0f40: 6e 43 68 61 72 3b 0a 20 20 57 43 48 41 52 20 2a  nChar;.  WCHAR *
0f50: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
0f60: 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42    nChar = MultiB
0f70: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
0f80: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
0f90: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
0fa0: 29 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  );.  zWideFilena
0fb0: 6d 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  me = sqliteMallo
0fc0: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
0fd0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
0fe0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
0ff0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
1000: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1010: 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69  .  nChar = Multi
1020: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
1030: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
1040: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46  name, -1, zWideF
1050: 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72 29 3b  ilename, nChar);
1060: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
1070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1080: 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  e(zWideFilename)
1090: 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e  ;.    zWideFilen
10a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
10b0: 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e  eturn zWideFilen
10c0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
10d0: 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20  nvert microsoft 
10e0: 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38  unicode to UTF-8
10f0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1100: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
1110: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
1120: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1130: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
1140: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
1150: 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48  ToUtf8(const WCH
1160: 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d  AR *zWideFilenam
1170: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1180: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1190: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  me;..  nByte = W
11a0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
11b0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
11c0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
11d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
11e0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
11f0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
1200: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
1210: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1220: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
1230: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1240: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
1250: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
1260: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
1270: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
12a0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
12b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
12c0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
12d0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
12e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
12f0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e  ** Convert an an
1310: 73 69 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63  si string to mic
1320: 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20  rosoft unicode, 
1330: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
1340: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
1350: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
1360: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
1370: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1380: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
1390: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
13a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
13b0: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43  oc..*/.static WC
13c0: 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e 69 63 6f  HAR *mbcsToUnico
13d0: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
13e0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
13f0: 20 6e 42 79 74 65 3b 0a 20 20 57 43 48 41 52 20   nByte;.  WCHAR 
1400: 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a  *zMbcsFilename;.
1410: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
1420: 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49   AreFileApisANSI
1430: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
1440: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
1450: 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
1460: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
1470: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
1480: 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73 69 7a 65 6f  1, NULL,0)*sizeo
1490: 66 28 57 43 48 41 52 29 3b 0a 20 20 7a 4d 62 63  f(WCHAR);.  zMbc
14a0: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  sFilename = sqli
14b0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  teMalloc( nByte*
14c0: 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65  sizeof(zMbcsFile
14d0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
14e0: 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d  ( zMbcsFilename=
14f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1500: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
1510: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
1520: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
1530: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
1540: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
1550: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
1560: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
1570: 71 6c 69 74 65 46 72 65 65 28 7a 4d 62 63 73 46  qliteFree(zMbcsF
1580: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
1590: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
15a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
15b0: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
15c0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69  /*.** Convert mi
15d0: 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20  crosoft unicode 
15e0: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
15f0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62  racter string, b
1600: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75  ased on the.** u
1610: 73 65 72 27 73 20 41 6e 73 69 20 63 6f 64 65 70  ser's Ansi codep
1620: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
1630: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
1640: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
1650: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1660: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
1670: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1680: 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 63  *unicodeToMbcs(c
1690: 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69 64  onst WCHAR *zWid
16a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
16b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
16c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
16d0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72 65  t codepage = Are
16e0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
16f0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
1700: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  CP;..  nByte = W
1710: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
1720: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
1730: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
1740: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
1750: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
1760: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
1770: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
1780: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
1790: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
17a0: 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54  Byte = WideCharT
17b0: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
17c0: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
17d0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
17e0: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
1810: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
1820: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
1830: 46 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  Free(zFilename);
1840: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
1850: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1860: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
1870: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c  *.** Convert mul
1880: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
1890: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38   string to UTF-8
18a0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
18b0: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64   the.** returned
18c0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
18d0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
18e0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
18f0: 69 63 20 63 68 61 72 20 2a 6d 62 63 73 54 6f 55  ic char *mbcsToU
1900: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
1910: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
1920: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66  ar *zFilenameUtf
1930: 38 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70  8;.  WCHAR *zTmp
1940: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
1950: 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  e = mbcsToUnicod
1960: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1970: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
1980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1990: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
19a0: 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Utf8 = unicodeTo
19b0: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
19c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 6d    sqliteFree(zTm
19d0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
19e0: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
19f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1a00: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
1a10: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
1a20: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
1a30: 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74  hold the .** ret
1a40: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
1a50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1a60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  liteMalloc()..*/
1a70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 74  .static char *ut
1a80: 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 63  f8ToMbcs(const c
1a90: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1aa0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1ab0: 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41 52 20  meMbcs;.  WCHAR 
1ac0: 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54  *zTmpWide;..  zT
1ad0: 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55  mpWide = utf8ToU
1ae0: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
1af0: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
1b00: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
1b10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
1b20: 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63  enameMbcs = unic
1b30: 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69  odeToMbcs(zTmpWi
1b40: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  de);.  sqliteFre
1b50: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
1b60: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
1b70: 62 63 73 3b 0a 7d 0a 0a 23 69 66 20 4f 53 5f 57  bcs;.}..#if OS_W
1b80: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
1b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1bd0: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
1be0: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
1bf0: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
1c00: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45  ./*.** WindowsCE
1c10: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1c20: 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
1c30: 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74  ction.  So creat
1c40: 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74  e a.** substitut
1c50: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  e..*/.#include <
1c60: 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74  time.h>.struct t
1c70: 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c  m *__cdecl local
1c80: 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f  time(const time_
1c90: 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63  t *t).{.  static
1ca0: 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20   struct tm y;.  
1cb0: 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54  FILETIME uTm, lT
1cc0: 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  m;.  SYSTEMTIME 
1cd0: 70 54 6d 3b 0a 20 20 69 36 34 20 74 36 34 3b 0a  pTm;.  i64 t64;.
1ce0: 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
1cf0: 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
1d00: 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
1d10: 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
1d20: 65 54 69 6d 65 20 3d 20 74 36 34 20 26 20 30 78  eTime = t64 & 0x
1d30: 46 46 46 46 46 46 46 46 3b 0a 20 20 75 54 6d 2e  FFFFFFFF;.  uTm.
1d40: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
1d50: 74 36 34 20 3e 3e 20 33 32 3b 0a 20 20 46 69 6c  t64 >> 32;.  Fil
1d60: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
1d70: 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b  Time(&uTm,&lTm);
1d80: 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  .  FileTimeToSys
1d90: 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54  temTime(&lTm,&pT
1da0: 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20  m);.  y.tm_year 
1db0: 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39  = pTm.wYear - 19
1dc0: 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d  00;.  y.tm_mon =
1dd0: 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b   pTm.wMonth - 1;
1de0: 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70  .  y.tm_wday = p
1df0: 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20  Tm.wDayOfWeek;. 
1e00: 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d   y.tm_mday = pTm
1e10: 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f  .wDay;.  y.tm_ho
1e20: 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a  ur = pTm.wHour;.
1e30: 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d    y.tm_min = pTm
1e40: 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d  .wMinute;.  y.tm
1e50: 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f  _sec = pTm.wSeco
1e60: 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b  nd;.  return &y;
1e70: 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69 6c 6c  .}../* This will
1e80: 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64   never be called
1e90: 2c 20 62 75 74 20 64 65 66 69 6e 65 64 20 74 6f  , but defined to
1ea0: 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 63   make the code c
1eb0: 6f 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  ompile */.#defin
1ec0: 65 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 61  e GetTempPathA(a
1ed0: 2c 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c 6f 63  ,b)..#define Loc
1ee0: 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29  kFile(a,b,c,d,e)
1ef0: 20 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b         winceLock
1f00: 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64  File(&a, b, c, d
1f10: 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 55 6e 6c  , e).#define Unl
1f20: 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c  ockFile(a,b,c,d,
1f30: 65 29 20 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f  e)     winceUnlo
1f40: 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c  ckFile(&a, b, c,
1f50: 20 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 4c   d, e).#define L
1f60: 6f 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c  ockFileEx(a,b,c,
1f70: 64 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f  d,e,f)   winceLo
1f80: 63 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20  ckFileEx(&a, b, 
1f90: 63 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23 64 65  c, d, e, f)..#de
1fa0: 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  fine HANDLE_TO_W
1fb0: 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69  INFILE(a) (winFi
1fc0: 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b  le*)&((char*)a)[
1fd0: 2d 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c  -offsetof(winFil
1fe0: 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  e,h)]../*.** Acq
1ff0: 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  uire a lock on t
2000: 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73  he handle h.*/.s
2010: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
2020: 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e  MutexAcquire(HAN
2030: 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44  DLE h){.   DWORD
2040: 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a   dwErr;.   do {.
2050: 20 20 20 20 20 64 77 45 72 72 20 3d 20 57 61 69       dwErr = Wai
2060: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
2070: 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20  (h, INFINITE);. 
2080: 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72    } while (dwErr
2090: 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f   != WAIT_OBJECT_
20a0: 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41  0 && dwErr != WA
20b0: 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d  IT_ABANDONED);.}
20c0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
20d0: 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62   lock acquired b
20e0: 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  y winceMutexAcqu
20f0: 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ire().*/.#define
2100: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
2110: 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74  se(h) ReleaseMut
2120: 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ex(h)../*.** Cre
2130: 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ate the mutex an
2140: 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  d shared memory 
2150: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
2160: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
2170: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
2180: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
2190: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
21a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21b0: 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a  ename, winFile *
21c0: 70 46 69 6c 65 29 7b 0a 20 20 57 43 48 41 52 20  pFile){.  WCHAR 
21d0: 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20 2a  *zTok;.  WCHAR *
21e0: 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e  zName = utf8ToUn
21f0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
2200: 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
2210: 20 54 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69   TRUE;..  /* Ini
2220: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
2230: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
2240: 5a 65 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69 6c  ZeroMemory(&pFil
2250: 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f 66  e->local, sizeof
2260: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
2270: 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
2280: 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
2290: 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
22a0: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
22b0: 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
22c0: 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
22d0: 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72 4c  /.  zTok = CharL
22e0: 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  owerW(zName);.  
22f0: 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b  for (;*zTok;zTok
2300: 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54  ++){.    if (*zT
2310: 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f  ok == '\\') *zTo
2320: 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20  k = '_';.  }..  
2330: 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74  /* Create/open t
2340: 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a  he named mutex *
2350: 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65  /.  pFile->hMute
2360: 78 20 3d 20 43 72 65 61 74 65 4d 75 74 65 78 57  x = CreateMutexW
2370: 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e  (NULL, FALSE, zN
2380: 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69  ame);.  if (!pFi
2390: 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
23a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
23b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
23c0: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
23d0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
23e0: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
23f0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
2400: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
2410: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
2420: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
2430: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
2440: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
2450: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
2460: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
2470: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
2480: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
2490: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
24a0: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
24b0: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
24c0: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
24d0: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
24e0: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61  name..  */.  Cha
24f0: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
2500: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
2510: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70   = CreateFileMap
2520: 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
2530: 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
2540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
2570: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
2580: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
25c0: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
25d0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
25e0: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
25f0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
2600: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
2610: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
2620: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
2630: 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  f (GetLastError(
2640: 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  ) == ERROR_ALREA
2650: 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
2660: 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
2670: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65   }..  sqliteFree
2680: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  (zName);..  /* I
2690: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
26a0: 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61  n making the sha
26b0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
26c0: 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20  e, map it. */.  
26d0: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  if (pFile->hShar
26e0: 65 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ed){.    pFile->
26f0: 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c  shared = (winceL
2700: 6f 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46 69  ock*)MapViewOfFi
2710: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
2720: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
2730: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
2740: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
2750: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
2760: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
2770: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
2780: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
2790: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
27a0: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
27b0: 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65  /.    if (!pFile
27c0: 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20  ->shared){.     
27d0: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
27e0: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
27f0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
2800: 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
2810: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
2820: 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
2830: 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
2840: 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
2850: 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
2860: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
2870: 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29  hShared == NULL)
2880: 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  {.    winceMutex
2890: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
28a0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c 6f 73  Mutex);.    Clos
28b0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
28c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
28d0: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
28e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
28f0: 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  SE;.  }.  .  /* 
2900: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
2910: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
2920: 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
2930: 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74  o */.  if (bInit
2940: 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65 6d 6f  ) {.    ZeroMemo
2950: 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ry(pFile->shared
2960: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
2970: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
2980: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
2990: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
29a0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
29b0: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
29c0: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
29d0: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
29e0: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
29f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
2a00: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
2a10: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
2a20: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
2a30: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
2a40: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
2a50: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
2a60: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
2a70: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
2a80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2a90: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
2aa0: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
2ab0: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
2ac0: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
2ad0: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
2ae0: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
2af0: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
2b00: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
2b10: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
2b20: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
2b30: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
2b40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
2b50: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
2b60: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
2b70: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
2b80: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
2b90: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
2ba0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
2bb0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
2bc0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
2bd0: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
2be0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
2bf0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
2c00: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
2c10: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
2c20: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
2c30: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
2c40: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
2c50: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
2c60: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
2c70: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55 6e 6d  andle */.    Unm
2c80: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
2c90: 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
2ca0: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
2cb0: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
2cc0: 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
2cd0: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
2ce0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
2cf0: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
2d00: 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f 73 65  );    .    Close
2d10: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
2d20: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
2d30: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
2d40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  .  }.}../* .** A
2d50: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2d60: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
2d70: 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64 6f 77  () API of window
2d80: 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73  s for wince.*/.s
2d90: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
2da0: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44  LockFile(.  HAND
2db0: 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57  LE *phFile,.  DW
2dc0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
2dd0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
2de0: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
2df0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
2e00: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
2e10: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
2e20: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
2e30: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
2e40: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
2e50: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
2e60: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
2e70: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 69 66 20   = FALSE;..  if 
2e80: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
2e90: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
2ea0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
2eb0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
2ec0: 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20  ;..  /* Wanting 
2ed0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2ee0: 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  k? */.  if (dwFi
2ef0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 53  leOffsetLow == S
2f00: 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20  HARED_FIRST.    
2f10: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
2f20: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
2f30: 20 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20   SHARED_SIZE){. 
2f40: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
2f50: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
2f60: 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
2f70: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
2f80: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
2f90: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
2fa0: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
2fb0: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
2fc0: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
2fd0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
2fe0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
2ff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
3000: 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
3010: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
3020: 69 66 20 28 28 64 77 46 69 6c 65 4f 66 66 73 65  if ((dwFileOffse
3030: 74 4c 6f 77 20 3e 3d 20 53 48 41 52 45 44 5f 46  tLow >= SHARED_F
3040: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20  IRST &&.        
3050: 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74      dwFileOffset
3060: 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52  Low < SHARED_FIR
3070: 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45  ST + SHARED_SIZE
3080: 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
3090: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
30a0: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
30b0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
30c0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
30d0: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70  e == 0){.      p
30e0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
30f0: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69  ders ++;.      i
3100: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3110: 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a  nReaders == 1){.
3120: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
3130: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
3140: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
3150: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
3160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3170: 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67  * Want a pending
3180: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
3190: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
31a0: 74 4c 6f 77 20 3d 3d 20 50 45 4e 44 49 4e 47 5f  tLow == PENDING_
31b0: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
31c0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
31d0: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
31e0: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
31f0: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
3200: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
3210: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
3220: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3230: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
3240: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3250: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
3260: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
3270: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
3280: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
3290: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
32a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 57 61     }.  }.  /* Wa
32b0: 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
32c0: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
32d0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
32e0: 77 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 42 59  w == RESERVED_BY
32f0: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
3300: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
3310: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
3320: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
3330: 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
3340: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3350: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
3360: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
3370: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
3380: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
3390: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
33a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
33b0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
33c0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
33d0: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
33e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
33f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3400: 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
3410: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
3420: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
3430: 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
3440: 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20  kFile(.  HANDLE 
3450: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
3460: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
3470: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
3480: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
3490: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
34a0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
34b0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
34c0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
34d0: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
34e0: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
34f0: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
3500: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
3510: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 69 66  n = FALSE;..  if
3520: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
3530: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
3540: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
3550: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
3560: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69  );..  /* Releasi
3570: 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ng a reader lock
3580: 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
3590: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64   lock */.  if (d
35a0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3e  wFileOffsetLow >
35b0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  = SHARED_FIRST &
35c0: 26 0a 20 20 20 20 20 20 20 64 77 46 69 6c 65 4f  &.       dwFileO
35d0: 66 66 73 65 74 4c 6f 77 20 3c 20 53 48 41 52 45  ffsetLow < SHARE
35e0: 44 5f 46 49 52 53 54 20 2b 20 53 48 41 52 45 44  D_FIRST + SHARED
35f0: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 2f 2a 20 44  _SIZE){.    /* D
3600: 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78  id we have an ex
3610: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
3620: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3630: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
3640: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3650: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
3660: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
3670: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3680: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
3690: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
36a0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
36b0: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
36c0: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
36d0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
36e0: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
36f0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
3700: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3710: 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
3720: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
3730: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
3740: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
3750: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3760: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
3770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3780: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
3790: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
37a0: 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
37b0: 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
37c0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
37d0: 65 74 4c 6f 77 20 3d 3d 20 50 45 4e 44 49 4e 47  etLow == PENDING
37e0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
37f0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
3800: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
3810: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3820: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
3830: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
3840: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
3850: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3860: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
3870: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
3880: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3890: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
38a0: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
38b0: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
38c0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
38d0: 6f 77 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 42  ow == RESERVED_B
38e0: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
38f0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
3900: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
3910: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
3920: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
3930: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
3940: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
3950: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
3960: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
3970: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
3980: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
3990: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
39a0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
39b0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
39c0: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
39d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
39e0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
39f0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
3a00: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
3a10: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
3a20: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
3a30: 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45 20  ileEx(.  HANDLE 
3a40: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
3a50: 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52   dwFlags,.  DWOR
3a60: 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20 20  D dwReserved,.  
3a70: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
3a80: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20  ytesToLockLow,. 
3a90: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
3aa0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c  BytesToLockHigh,
3ab0: 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 20  .  LPOVERLAPPED 
3ac0: 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a  lpOverlapped.){.
3ad0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
3ae0: 65 72 20 77 61 6e 74 73 20 61 20 73 68 61 72 65  er wants a share
3af0: 64 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72  d read lock, for
3b00: 77 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a 20  ward this call. 
3b10: 20 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b   ** to winceLock
3b20: 46 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70  File */.  if (lp
3b30: 4f 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73  Overlapped->Offs
3b40: 65 74 20 3d 3d 20 53 48 41 52 45 44 5f 46 49 52  et == SHARED_FIR
3b50: 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46 6c  ST &&.      dwFl
3b60: 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20 20  ags == 1 &&.    
3b70: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
3b80: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41  ToLockLow == SHA
3b90: 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72  RED_SIZE){.    r
3ba0: 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
3bb0: 69 6c 65 28 70 68 46 69 6c 65 2c 20 53 48 41 52  ile(phFile, SHAR
3bc0: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20  ED_FIRST, 0, 1, 
3bd0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
3be0: 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20   FALSE;.}./*.** 
3bf0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69  End of the speci
3c00: 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63  al code for winc
3c10: 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
3c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3c60: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49  .#endif /* OS_WI
3c70: 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  NCE */../*.** Co
3c80: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69  nvert a UTF-8 fi
3c90: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74  lename into what
3ca0: 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e  ever form the un
3cb0: 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72  derlying.** oper
3cc0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e  ating system wan
3cd0: 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e  ts filenames in.
3ce0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
3cf0: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73  the result.** is
3d00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3d10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 20 61 6e 64 20  qliteMalloc and 
3d20: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
3d30: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
3d40: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72  tic void *conver
3d60: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  tUtf8Filename(co
3d70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
3d80: 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
3d90: 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
3da0: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
3db0: 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75    zConverted = u
3dc0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
3dd0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
3de0: 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
3df0: 20 3d 20 75 74 66 38 54 6f 4d 62 63 73 28 7a 46   = utf8ToMbcs(zF
3e00: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
3e10: 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
3e20: 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
3e30: 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
3e40: 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
3e50: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
3e60: 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
3e70: 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 6e 64  * Note that wind
3e80: 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
3e90: 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
3ea0: 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
3eb0: 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
3ec0: 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
3ed0: 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
3ee0: 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
3ef0: 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
3f00: 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
3f10: 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
3f20: 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
3f30: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3f40: 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
3f50: 69 74 20 69 73 20 69 74 20 64 6f 65 73 2e 20 20  it is it does.  
3f60: 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
3f70: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
3f80: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
3f90: 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
3fa0: 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
3fb0: 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
3fc0: 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
3fd0: 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
3fe0: 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
3ff0: 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
4000: 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
4010: 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
4020: 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
4030: 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
4040: 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
4050: 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
4060: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
4070: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 44 45 4c  /.#define MX_DEL
4080: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
4090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 44  .int sqlite3WinD
40a0: 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72  elete(const char
40b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
40c0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
40d0: 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a 7a  nt rc;.  void *z
40e0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
40f0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
4100: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
4110: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
4120: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4130: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
4140: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
4150: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63      do{.      rc
4160: 20 3d 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   = DeleteFileW(z
4170: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
4180: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
4190: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
41a0: 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 21  esW(zConverted)!
41b0: 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20  =0xffffffff .   
41c0: 20 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b           && cnt+
41d0: 2b 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f  + < MX_DELETION_
41e0: 41 54 54 45 4d 50 54 53 20 26 26 20 28 53 6c 65  ATTEMPTS && (Sle
41f0: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 20  ep(100), 1) );. 
4200: 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57   }else{.#if OS_W
4210: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
4220: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65  SQLITE_NOMEM;.#e
4230: 6c 73 65 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  lse.    do{.    
4240: 20 20 72 63 20 3d 20 44 65 6c 65 74 65 46 69 6c    rc = DeleteFil
4250: 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  eA(zConverted);.
4260: 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
4270: 30 20 26 26 20 47 65 74 46 69 6c 65 41 74 74 72  0 && GetFileAttr
4280: 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
4290: 65 64 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a  ed)!=0xffffffff.
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 63              && c
42b0: 6e 74 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45 54 49  nt++ < MX_DELETI
42c0: 4f 4e 5f 41 54 54 45 4d 50 54 53 20 26 26 20 28  ON_ATTEMPTS && (
42d0: 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
42e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
42f0: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65  qliteFree(zConve
4300: 72 74 65 64 29 3b 0a 20 20 54 52 41 43 45 32 28  rted);.  TRACE2(
4310: 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e  "DELETE \"%s\"\n
4320: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
4330: 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20   return rc!=0 ? 
4340: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
4350: 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_IOERR;.}../*.
4360: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4370: 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  f the named file
4380: 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
4390: 73 71 6c 69 74 65 33 57 69 6e 46 69 6c 65 45 78  sqlite3WinFileEx
43a0: 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20  ists(const char 
43b0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
43c0: 6e 74 20 65 78 69 73 74 73 20 3d 20 30 3b 0a 20  nt exists = 0;. 
43d0: 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
43e0: 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
43f0: 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
4400: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
4410: 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
4420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
4430: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
4440: 4e 54 28 29 20 29 7b 0a 20 20 20 20 65 78 69 73  NT() ){.    exis
4450: 74 73 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  ts = GetFileAttr
4460: 69 62 75 74 65 73 57 28 28 57 43 48 41 52 2a 29  ibutesW((WCHAR*)
4470: 7a 43 6f 6e 76 65 72 74 65 64 29 20 21 3d 20 30  zConverted) != 0
4480: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
4490: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
44a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
44b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
44c0: 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65 74      exists = Get
44d0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
44e0: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
44f0: 64 29 20 21 3d 20 30 78 66 66 66 66 66 66 66 66  d) != 0xffffffff
4500: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
4510: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65  qliteFree(zConve
4520: 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
4530: 65 78 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f  exists;.}../* Fo
4540: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
4550: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
4560: 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28  allocateWinFile(
4570: 77 69 6e 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20  winFile *pInit, 
4580: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 3b 0a 0a  OsFile **pId);..
4590: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
45a0: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72   open a file for
45b0: 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
45c0: 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74  d writing.  If t
45d0: 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72  hat.** fails, tr
45e0: 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61  y opening it rea
45f0: 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20  d-only.  If the 
4600: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
4610: 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63  ist,.** try to c
4620: 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  reate it..**.** 
4630: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61  On success, a ha
4640: 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65  ndle for the ope
4650: 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74 65  n file is writte
4660: 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20  n to *id.** and 
4670: 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65  *pReadonly is se
4680: 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 66 69  t to 0 if the fi
4690: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f  le was opened fo
46a0: 72 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a  r reading and.**
46b0: 20 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66   writing or 1 if
46c0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
46d0: 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
46e0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
46f0: 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  turns.** SQLITE_
4700: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
4710: 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69  lure, the functi
4720: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
4730: 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c  E_CANTOPEN and l
4740: 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64  eaves.** *id and
4750: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68   *pReadonly unch
4760: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
4770: 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52 65 61 64  lite3WinOpenRead
4780: 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63  Write(.  const c
4790: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a  har *zFilename,.
47a0: 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a    OsFile **pId,.
47b0: 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79    int *pReadonly
47c0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 66 3b  .){.  winFile f;
47d0: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
47e0: 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
47f0: 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
4800: 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
4810: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
4820: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
4830: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4840: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4850: 2a 70 49 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  *pId==0 );..  if
4860: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
4870: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
4880: 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
4890: 65 64 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52  ed,.       GENER
48a0: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
48b0: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  C_WRITE,.       
48c0: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
48d0: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
48e0: 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c  TE,.       NULL,
48f0: 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57  .       OPEN_ALW
4900: 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45  AYS,.       FILE
4910: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
4920: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
4930: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
4940: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
4950: 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c      if( h==INVAL
4960: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
4970: 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65  ){.      h = Cre
4980: 61 74 65 46 69 6c 65 57 28 28 57 43 48 41 52 2a  ateFileW((WCHAR*
4990: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
49a0: 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45        GENERIC_RE
49b0: 41 44 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c  AD,.         FIL
49c0: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
49d0: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
49e0: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  .         NULL,.
49f0: 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c           OPEN_AL
4a00: 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46  WAYS,.         F
4a10: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
4a20: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
4a30: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
4a40: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20           NULL.  
4a50: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
4a60: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
4a70: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
4a80: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4a90: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
4aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4ab0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
4ac0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64    }.      *pRead
4ad0: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  only = 1;.    }e
4ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61  lse{.      *pRea
4af0: 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d  donly = 0;.    }
4b00: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
4b10: 20 20 69 66 20 28 21 77 69 6e 63 65 43 72 65 61    if (!winceCrea
4b20: 74 65 4c 6f 63 6b 28 7a 46 69 6c 65 6e 61 6d 65  teLock(zFilename
4b30: 2c 20 26 66 29 29 7b 0a 20 20 20 20 20 20 43 6c  , &f)){.      Cl
4b40: 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20  oseHandle(h);.  
4b50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4b60: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
4b70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4b80: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
4b90: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
4ba0: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
4bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4bc0: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
4bd0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
4be0: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
4bf0: 64 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49  d,.       GENERI
4c00: 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
4c10: 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 46  _WRITE,.       F
4c20: 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
4c30: 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
4c40: 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  E,.       NULL,.
4c50: 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41         OPEN_ALWA
4c60: 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f  YS,.       FILE_
4c70: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
4c80: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   | FILE_FLAG_RAN
4c90: 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20  DOM_ACCESS,.    
4ca0: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20     NULL.    );. 
4cb0: 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49     if( h==INVALI
4cc0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
4cd0: 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65 61  {.      h = Crea
4ce0: 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a 29 7a  teFileA((char*)z
4cf0: 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
4d00: 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44      GENERIC_READ
4d10: 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f  ,.         FILE_
4d20: 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
4d30: 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20  E_SHARE_WRITE,. 
4d40: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
4d50: 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41         OPEN_ALWA
4d60: 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c  YS,.         FIL
4d70: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
4d80: 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  AL | FILE_FLAG_R
4d90: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20  ANDOM_ACCESS,.  
4da0: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
4db0: 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68    );.      if( h
4dc0: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
4dd0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
4de0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
4df0: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
4e00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4e10: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
4e20: 7d 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e  }.      *pReadon
4e30: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ly = 1;.    }els
4e40: 65 7b 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f  e{.      *pReado
4e50: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nly = 0;.    }.#
4e60: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 43  endif /* OS_WINC
4e70: 45 20 2a 2f 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E */.  }..  sqli
4e80: 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  teFree(zConverte
4e90: 64 29 3b 0a 0a 20 20 66 2e 68 20 3d 20 68 3b 0a  d);..  f.h = h;.
4ea0: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 66  #if OS_WINCE.  f
4eb0: 2e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  .zDeleteOnClose 
4ec0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 54 52  = 0;.#endif.  TR
4ed0: 41 43 45 33 28 22 4f 50 45 4e 20 52 2f 57 20 25  ACE3("OPEN R/W %
4ee0: 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20  d \"%s\"\n", h, 
4ef0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65  zFilename);.  re
4f00: 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 57 69 6e  turn allocateWin
4f10: 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d  File(&f, pId);.}
4f20: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  .../*.** Attempt
4f30: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
4f40: 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76  ile for exclusiv
4f50: 65 20 61 63 63 65 73 73 20 62 79 20 74 68 69 73  e access by this
4f60: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65   process..** The
4f70: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70   file will be op
4f80: 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  ened for both re
4f90: 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
4fa0: 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20  g.  To avoid.** 
4fb0: 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75  a potential secu
4fc0: 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65  rity problem, we
4fd0: 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   do not allow th
4fe0: 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a  e file to have.*
4ff0: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69  * previously exi
5000: 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65  sted.  Nor do we
5010: 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20   allow the file 
5020: 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63  to be a symbolic
5030: 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20  .** link..**.** 
5040: 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72  If delFlag is tr
5050: 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72  ue, then make ar
5060: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75  rangements to au
5070: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
5080: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77  te.** the file w
5090: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
50a0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
50b0: 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 69  ss, write the fi
50c0: 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a  le handle into *
50d0: 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  id and return SQ
50e0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f  LITE_OK..**.** O
50f0: 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72  n failure, retur
5100: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
5110: 4e 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  N..**.** Sometim
5120: 65 73 20 69 66 20 77 65 20 68 61 76 65 20 6a 75  es if we have ju
5130: 73 74 20 64 65 6c 65 74 65 64 20 61 20 70 72 69  st deleted a pri
5140: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  or journal file,
5150: 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 77 69 6c 6c   windows.** will
5160: 20 66 61 69 6c 20 74 6f 20 6f 70 65 6e 20 61 20   fail to open a 
5170: 6e 65 77 20 6f 6e 65 20 62 65 63 61 75 73 65 20  new one because 
5180: 74 68 65 72 65 20 69 73 20 61 20 22 70 65 6e 64  there is a "pend
5190: 69 6e 67 20 64 65 6c 65 74 65 22 2e 0a 2a 2a 20  ing delete"..** 
51a0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
51b0: 68 69 73 20 62 75 67 2c 20 77 65 20 70 61 75 73  his bug, we paus
51c0: 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
51d0: 65 63 6f 6e 64 73 20 61 6e 64 20 61 74 74 65 6d  econds and attem
51e0: 70 74 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 6f  pt.** a second o
51f0: 70 65 6e 20 61 66 74 65 72 20 74 68 65 20 66 69  pen after the fi
5200: 72 73 74 20 6f 6e 65 20 66 61 69 6c 73 2e 20 20  rst one fails.  
5210: 54 68 65 20 77 68 6f 6c 65 20 6f 70 65 72 61 74  The whole operat
5220: 69 6f 6e 20 6f 6e 6c 79 0a 2a 2a 20 66 61 69 6c  ion only.** fail
5230: 73 20 69 66 20 62 6f 74 68 20 6f 70 65 6e 20 61  s if both open a
5240: 74 74 65 6d 70 74 73 20 61 72 65 20 75 6e 73 75  ttempts are unsu
5250: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
5260: 20 73 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e 45   sqlite3WinOpenE
5270: 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63  xclusive(const c
5280: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
5290: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69 6e  OsFile **pId, in
52a0: 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 77 69  t delFlag){.  wi
52b0: 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c  nFile f;.  HANDL
52c0: 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 66 69 6c  E h;.  DWORD fil
52d0: 65 66 6c 61 67 73 3b 0a 20 20 76 6f 69 64 20 2a  eflags;.  void *
52e0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
52f0: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
5300: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
5310: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
5320: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5330: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
5340: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 49 64 20  .  assert( *pId 
5350: 3d 3d 20 30 20 29 3b 0a 20 20 66 69 6c 65 66 6c  == 0 );.  filefl
5360: 61 67 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  ags = FILE_FLAG_
5370: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
5380: 69 66 20 21 4f 53 5f 57 49 4e 43 45 0a 20 20 69  if !OS_WINCE.  i
5390: 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
53a0: 20 20 66 69 6c 65 66 6c 61 67 73 20 7c 3d 20 46    fileflags |= F
53b0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
53c0: 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46  MPORARY | FILE_F
53d0: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
53e0: 4f 53 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  OSE;.  }.#endif.
53f0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
5400: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
5410: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 68  .    do{.      h
5420: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 28   = CreateFileW((
5430: 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
5440: 64 2c 0a 20 20 20 20 20 20 20 20 20 47 45 4e 45  d,.         GENE
5450: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
5460: 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20  IC_WRITE,.      
5470: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 4e     0,.         N
5480: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 43 52  ULL,.         CR
5490: 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20  EATE_ALWAYS,.   
54a0: 20 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c        fileflags,
54b0: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  .         NULL. 
54c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 77 68 69       );.    }whi
54d0: 6c 65 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  le( h==INVALID_H
54e0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 20 63  ANDLE_VALUE && c
54f0: 6e 74 2b 2b 20 3c 20 32 20 26 26 20 28 53 6c 65  nt++ < 2 && (Sle
5500: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 20  ep(100), 1) );. 
5510: 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57   }else{.#if OS_W
5520: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
5530: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65  SQLITE_NOMEM;.#e
5540: 6c 73 65 0a 20 20 20 20 69 6e 74 20 63 6e 74 20  lse.    int cnt 
5550: 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
5560: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
5570: 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
5580: 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 47 45  rted,.        GE
5590: 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
55a0: 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
55b0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 4e      0,.        N
55c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 43 52 45  ULL,.        CRE
55d0: 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  ATE_ALWAYS,.    
55e0: 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20      fileflags,. 
55f0: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
5600: 20 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28    );.    }while(
5610: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
5620: 4c 45 5f 56 41 4c 55 45 20 26 26 20 63 6e 74 2b  LE_VALUE && cnt+
5630: 2b 20 3c 20 32 20 26 26 20 28 53 6c 65 65 70 28  + < 2 && (Sleep(
5640: 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64  100), 1) );.#end
5650: 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 43 45 20 2a  if /* OS_WINCE *
5660: 2f 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 57 49 4e  /.  }.#if OS_WIN
5670: 43 45 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67  CE.  if( delFlag
5680: 20 26 26 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48   && h!=INVALID_H
5690: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
56a0: 20 20 20 66 2e 7a 44 65 6c 65 74 65 4f 6e 43 6c     f.zDeleteOnCl
56b0: 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
56c0: 3b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  ;.    zConverted
56d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 2e 68 4d   = 0;.  }.  f.hM
56e0: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  utex = NULL;.#en
56f0: 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65  dif.  sqliteFree
5700: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
5710: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
5720: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
5730: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5740: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
5750: 20 66 2e 68 20 3d 20 68 3b 0a 20 20 54 52 41 43   f.h = h;.  TRAC
5760: 45 33 28 22 4f 50 45 4e 20 45 58 20 25 64 20 5c  E3("OPEN EX %d \
5770: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
5780: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
5790: 6e 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c  n allocateWinFil
57a0: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f  e(&f, pId);.}../
57b0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
57c0: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
57d0: 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63  for read-only ac
57e0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  cess..**.** On s
57f0: 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68  uccess, write th
5800: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e  e file handle in
5810: 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72  to *id and retur
5820: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  n SQLITE_OK..**.
5830: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72  ** On failure, r
5840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
5850: 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TOPEN..*/.int sq
5860: 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52 65 61 64  lite3WinOpenRead
5870: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20  Only(const char 
5880: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
5890: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e  le **pId){.  win
58a0: 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45  File f;.  HANDLE
58b0: 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   h;.  void *zCon
58c0: 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
58d0: 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
58e0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
58f0: 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
5900: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5910: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
5920: 73 73 65 72 74 28 20 2a 70 49 64 3d 3d 30 20 29  ssert( *pId==0 )
5930: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
5940: 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65  {.    h = Create
5950: 46 69 6c 65 57 28 28 57 43 48 41 52 2a 29 7a 43  FileW((WCHAR*)zC
5960: 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
5970: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20   GENERIC_READ,. 
5980: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
5990: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45  NULL,.       OPE
59a0: 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20  N_EXISTING,.    
59b0: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
59c0: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
59d0: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
59e0: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
59f0: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
5a00: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
5a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5a20: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
5a30: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
5a40: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
5a50: 64 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49  d,.       GENERI
5a60: 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30  C_READ,.       0
5a70: 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20  ,.       NULL,. 
5a80: 20 20 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54        OPEN_EXIST
5a90: 49 4e 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45  ING,.       FILE
5aa0: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
5ab0: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
5ac0: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
5ad0: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
5ae0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
5af0: 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72 74  iteFree(zConvert
5b00: 65 64 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ed);.  if( h==IN
5b10: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
5b20: 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UE ){.    return
5b30: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
5b40: 3b 0a 20 20 7d 0a 20 20 66 2e 68 20 3d 20 68 3b  ;.  }.  f.h = h;
5b50: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
5b60: 66 2e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  f.zDeleteOnClose
5b70: 20 3d 20 30 3b 0a 20 20 66 2e 68 4d 75 74 65 78   = 0;.  f.hMutex
5b80: 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
5b90: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 52    TRACE3("OPEN R
5ba0: 4f 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  O %d \"%s\"\n", 
5bb0: 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  h, zFilename);. 
5bc0: 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65   return allocate
5bd0: 57 69 6e 46 69 6c 65 28 26 66 2c 20 70 49 64 29  WinFile(&f, pId)
5be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
5bf0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
5c00: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
5c10: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
5c20: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
5c30: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
5c40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
5c50: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
5c60: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
5c70: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
5c80: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
5c90: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
5ca0: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
5cb0: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
5cc0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
5cd0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
5ce0: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
5cf0: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
5d00: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
5d10: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
5d20: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
5d30: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
5d40: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
5d50: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
5d60: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70   a previously op
5d70: 65 6e 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69  en file is at *i
5d80: 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20  d is.** updated 
5d90: 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72  with the new dir
5da0: 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
5db0: 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54  riptor and SQLIT
5dc0: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
5dd0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  ned..**.** On fa
5de0: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
5df0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
5e00: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
5e10: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e  leaves.** *id un
5e20: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
5e30: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 44 69  ic int winOpenDi
5e40: 72 65 63 74 6f 72 79 28 0a 20 20 4f 73 46 69 6c  rectory(.  OsFil
5e50: 65 20 2a 69 64 2c 0a 20 20 63 6f 6e 73 74 20 63  e *id,.  const c
5e60: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 0a 29 7b  har *zDirname.){
5e70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5e80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
5e90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   the following g
5ea0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70  lobal variable p
5eb0: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5ec0: 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a  g which is the.*
5ed0: 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  * name of a dire
5ee0: 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74  ctory, then that
5ef0: 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20   directory will 
5f00: 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  be used to store
5f10: 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69  .** temporary fi
5f20: 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  les..*/.char *sq
5f30: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
5f40: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
5f50: 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
5f60: 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
5f70: 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
5f80: 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
5f90: 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65  to.** hold at le
5fa0: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
5fb0: 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74  AME_SIZE charact
5fc0: 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
5fd0: 74 65 33 57 69 6e 54 65 6d 70 46 69 6c 65 4e 61  te3WinTempFileNa
5fe0: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
5ff0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
6000: 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
6010: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
6020: 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
6030: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
6040: 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
6050: 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69  0123456789";.  i
6060: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
6070: 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45  zTempPath[SQLITE
6080: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
6090: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
60a0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
60b0: 0a 20 20 20 20 73 74 72 6e 63 70 79 28 7a 54 65  .    strncpy(zTe
60c0: 6d 70 50 61 74 68 2c 20 73 71 6c 69 74 65 33 5f  mpPath, sqlite3_
60d0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20  temp_directory, 
60e0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
60f0: 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20 7a 54  SIZE-30);.    zT
6100: 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54  empPath[SQLITE_T
6110: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 5d  EMPNAME_SIZE-30]
6120: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
6130: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
6140: 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
6150: 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74    WCHAR zWidePat
6160: 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h[SQLITE_TEMPNAM
6170: 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 47 65 74  E_SIZE];.    Get
6180: 54 65 6d 70 50 61 74 68 57 28 53 51 4c 49 54 45  TempPathW(SQLITE
6190: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33  _TEMPNAME_SIZE-3
61a0: 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  0, zWidePath);. 
61b0: 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63     zMulti = unic
61c0: 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
61d0: 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
61e0: 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 74  ulti ){.      st
61f0: 72 6e 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c  rncpy(zTempPath,
6200: 20 7a 4d 75 6c 74 69 2c 20 53 51 4c 49 54 45 5f   zMulti, SQLITE_
6210: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
6220: 29 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 50 61  );.      zTempPa
6230: 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  th[SQLITE_TEMPNA
6240: 4d 45 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b  ME_SIZE-30] = 0;
6250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6260: 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d  e(zMulti);.    }
6270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
6280: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6290: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
62a0: 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b      char *zUtf8;
62b0: 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50  .    char zMbcsP
62c0: 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ath[SQLITE_TEMPN
62d0: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 47  AME_SIZE];.    G
62e0: 65 74 54 65 6d 70 50 61 74 68 41 28 53 51 4c 49  etTempPathA(SQLI
62f0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
6300: 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b  -30, zMbcsPath);
6310: 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 6d 62 63  .    zUtf8 = mbc
6320: 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61 74  sToUtf8(zMbcsPat
6330: 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66  h);.    if( zUtf
6340: 38 20 29 7b 0a 20 20 20 20 20 20 73 74 72 6e 63  8 ){.      strnc
6350: 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 7a 55  py(zTempPath, zU
6360: 74 66 38 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50  tf8, SQLITE_TEMP
6370: 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b 0a 20  NAME_SIZE-30);. 
6380: 20 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 53       zTempPath[S
6390: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
63a0: 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 20  IZE-30] = 0;.   
63b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 55     sqliteFree(zU
63c0: 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
63d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
63e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
63f0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 74  }.  }.  for(i=st
6400: 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b  rlen(zTempPath);
6410: 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
6420: 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
6430: 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
6440: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b  [i] = 0;.  for(;
6450: 3b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ;){.    sprintf(
6460: 7a 42 75 66 2c 20 22 25 73 5c 5c 22 54 45 4d 50  zBuf, "%s\\"TEMP
6470: 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
6480: 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20 6a 20  empPath);.    j 
6490: 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
64a0: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
64b0: 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
64c0: 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
64d0: 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
64e0: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
64f0: 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
6500: 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
6510: 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
6520: 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
6530: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
6540: 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  ] = 0;.    if( !
6550: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
6560: 73 74 73 28 7a 42 75 66 29 20 29 20 62 72 65 61  sts(zBuf) ) brea
6570: 6b 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  k;.  }.  TRACE2(
6580: 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20  "TEMP FILENAME: 
6590: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
65a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
65b0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; .}../*.** Clos
65c0: 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e a file..**.** 
65d0: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
65e0: 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hat an attempt t
65f0: 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  o close a handle
6600: 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73   might sometimes
6610: 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20  .** fail.  This 
6620: 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73  is a very unreas
6630: 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62  onable result, b
6640: 75 74 20 77 69 6e 64 6f 77 73 20 69 73 20 6e 6f  ut windows is no
6650: 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62  torious.** for b
6660: 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c  eing unreasonabl
6670: 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f  e so I do not do
6680: 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68  ubt that it migh
6690: 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a  t happen.  If.**
66a0: 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73   the close fails
66b0: 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31  , we pause for 1
66c0: 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
66d0: 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20  and try again.  
66e0: 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58  As.** many as MX
66f0: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61  _CLOSE_ATTEMPT a
6700: 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65  ttempts to close
6710: 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20   the handle are 
6720: 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67  made before.** g
6730: 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74  iving up and ret
6740: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
6750: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
6760: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73  LOSE_ATTEMPT 3.s
6770: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f  tatic int winClo
6780: 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
6790: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
67a0: 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31  le;.  int rc = 1
67b0: 3b 0a 20 20 69 66 28 20 70 49 64 20 26 26 20 28  ;.  if( pId && (
67c0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
67d0: 2a 29 2a 70 49 64 29 21 3d 30 20 29 7b 0a 20 20  *)*pId)!=0 ){.  
67e0: 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20    int rc, cnt = 
67f0: 30 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 43  0;.    TRACE2("C
6800: 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c  LOSE %d\n", pFil
6810: 65 2d 3e 68 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  e->h);.    do{. 
6820: 20 20 20 20 20 72 63 20 3d 20 43 6c 6f 73 65 48       rc = CloseH
6830: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
6840: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
6850: 3d 30 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58  =0 && cnt++ < MX
6860: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
6870: 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31  & (Sleep(100), 1
6880: 29 20 29 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  ) );.#if OS_WINC
6890: 45 0a 20 20 20 20 77 69 6e 63 65 44 65 73 74 72  E.    winceDestr
68a0: 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  oyLock(pFile);. 
68b0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44     if( pFile->zD
68c0: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
68d0: 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65        DeleteFile
68e0: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
68f0: 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 20 20  OnClose);.      
6900: 73 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65  sqliteFree(pFile
6910: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
6920: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
6930: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
6940: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  -1);.    sqliteF
6950: 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ree(pFile);.    
6960: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  *pId = 0;.  }.  
6970: 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
6980: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49  TE_OK : SQLITE_I
6990: 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OERR;.}../*.** R
69a0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
69b0: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
69c0: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
69d0: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
69e0: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
69f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
6a00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
6a10: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
6a20: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
6a30: 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 4f  ic int winRead(O
6a40: 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20  sFile *id, void 
6a50: 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b  *pBuf, int amt){
6a60: 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20 20  .  DWORD got;.  
6a70: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
6a80: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
6a90: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
6aa0: 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45  _IOERR);.  TRACE
6ab0: 33 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d  3("READ %d lock=
6ac0: 25 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65  %d\n", ((winFile
6ad0: 2a 29 69 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46  *)id)->h, ((winF
6ae0: 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79  ile*)id)->lockty
6af0: 70 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61 64  pe);.  if( !Read
6b00: 46 69 6c 65 28 28 28 77 69 6e 46 69 6c 65 2a 29  File(((winFile*)
6b10: 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  id)->h, pBuf, am
6b20: 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a 20  t, &got, 0) ){. 
6b30: 20 20 20 67 6f 74 20 3d 20 2d 31 3b 0a 20 20 7d     got = -1;.  }
6b40: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f  .  if( got==(DWO
6b50: 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  RD)amt ){.    re
6b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6b70: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
6b80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6b90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
6ba0: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
6bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6bc0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
6bd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69    }.}../*.** Wri
6be0: 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
6bf0: 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
6c00: 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
6c10: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
6c20: 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
6c30: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
6c40: 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
6c50: 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 4f  c int winWrite(O
6c60: 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74  sFile *id, const
6c70: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
6c80: 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 20   amt){.  int rc 
6c90: 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 77 72 6f  = 0;.  DWORD wro
6ca0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  te;.  assert( id
6cb0: 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
6cc0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
6cd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
6ce0: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
6cf0: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
6d00: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 54 52  LITE_FULL);.  TR
6d10: 41 43 45 33 28 22 57 52 49 54 45 20 25 64 20 6c  ACE3("WRITE %d l
6d20: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 77 69 6e  ock=%d\n", ((win
6d30: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28  File*)id)->h, ((
6d40: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  winFile*)id)->lo
6d50: 63 6b 74 79 70 65 29 3b 0a 20 20 61 73 73 65 72  cktype);.  asser
6d60: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68  t( amt>0 );.  wh
6d70: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 72  ile( amt>0 && (r
6d80: 63 20 3d 20 57 72 69 74 65 46 69 6c 65 28 28 28  c = WriteFile(((
6d90: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  winFile*)id)->h,
6da0: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 77 72 6f   pBuf, amt, &wro
6db0: 74 65 2c 20 30 29 29 21 3d 30 0a 20 20 20 20 20  te, 0))!=0.     
6dc0: 20 20 20 20 26 26 20 77 72 6f 74 65 3e 30 20 29      && wrote>0 )
6dd0: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
6de0: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
6df0: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
6e00: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ote];.  }.  if( 
6e10: 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29  !rc || amt>(int)
6e20: 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74  wrote ){.    ret
6e30: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
6e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6e50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6e60: 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f 66 74  * Some microsoft
6e70: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
6e80: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
6e90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
6ea0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
6eb0: 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
6ec0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
6ed0: 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
6ee0: 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
6ef0: 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77   Move the read/w
6f00: 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rite pointer in 
6f10: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
6f20: 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 28 4f 73  c int winSeek(Os
6f30: 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
6f40: 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70  fset){.  LONG up
6f50: 70 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74  perBits = offset
6f60: 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77  >>32;.  LONG low
6f70: 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20  erBits = offset 
6f80: 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  & 0xffffffff;.  
6f90: 44 57 4f 52 44 20 72 63 3b 0a 20 20 61 73 73 65  DWORD rc;.  asse
6fa0: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66  rt( id!=0 );.#if
6fb0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
6fc0: 20 20 69 66 28 20 6f 66 66 73 65 74 20 29 20 53    if( offset ) S
6fd0: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
6fe0: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
6ff0: 54 45 5f 46 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  TE_FULL);.#endif
7000: 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31  .  SEEK(offset/1
7010: 30 32 34 20 2b 20 31 29 3b 0a 20 20 72 63 20 3d  024 + 1);.  rc =
7020: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
7030: 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e  ((winFile*)id)->
7040: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
7050: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
7060: 45 47 49 4e 29 3b 0a 20 20 54 52 41 43 45 33 28  EGIN);.  TRACE3(
7070: 22 53 45 45 4b 20 25 64 20 25 6c 6c 64 5c 6e 22  "SEEK %d %lld\n"
7080: 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  , ((winFile*)id)
7090: 2d 3e 68 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ->h, offset);.  
70a0: 69 66 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f  if( rc==INVALID_
70b0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
70c0: 20 26 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72   && GetLastError
70d0: 28 29 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a  ()!=NO_ERROR ){.
70e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
70f0: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
7100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7110: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
7120: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
7130: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
7140: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
7150: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
7160: 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28  tic int winSync(
7170: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
7180: 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 61 73 73  dataOnly){.  ass
7190: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
71a0: 54 52 41 43 45 33 28 22 53 59 4e 43 20 25 64 20  TRACE3("SYNC %d 
71b0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 77 69  lock=%d\n", ((wi
71c0: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28  nFile*)id)->h, (
71d0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  (winFile*)id)->l
71e0: 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69 66 28 20  ocktype);.  if( 
71f0: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
7200: 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d  (((winFile*)id)-
7210: 3e 68 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >h) ){.    retur
7220: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7230: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7240: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
7250: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63   }.}../*.** Sync
7260: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a   the directory z
7270: 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  Dirname. This is
7280: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72   a no-op on oper
7290: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74  ating systems ot
72a0: 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58  her.** than UNIX
72b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
72c0: 57 69 6e 53 79 6e 63 44 69 72 65 63 74 6f 72 79  WinSyncDirectory
72d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69  (const char *zDi
72e0: 72 6e 61 6d 65 29 7b 0a 20 20 53 69 6d 75 6c 61  rname){.  Simula
72f0: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
7300: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a   SQLITE_IOERR);.
7310: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7320: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
7330: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
7340: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
7350: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
7360: 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
7370: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
7380: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20   nByte){.  LONG 
7390: 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74  upperBits = nByt
73a0: 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28  e>>32;.  assert(
73b0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 54 52 41 43   id!=0 );.  TRAC
73c0: 45 33 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E3("TRUNCATE %d 
73d0: 25 6c 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69  %lld\n", ((winFi
73e0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74  le*)id)->h, nByt
73f0: 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  e);.  SimulateIO
7400: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
7410: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53 65  ITE_IOERR);.  Se
7420: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 28 28 77  tFilePointer(((w
7430: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  inFile*)id)->h, 
7440: 6e 42 79 74 65 2c 20 26 75 70 70 65 72 42 69 74  nByte, &upperBit
7450: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
7460: 20 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 28    SetEndOfFile((
7470: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (winFile*)id)->h
7480: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
7490: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
74a0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
74b0: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
74c0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
74d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
74e0: 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a  ileSize(OsFile *
74f0: 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
7500: 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69  .  DWORD upperBi
7510: 74 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ts, lowerBits;. 
7520: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
7530: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
7540: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
7550: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 6c 6f 77 65  E_IOERR);.  lowe
7560: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
7570: 69 7a 65 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ize(((winFile*)i
7580: 64 29 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  d)->h, &upperBit
7590: 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28  s);.  *pSize = (
75a0: 28 28 69 36 34 29 75 70 70 65 72 42 69 74 73 29  ((i64)upperBits)
75b0: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
75c0: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
75d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
75e0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
75f0: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
7600: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
7610: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
7620: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
7630: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
7640: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
7650: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
7660: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
7670: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
7680: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
7690: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
76a0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
76b0: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
76c0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
76d0: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
76e0: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
76f0: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
7700: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 69 64  Lock(winFile *id
7710: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
7720: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
7730: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
7740: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
7750: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
7760: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
7770: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
7780: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
7790: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
77a0: 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c 4f 43  ileEx(id->h, LOC
77b0: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
77c0: 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41 52 45  IATELY, 0, SHARE
77d0: 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70 29 3b  D_SIZE,0,&ovlp);
77e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
77f0: 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
7800: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
7810: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
7820: 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b    id->sharedLock
7830: 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
7840: 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
7850: 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
7860: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69  res = LockFile(i
7870: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  d->h, SHARED_FIR
7880: 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63  ST+id->sharedLoc
7890: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
78a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
78b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
78c0: 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
78d0: 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
78e0: 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
78f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
7900: 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
7910: 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  ) ){.    res = U
7920: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
7930: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7940: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7950: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
7960: 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46     res = UnlockF
7970: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
7980: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 46 69  ARED_FIRST + pFi
7990: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
79a0: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
79b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
79c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
79d0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
79e0: 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  GMAS./*.** Check
79f0: 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70 61   that a given pa
7a00: 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65  thname is a dire
7a10: 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72 69  ctory and is wri
7a20: 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74  table .**.*/.int
7a30: 20 73 71 6c 69 74 65 33 57 69 6e 49 73 44 69 72   sqlite3WinIsDir
7a40: 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a  Writable(char *z
7a50: 44 69 72 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  Dirname){.  int 
7a60: 66 69 6c 65 41 74 74 72 3b 0a 20 20 76 6f 69 64  fileAttr;.  void
7a70: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
7a80: 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d 3d 30 20  if( zDirname==0 
7a90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7aa0: 28 20 21 69 73 4e 54 28 29 20 26 26 20 73 74 72  ( !isNT() && str
7ab0: 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3e 4d 41  len(zDirname)>MA
7ac0: 58 5f 50 41 54 48 20 29 20 72 65 74 75 72 6e 20  X_PATH ) return 
7ad0: 30 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  0;..  zConverted
7ae0: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
7af0: 6c 65 6e 61 6d 65 28 7a 44 69 72 6e 61 6d 65 29  lename(zDirname)
7b00: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
7b10: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
7b20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7b30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
7b40: 28 29 20 29 7b 0a 20 20 20 20 66 69 6c 65 41 74  () ){.    fileAt
7b50: 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  tr = GetFileAttr
7b60: 69 62 75 74 65 73 57 28 28 57 43 48 41 52 2a 29  ibutesW((WCHAR*)
7b70: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
7b80: 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  else{.#if OS_WIN
7b90: 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  CE.    return 0;
7ba0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 69 6c 65 41  .#else.    fileA
7bb0: 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
7bc0: 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
7bd0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
7be0: 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
7bf0: 46 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  Free(zConverted)
7c00: 3b 0a 20 20 69 66 28 20 66 69 6c 65 41 74 74 72  ;.  if( fileAttr
7c10: 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66 20 29   == 0xffffffff )
7c20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7c30: 20 28 66 69 6c 65 41 74 74 72 20 26 20 46 49 4c   (fileAttr & FIL
7c40: 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
7c50: 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45 5f 41  CTORY) != FILE_A
7c60: 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
7c70: 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  RY ){.    return
7c80: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7c90: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
7ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7cb0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f 2a  R_PRAGMAS */../*
7cc0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
7cd0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
7ce0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
7cf0: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
7d00: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
7d10: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
7d20: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
7d30: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
7d40: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
7d50: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
7d60: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
7d70: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
7d80: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
7d90: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
7da0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
7db0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
7dc0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
7dd0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
7de0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
7df0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
7e00: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
7e10: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
7e20: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
7e30: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
7e40: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
7e50: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
7e60: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
7e70: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
7e80: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
7e90: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
7ea0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
7eb0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
7ec0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
7ed0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
7ee0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
7ef0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
7f00: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
7f10: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
7f20: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
7f30: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
7f40: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
7f50: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
7f60: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
7f70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7f80: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
7f90: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
7fa0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
7fb0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
7fc0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
7fd0: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
7fe0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
7ff0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
8000: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
8010: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
8020: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
8030: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
8040: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
8050: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
8060: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
8070: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
8080: 74 20 77 69 6e 4c 6f 63 6b 28 4f 73 46 69 6c 65  t winLock(OsFile
8090: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
80a0: 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
80b0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
80c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
80d0: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
80e0: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
80f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
8100: 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f 77 73  ult of a windows
8110: 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
8120: 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
8130: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 64         /* Set id
8140: 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
8150: 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
8160: 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
8170: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
8180: 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
8190: 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
81a0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
81b0: 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
81c0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
81d0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
81e0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
81f0: 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 25 64   TRACE5("LOCK %d
8200: 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
8210: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ",.          pFi
8220: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
8230: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
8240: 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
8250: 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20  ockByte);..  /* 
8260: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
8270: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
8280: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
8290: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
82a0: 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
82b0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
82c0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
82d0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
82e0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
82f0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
8300: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
8310: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
8320: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
8330: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
8340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8350: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
8360: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
8370: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
8380: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
8390: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
83a0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
83b0: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
83c0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
83d0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
83e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
83f0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
8400: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
8410: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
8420: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
8430: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74   );..  /* Lock t
8440: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
8450: 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20  byte if we need 
8460: 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e  to acquire a PEN
8470: 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a  DING lock or.  *
8480: 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  * a SHARED lock.
8490: 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75    If we are acqu
84a0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
84b0: 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69  ock, the acquisi
84c0: 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65  tion of.  ** the
84d0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
84e0: 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e  te is temporary.
84f0: 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74  .  */.  newLockt
8500: 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
8510: 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46 69  ktype;.  if( pFi
8520: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
8530: 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63  _LOCK.   || (loc
8540: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
8550: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
8560: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
8570: 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  ED_LOCK).  ){.  
8580: 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
8590: 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
85a0: 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b  0 && (res = Lock
85b0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
85c0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
85d0: 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  1, 0))==0 ){.   
85e0: 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65     /* Try 3 time
85f0: 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e  s to get the pen
8600: 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20  ding lock.  The 
8610: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67  pending lock mig
8620: 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68  ht be.      ** h
8630: 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72  eld by another r
8640: 65 61 64 65 72 20 70 72 6f 63 65 73 73 20 77 68  eader process wh
8650: 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69  o will release i
8660: 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20  t momentarily.. 
8670: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52       */.      TR
8680: 41 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f 74 20  ACE2("could not 
8690: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  get a PENDING lo
86a0: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63  ck. cnt=%d\n", c
86b0: 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c 65 65 70  nt);.      Sleep
86c0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  (1);.    }.    g
86d0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
86e0: 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  res;.  }..  /* A
86f0: 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
8700: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
8710: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
8720: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
8730: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
8740: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
8750: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
8760: 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
8770: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
8780: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
8790: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
87a0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
87b0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
87c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
87d0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
87e0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
87f0: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
8800: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
8810: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
8820: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
8830: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
8840: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
8850: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
8860: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
8870: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
8880: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
8890: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
88a0: 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
88b0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
88c0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
88d0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
88e0: 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74   ){.    newLockt
88f0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
8900: 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69  CK;.    gotPendi
8910: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  ngLock = 0;.  }.
8920: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e  .  /* Acquire an
8930: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a   EXCLUSIVE lock.
8940: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
8950: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
8960: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
8970: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
8980: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45  >locktype>=SHARE
8990: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
89a0: 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  s = unlockReadLo
89b0: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 54  ck(pFile);.    T
89c0: 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c 6f 63  RACE2("unreadloc
89d0: 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 3b  k = %d\n", res);
89e0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
89f0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
8a00: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
8a10: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
8a20: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
8a30: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
8a40: 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
8a50: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
8a60: 20 20 20 20 54 52 41 43 45 32 28 22 65 72 72 6f      TRACE2("erro
8a70: 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20  r-code = %d\n", 
8a80: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  GetLastError());
8a90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8aa0: 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
8ab0: 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
8ac0: 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
8ad0: 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
8ae0: 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
8af0: 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
8b00: 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
8b10: 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
8b20: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
8b30: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
8b40: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
8b50: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
8b60: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
8b70: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
8b80: 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e  lock has held in
8b90: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
8ba0: 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72  ptor then.  ** r
8bb0: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
8bc0: 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64  riate result cod
8bd0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  e..  */.  if( re
8be0: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  s ){.    rc = SQ
8bf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
8c00: 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22 4c 4f  {.    TRACE4("LO
8c10: 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79  CK FAILED %d try
8c20: 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67  ing for %d but g
8c30: 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ot %d\n", pFile-
8c40: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
8c50: 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
8c60: 74 79 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  type);.    rc = 
8c70: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
8c80: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
8c90: 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79 70 65  pe = newLocktype
8ca0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8cb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8cc0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
8cd0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
8ce0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
8cf0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
8d00: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
8d10: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
8d20: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
8d30: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
8d40: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
8d50: 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a  otherwise zero..
8d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
8d70: 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
8d80: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  ck(OsFile *id){.
8d90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
8da0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
8db0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  nFile*)id;.  ass
8dc0: 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
8dd0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
8de0: 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
8df0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  _LOCK ){.    rc 
8e00: 3d 20 31 3b 0a 20 20 20 20 54 52 41 43 45 33 28  = 1;.    TRACE3(
8e10: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
8e20: 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20   %d (local)\n", 
8e30: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20  pFile->h, rc);. 
8e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
8e50: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
8e60: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
8e70: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
8e80: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8e90: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
8ea0: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
8eb0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
8ec0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
8ed0: 63 3b 0a 20 20 20 20 54 52 41 43 45 33 28 22 54  c;.    TRACE3("T
8ee0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
8ef0: 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
8f00: 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20  File->h, rc);.  
8f10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8f20: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
8f30: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
8f40: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
8f50: 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
8f60: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
8f70: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
8f80: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
8f90: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
8fa0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
8fb0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
8fc0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
8fd0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
8fe0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
8ff0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
9000: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9010: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
9020: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
9030: 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
9040: 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
9050: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9060: 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
9070: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
9080: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
9090: 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
90a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
90b0: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
90c0: 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
90d0: 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
90e0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
90f0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
9100: 20 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 63 20   type;.  int rc 
9110: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 77  = SQLITE_OK;.  w
9120: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
9130: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
9140: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
9150: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
9160: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
9170: 4f 43 4b 20 29 3b 0a 20 20 54 52 41 43 45 35 28  OCK );.  TRACE5(
9180: 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64  "UNLOCK %d to %d
9190: 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20   was %d(%d)\n", 
91a0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
91b0: 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46  pe,.          pF
91c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
91d0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
91e0: 42 79 74 65 29 3b 0a 20 20 74 79 70 65 20 3d 20  Byte);.  type = 
91f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
9200: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
9210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
9220: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
9230: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
9240: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
9250: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
9260: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
9270: 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
9280: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
9290: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
92a0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
92b0: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
92c0: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
92d0: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
92e0: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
92f0: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
9300: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
9310: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
9320: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
9330: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b  CK ){.    Unlock
9340: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
9350: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
9360: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
9370: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
9380: 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
9390: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
93a0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  unlockReadLock(p
93b0: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
93c0: 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
93d0: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
93e0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
93f0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
9400: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
9410: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
9420: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
9430: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9440: 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
9450: 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
9460: 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
9470: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
9480: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20  .** to the full 
9490: 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20  pathname stored 
94a0: 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  in space obtaine
94b0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
94c0: 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61  loc()..** The ca
94d0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  lling function i
94e0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
94f0: 72 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73  r freeing this s
9500: 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20  pace once it.** 
9510: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65  is no longer nee
9520: 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ded..*/.char *sq
9530: 6c 69 74 65 33 57 69 6e 46 75 6c 6c 50 61 74 68  lite3WinFullPath
9540: 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
9550: 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20 20 63  *zRelative){.  c
9560: 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 23 69 66 20  har *zFull;.#if 
9570: 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
9580: 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  __).  int nByte;
9590: 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65  .  nByte = strle
95a0: 6e 28 7a 52 65 6c 61 74 69 76 65 29 20 2b 20 4d  n(zRelative) + M
95b0: 41 58 5f 50 41 54 48 20 2b 20 31 30 30 31 3b 0a  AX_PATH + 1001;.
95c0: 20 20 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65    zFull = sqlite
95d0: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
95e0: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20  .  if( zFull==0 
95f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
9600: 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f  ( cygwin_conv_to
9610: 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68  _full_win32_path
9620: 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c  (zRelative, zFul
9630: 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  l) ) return 0;.#
9640: 65 6c 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  elif OS_WINCE.  
9650: 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
9660: 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
9670: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
9680: 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
9690: 20 2a 2f 0a 20 20 7a 46 75 6c 6c 20 3d 20 73 71   */.  zFull = sq
96a0: 6c 69 74 65 53 74 72 44 75 70 28 7a 52 65 6c 61  liteStrDup(zRela
96b0: 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69  tive);.#else.  i
96c0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  nt nByte;.  void
96d0: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
96e0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
96f0: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
9700: 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
9710: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
9720: 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 2c 20 2a   WCHAR *zTemp, *
9730: 7a 4e 6f 74 55 73 65 64 57 3b 0a 20 20 20 20 6e  zNotUsedW;.    n
9740: 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61  Byte = GetFullPa
9750: 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29  thNameW((WCHAR*)
9760: 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
9770: 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29 20 2b 20  , &zNotUsedW) + 
9780: 31 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  1;.    zTemp = s
9790: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
97a0: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
97b0: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
97c0: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
97d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e   sqliteFree(zCon
97e0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
97f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
9800: 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61     GetFullPathNa
9810: 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  meW((WCHAR*)zCon
9820: 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
9830: 54 65 6d 70 2c 20 26 7a 4e 6f 74 55 73 65 64 57  Temp, &zNotUsedW
9840: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
9850: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
9860: 20 20 20 7a 46 75 6c 6c 20 3d 20 75 6e 69 63 6f     zFull = unico
9870: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  deToUtf8(zTemp);
9880: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
9890: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
98a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
98b0: 2c 20 2a 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 20  , *zNotUsed;.   
98c0: 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c   nByte = GetFull
98d0: 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
98e0: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
98f0: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 20 2b 20  0, &zNotUsed) + 
9900: 31 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  1;.    zTemp = s
9910: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
9920: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
9930: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
9940: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
9950: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e   sqliteFree(zCon
9960: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
9970: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
9980: 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61     GetFullPathNa
9990: 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
99a0: 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
99b0: 65 6d 70 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  emp, &zNotUsed);
99c0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
99d0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
99e0: 20 7a 46 75 6c 6c 20 3d 20 6d 62 63 73 54 6f 55   zFull = mbcsToU
99f0: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
9a00: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70  sqliteFree(zTemp
9a10: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
9a20: 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a  return zFull;.}.
9a30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 75 6c 6c 53  ./*.** The fullS
9a40: 79 6e 63 20 6f 70 74 69 6f 6e 20 69 73 20 6d 65  ync option is me
9a50: 61 6e 69 6e 67 6c 65 73 73 20 6f 6e 20 77 69 6e  aningless on win
9a60: 64 6f 77 73 2e 20 20 20 54 68 69 73 20 69 73 20  dows.   This is 
9a70: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
9a80: 69 63 20 76 6f 69 64 20 77 69 6e 53 65 74 46 75  ic void winSetFu
9a90: 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69  llSync(OsFile *i
9aa0: 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20 72 65 74  d, int v){.  ret
9ab0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  urn;.}../*.** Re
9ac0: 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72 6c 79  turn the underly
9ad0: 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ing file handle 
9ae0: 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2f  for an OsFile.*/
9af0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
9b00: 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46 69 6c 65  ileHandle(OsFile
9b10: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
9b20: 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29  (int)((winFile*)
9b30: 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  id)->h;.}../*.**
9b40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
9b50: 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  er that indices 
9b60: 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b  the type of lock
9b70: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a   currently held.
9b80: 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c  ** by this handl
9b90: 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74 65  e.  (Used for te
9ba0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
9bb0: 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61  is only.).*/.sta
9bc0: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 53  tic int winLockS
9bd0: 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  tate(OsFile *id)
9be0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 77 69 6e  {.  return ((win
9bf0: 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74  File*)id)->lockt
9c00: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype;.}../*.** Th
9c10: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
9c20: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
9c30: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
9c40: 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a  te on an OsFile.
9c50: 2a 2a 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  ** for win32..*/
9c60: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f  .static const Io
9c70: 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 57 69  Method sqlite3Wi
9c80: 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
9c90: 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 4f  winClose,.  winO
9ca0: 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20  penDirectory,.  
9cb0: 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57 72  winRead,.  winWr
9cc0: 69 74 65 2c 0a 20 20 77 69 6e 53 65 65 6b 2c 0a  ite,.  winSeek,.
9cd0: 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20    winTruncate,. 
9ce0: 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 53   winSync,.  winS
9cf0: 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 77 69  etFullSync,.  wi
9d00: 6e 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 77  nFileHandle,.  w
9d10: 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69  inFileSize,.  wi
9d20: 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f  nLock,.  winUnlo
9d30: 63 6b 2c 0a 20 20 77 69 6e 4c 6f 63 6b 53 74 61  ck,.  winLockSta
9d40: 74 65 2c 0a 20 20 77 69 6e 43 68 65 63 6b 52 65  te,.  winCheckRe
9d50: 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a  servedLock,.};..
9d60: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
9d70: 65 6d 6f 72 79 20 66 6f 72 20 61 6e 20 4f 73 46  emory for an OsF
9d80: 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ile.  Initialize
9d90: 20 74 68 65 20 6e 65 77 20 4f 73 46 69 6c 65 0a   the new OsFile.
9da0: 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ** to the value 
9db0: 67 69 76 65 6e 20 69 6e 20 70 49 6e 69 74 20 61  given in pInit a
9dc0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9dd0: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
9de0: 2a 20 4f 73 46 69 6c 65 2e 20 20 49 66 20 77 65  * OsFile.  If we
9df0: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
9e00: 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ry, close the fi
9e10: 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  le and return NU
9e20: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
9e30: 74 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c  t allocateWinFil
9e40: 65 28 77 69 6e 46 69 6c 65 20 2a 70 49 6e 69 74  e(winFile *pInit
9e50: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  , OsFile **pId){
9e60: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 4e 65 77  .  winFile *pNew
9e70: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
9e80: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
9e90: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
9ea0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 43  pNew==0 ){.    C
9eb0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 49 6e 69 74  loseHandle(pInit
9ec0: 2d 3e 68 29 3b 0a 23 69 66 20 4f 53 5f 57 49 4e  ->h);.#if OS_WIN
9ed0: 43 45 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  CE.    sqliteFre
9ee0: 65 28 70 49 6e 69 74 2d 3e 7a 44 65 6c 65 74 65  e(pInit->zDelete
9ef0: 4f 6e 43 6c 6f 73 65 29 3b 0a 23 65 6e 64 69 66  OnClose);.#endif
9f00: 0a 20 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20  .    *pId = 0;. 
9f10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
9f30: 0a 20 20 20 20 2a 70 4e 65 77 20 3d 20 2a 70 49  .    *pNew = *pI
9f40: 6e 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  nit;.    pNew->p
9f50: 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
9f60: 33 57 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  3WinIoMethod;.  
9f70: 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 74 79 70 65    pNew->locktype
9f80: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
9f90: 70 4e 65 77 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  pNew->sharedLock
9fa0: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Byte = 0;.    *p
9fb0: 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e  Id = (OsFile*)pN
9fc0: 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ew;.    OpenCoun
9fd0: 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 72 65 74  ter(+1);.    ret
9fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9ff0: 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a   }.}...#endif /*
a000: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
a010: 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  KIO */./********
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 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ***.** Everythin
a070: 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69  g above deals wi
a080: 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76  th file I/O.  Ev
a090: 65 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f  erything that fo
a0a0: 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77  llows deals.** w
a0b0: 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c  ith other miscel
a0c0: 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f  lanous aspects o
a0d0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
a0e0: 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
a0f0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
a100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
a140: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a150: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
a160: 54 45 4e 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 49  TENSION)./*.** I
a170: 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
a180: 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
a190: 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
a1a0: 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
a1b0: 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
a1c0: 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
a1d0: 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
a1e0: 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 76 6f  d library..*/.vo
a1f0: 69 64 20 2a 73 71 6c 69 74 65 33 57 69 6e 44 6c  id *sqlite3WinDl
a200: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
a210: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
a220: 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
a230: 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
a240: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
a250: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
a260: 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
a270: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a280: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  0;.  }.  if( isN
a290: 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c  T() ){.    h = L
a2a0: 6f 61 64 4c 69 62 72 61 72 79 57 28 28 57 43 48  oadLibraryW((WCH
a2b0: 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  AR*)zConverted);
a2c0: 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53  .  }else{.#if OS
a2d0: 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72  _WINCE.    retur
a2e0: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68  n 0;.#else.    h
a2f0: 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   = LoadLibraryA(
a300: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
a310: 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
a320: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e   sqliteFree(zCon
a330: 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
a340: 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 20 20 0a 7d  n (void*)h;.  .}
a350: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 57 69  .void *sqlite3Wi
a360: 6e 44 6c 73 79 6d 28 76 6f 69 64 20 2a 70 48 61  nDlsym(void *pHa
a370: 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
a380: 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 23 69 66 20   *zSymbol){.#if 
a390: 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68  OS_WINCE.  /* Th
a3a0: 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  e GetProcAddress
a3b0: 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  A() routine is o
a3c0: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
a3d0: 20 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74   wince. */.  ret
a3e0: 75 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72 65  urn GetProcAddre
a3f0: 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ssA((HANDLE)pHan
a400: 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23  dle, zSymbol);.#
a410: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
a420: 68 65 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74  her windows plat
a430: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
a440: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
a450: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e   take.  ** an An
a460: 73 69 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  si string regard
a470: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
a480: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
a490: 20 20 72 65 74 75 72 6e 20 47 65 74 50 72 6f 63    return GetProc
a4a0: 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c 45 29  Address((HANDLE)
a4b0: 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c  pHandle, zSymbol
a4c0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 69 6e 74 20  );.#endif.}.int 
a4d0: 73 71 6c 69 74 65 33 57 69 6e 44 6c 63 6c 6f 73  sqlite3WinDlclos
a4e0: 65 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  e(void *pHandle)
a4f0: 7b 0a 20 20 72 65 74 75 72 6e 20 46 72 65 65 4c  {.  return FreeL
a500: 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
a510: 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69  Handle);.}.#endi
a520: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
a530: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
a540: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69   */../*.** Get i
a550: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65  nformation to se
a560: 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75  ed the random nu
a570: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20  mber generator. 
a580: 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20   The seed.** is 
a590: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
a5a0: 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36   buffer zBuf[256
a5b0: 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ].  The calling 
a5c0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a  function must.**
a5d0: 20 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63   supply a suffic
a5e0: 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66  iently large buf
a5f0: 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fer..*/.int sqli
a600: 74 65 33 57 69 6e 52 61 6e 64 6f 6d 53 65 65 64  te3WinRandomSeed
a610: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
a620: 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
a630: 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
a640: 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
a650: 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
a660: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
a670: 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
a680: 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
a690: 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
a6a0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
a6b0: 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
a6c0: 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
a6d0: 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
a6e0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
a6f0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
a700: 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
a710: 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
a720: 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
a730: 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
a740: 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
a750: 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
a760: 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
a770: 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
a780: 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
a790: 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
a7a0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
a7b0: 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
a7c0: 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
a7d0: 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
a7e0: 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
a7f0: 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
a800: 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
a810: 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
a820: 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
a830: 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
a840: 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
a850: 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
a860: 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.* This makes 
a870: 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
a880: 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
a890: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
a8a0: 2c 20 32 35 36 29 3b 0a 20 20 47 65 74 53 79 73  , 256);.  GetSys
a8b0: 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53 54 45  temTime((LPSYSTE
a8c0: 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20 20 72  MTIME)zBuf);.  r
a8d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
a8f0: 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
a900: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
a910: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
a920: 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
a930: 69 74 65 33 57 69 6e 53 6c 65 65 70 28 69 6e 74  ite3WinSleep(int
a940: 20 6d 73 29 7b 0a 20 20 53 6c 65 65 70 28 6d 73   ms){.  Sleep(ms
a950: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
a960: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20  }../*.** Static 
a970: 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66  variables used f
a980: 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72  or thread synchr
a990: 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  onization.*/.sta
a9a0: 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20  tic int inMutex 
a9b0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
a9c0: 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20  TE_W32_THREADS. 
a9d0: 20 73 74 61 74 69 63 20 44 57 4f 52 44 20 6d 75   static DWORD mu
a9e0: 74 65 78 4f 77 6e 65 72 3b 0a 20 20 73 74 61 74  texOwner;.  stat
a9f0: 69 63 20 43 52 49 54 49 43 41 4c 5f 53 45 43 54  ic CRITICAL_SECT
aa00: 49 4f 4e 20 63 73 3b 0a 23 65 6e 64 69 66 0a 0a  ION cs;.#endif..
aa10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
aa20: 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74  ing pair of rout
aa30: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  ines implement m
aa40: 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20  utual exclusion 
aa50: 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72  for.** multi-thr
aa60: 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e  eaded processes.
aa70: 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
aa80: 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65  thread is allowe
aa90: 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64  d to.** executed
aaa0: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75   code that is su
aab0: 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65  rrounded by Ente
aac0: 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61  rMutex() and Lea
aad0: 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a  veMutex()..**.**
aae0: 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c   SQLite uses onl
aaf0: 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78  y a single Mutex
ab00: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20  .  There is not 
ab10: 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a  much critical.**
ab20: 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c   code and what l
ab30: 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65  ittle there is e
ab40: 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20  xecutes quickly 
ab50: 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63  and without bloc
ab60: 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73  king..**.** Vers
ab70: 69 6f 6e 20 33 2e 33 2e 31 20 61 6e 64 20 65 61  ion 3.3.1 and ea
ab80: 72 6c 69 65 72 20 75 73 65 64 20 61 20 73 69 6d  rlier used a sim
ab90: 70 6c 65 20 6d 75 74 65 78 2e 20 20 42 65 67 69  ple mutex.  Begi
aba0: 6e 6e 69 6e 67 20 77 69 74 68 0a 2a 2a 20 76 65  nning with.** ve
abb0: 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 61 20 72  rsion 3.3.2, a r
abc0: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 69  ecursive mutex i
abd0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  s required..*/.v
abe0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 45 6e  oid sqlite3WinEn
abf0: 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64  terMutex(){.#ifd
ac00: 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48  ef SQLITE_W32_TH
ac10: 52 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 69  READS.  static i
ac20: 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  nt isInit = 0;. 
ac30: 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20   while( !isInit 
ac40: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f  ){.    static lo
ac50: 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  ng lock = 0;.   
ac60: 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64   if( Interlocked
ac70: 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29  Increment(&lock)
ac80: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69  ==1 ){.      Ini
ac90: 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53  tializeCriticalS
aca0: 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20  ection(&cs);.   
acb0: 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20     isInit = 1;. 
acc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
acd0: 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  Sleep(1);.    }.
ace0: 20 20 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69    }.  EnterCriti
acf0: 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b  calSection(&cs);
ad00: 0a 20 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20  .  mutexOwner = 
ad10: 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64  GetCurrentThread
ad20: 49 64 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Id();.#endif.  i
ad30: 6e 4d 75 74 65 78 2b 2b 3b 0a 7d 0a 76 6f 69 64  nMutex++;.}.void
ad40: 20 73 71 6c 69 74 65 33 57 69 6e 4c 65 61 76 65   sqlite3WinLeave
ad50: 4d 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72  Mutex(){.  asser
ad60: 74 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20  t( inMutex );.  
ad70: 69 6e 4d 75 74 65 78 2d 2d 3b 0a 23 69 66 64 65  inMutex--;.#ifde
ad80: 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52  f SQLITE_W32_THR
ad90: 45 41 44 53 0a 20 20 61 73 73 65 72 74 28 20 6d  EADS.  assert( m
ada0: 75 74 65 78 4f 77 6e 65 72 3d 3d 47 65 74 43 75  utexOwner==GetCu
adb0: 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 20  rrentThreadId() 
adc0: 29 3b 0a 20 20 4c 65 61 76 65 43 72 69 74 69 63  );.  LeaveCritic
add0: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a  alSection(&cs);.
ade0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
adf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
ae00: 68 65 20 6d 75 74 65 78 20 69 73 20 63 75 72 72  he mutex is curr
ae10: 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  ently held..**.*
ae20: 2a 20 49 66 20 74 68 65 20 74 68 69 73 54 68 72  * If the thisThr
ae30: 65 61 64 4f 6e 6c 79 20 70 61 72 61 6d 65 74 65  eadOnly paramete
ae40: 72 20 69 73 20 74 72 75 65 2c 20 72 65 74 75 72  r is true, retur
ae50: 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e  n true if and on
ae60: 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ly if the.** cal
ae70: 6c 69 6e 67 20 74 68 72 65 61 64 20 68 6f 6c 64  ling thread hold
ae80: 73 20 74 68 65 20 6d 75 74 65 78 2e 20 20 49 66  s the mutex.  If
ae90: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
aea0: 73 20 66 61 6c 73 65 2c 20 72 65 74 75 72 6e 0a  s false, return.
aeb0: 2a 2a 20 74 72 75 65 20 69 66 20 61 6e 79 20 74  ** true if any t
aec0: 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20  hread holds the 
aed0: 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mutex..*/.int sq
aee0: 6c 69 74 65 33 57 69 6e 49 6e 4d 75 74 65 78 28  lite3WinInMutex(
aef0: 69 6e 74 20 74 68 69 73 54 68 72 65 61 64 4f 6e  int thisThreadOn
af00: 6c 79 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ly){.#ifdef SQLI
af10: 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20  TE_W32_THREADS. 
af20: 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78 3e   return inMutex>
af30: 30 20 26 26 20 28 74 68 69 73 54 68 72 65 61 64  0 && (thisThread
af40: 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 6d 75 74 65 78  Only==0 || mutex
af50: 4f 77 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e  Owner==GetCurren
af60: 74 54 68 72 65 61 64 49 64 28 29 29 3b 0a 23 65  tThreadId());.#e
af70: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d  lse.  return inM
af80: 75 74 65 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d  utex>0;.#endif.}
af90: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
afa0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
afb0: 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
afc0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63  -zero value, bec
afd0: 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  omes the result.
afe0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ** returned from
aff0: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
b000: 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69  tTime().  This i
b010: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
b020: 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
b030: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
b040: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
b050: 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  me = 0;.#endif..
b060: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
b070: 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
b080: 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
b090: 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
b0a0: 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
b0b0: 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
b0c0: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
b0d0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
b0e0: 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
b0f0: 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
b100: 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
b110: 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
b120: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
b130: 74 65 33 57 69 6e 43 75 72 72 65 6e 74 54 69 6d  te3WinCurrentTim
b140: 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  e(double *prNow)
b150: 7b 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b  {.  FILETIME ft;
b160: 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73  .  /* FILETIME s
b170: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34  tructure is a 64
b180: 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65  -bit value repre
b190: 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62  senting the numb
b1a0: 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d  er of .     100-
b1b0: 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
b1c0: 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
b1d0: 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
b1e0: 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20   2305813.5). .  
b1f0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b  */.  double now;
b200: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
b210: 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b  SYSTEMTIME time;
b220: 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65  .  GetSystemTime
b230: 28 26 74 69 6d 65 29 3b 0a 20 20 53 79 73 74 65  (&time);.  Syste
b240: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
b250: 26 74 69 6d 65 2c 26 66 74 29 3b 0a 23 65 6c 73  &time,&ft);.#els
b260: 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d  e.  GetSystemTim
b270: 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
b280: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6e 6f 77   );.#endif.  now
b290: 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64   = ((double)ft.d
b2a0: 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a  wHighDateTime) *
b2b0: 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a   4294967296.0; .
b2c0: 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20    *prNow = (now 
b2d0: 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  + ft.dwLowDateTi
b2e0: 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30 30 30  me)/864000000000
b2f0: 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a  .0 + 2305813.5;.
b300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
b310: 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
b320: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
b330: 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71  .    *prNow = sq
b340: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
b350: 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34  me/86400.0 + 244
b360: 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64  0587.5;.  }.#end
b370: 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  if.  return 0;.}
b380: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
b390: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
b3a0: 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64  hread-specific-d
b3b0: 61 74 61 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63  ata blocks alloc
b3c0: 61 74 65 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69  ated..** Use thi
b3d0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
b3e0: 20 77 65 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b   we are not leak
b3f0: 69 6e 67 20 74 68 72 65 61 64 2d 73 70 65 63 69  ing thread-speci
b400: 66 69 63 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63  fic-data..** Tic
b410: 6b 65 74 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66  ket #1601.*/.#if
b420: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
b430: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 73 64 5f  int sqlite3_tsd_
b440: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 20 64 65 66  count = 0;.# def
b450: 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f  ine TSD_COUNTER_
b460: 49 4e 43 52 20 49 6e 74 65 72 6c 6f 63 6b 65 64  INCR Interlocked
b470: 49 6e 63 72 65 6d 65 6e 74 28 26 73 71 6c 69 74  Increment(&sqlit
b480: 65 33 5f 74 73 64 5f 63 6f 75 6e 74 29 0a 23 20  e3_tsd_count).# 
b490: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
b4a0: 45 52 5f 44 45 43 52 20 49 6e 74 65 72 6c 6f 63  ER_DECR Interloc
b4b0: 6b 65 64 44 65 63 72 65 6d 65 6e 74 28 26 73 71  kedDecrement(&sq
b4c0: 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 29  lite3_tsd_count)
b4d0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
b4e0: 54 53 44 5f 43 4f 55 4e 54 45 52 5f 49 4e 43 52  TSD_COUNTER_INCR
b4f0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20    /* no-op */.# 
b500: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
b510: 45 52 5f 44 45 43 52 20 20 2f 2a 20 6e 6f 2d 6f  ER_DECR  /* no-o
b520: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  p */.#endif..../
b530: 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77  *.** If called w
b540: 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67  ith allocateFlag
b550: 3e 31 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  >1, then return 
b560: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 72  a pointer to thr
b570: 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  ead.** specific 
b580: 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
b590: 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 41 6c  rent thread.  Al
b5a0: 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20  locate and zero 
b5b0: 74 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73 70  the.** thread-sp
b5c0: 65 63 69 66 69 63 20 64 61 74 61 20 69 66 20 69  ecific data if i
b5d0: 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
b5e0: 64 79 20 65 78 69 73 74 20 6e 65 63 65 73 73 61  dy exist necessa
b5f0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  ry..**.** If cal
b600: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
b610: 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 63  eFlag==0, then c
b620: 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
b630: 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69   thread.** speci
b640: 66 69 63 20 64 61 74 61 2e 20 20 52 65 74 75 72  fic data.  Retur
b650: 6e 20 69 74 20 69 66 20 69 74 20 65 78 69 73 74  n it if it exist
b660: 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  s.  If it does n
b670: 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 68 65  ot exist,.** the
b680: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
b690: 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77  *.** If called w
b6a0: 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67  ith allocateFlag
b6b0: 3c 30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  <0, check to see
b6c0: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 73   if the thread s
b6d0: 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
b6e0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
b6f0: 20 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20 49   is all zero.  I
b700: 66 20 69 74 20 69 73 20 74 68 65 6e 20 64 65 61  f it is then dea
b710: 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a 20 52  llocate it..** R
b720: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b730: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 73 70  to the thread sp
b740: 65 63 69 66 69 63 20 64 61 74 61 20 6f 72 20 4e  ecific data or N
b750: 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  ULL if it is.** 
b760: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 67  unallocated or g
b770: 65 74 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  ets deallocated.
b780: 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74 61 20 2a  .*/.ThreadData *
b790: 73 71 6c 69 74 65 33 57 69 6e 54 68 72 65 61 64  sqlite3WinThread
b7a0: 53 70 65 63 69 66 69 63 44 61 74 61 28 69 6e 74  SpecificData(int
b7b0: 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 29 7b 0a   allocateFlag){.
b7c0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79    static int key
b7d0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b  ;.  static int k
b7e0: 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 74  eyInit = 0;.  st
b7f0: 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65 61  atic const Threa
b800: 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20 3d  dData zeroData =
b810: 20 7b 30 7d 3b 0a 20 20 54 68 72 65 61 64 44 61   {0};.  ThreadDa
b820: 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28  ta *pTsd;..  if(
b830: 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20   !keyInit ){.   
b840: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
b850: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
b860: 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20  !keyInit ){.    
b870: 20 20 6b 65 79 20 3d 20 54 6c 73 41 6c 6c 6f 63    key = TlsAlloc
b880: 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 65  ();.      if( ke
b890: 79 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  y==0xffffffff ){
b8a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b8b0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
b8c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
b8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b8e0: 6b 65 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  keyInit = 1;.   
b8f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
b900: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
b910: 7d 0a 20 20 70 54 73 64 20 3d 20 54 6c 73 47 65  }.  pTsd = TlsGe
b920: 74 56 61 6c 75 65 28 6b 65 79 29 3b 0a 20 20 69  tValue(key);.  i
b930: 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e  f( allocateFlag>
b940: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 54  0 ){.    if( !pT
b950: 73 64 20 29 7b 0a 20 20 20 20 20 20 70 54 73 64  sd ){.      pTsd
b960: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c   = sqlite3OsMall
b970: 6f 63 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f 44  oc( sizeof(zeroD
b980: 61 74 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ata) );.      if
b990: 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20  ( pTsd ){.      
b9a0: 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61    *pTsd = zeroDa
b9b0: 74 61 3b 0a 20 20 20 20 20 20 20 20 54 6c 73 53  ta;.        TlsS
b9c0: 65 74 56 61 6c 75 65 28 6b 65 79 2c 20 70 54 73  etValue(key, pTs
b9d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 54 53 44 5f  d);.        TSD_
b9e0: 43 4f 55 4e 54 45 52 5f 49 4e 43 52 3b 0a 20 20  COUNTER_INCR;.  
b9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
ba00: 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30 20  lse if( pTsd!=0 
ba10: 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c  && allocateFlag<
ba20: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
ba30: 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c   && memcmp(pTsd,
ba40: 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65   &zeroData, size
ba50: 6f 66 28 54 68 72 65 61 64 44 61 74 61 29 29 3d  of(ThreadData))=
ba60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
ba70: 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20  3OsFree(pTsd);. 
ba80: 20 20 20 54 6c 73 53 65 74 56 61 6c 75 65 28 6b     TlsSetValue(k
ba90: 65 79 2c 20 30 29 3b 0a 20 20 20 20 54 53 44 5f  ey, 0);.    TSD_
baa0: 43 4f 55 4e 54 45 52 5f 44 45 43 52 3b 0a 20 20  COUNTER_DECR;.  
bab0: 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a    pTsd = 0;.  }.
bac0: 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 7d    return pTsd;.}
bad0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49  .#endif /* OS_WI
bae0: 4e 20 2a 2f 0a                                   N */.