/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact e94903c7dc1c0599c8ddce42efa0b6928068ddc5:


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 20 64 65 66 69 6e 65  WINCE 1.# define
03d0: 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49   AreFileApisANSI
03e0: 28 29 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  () 1.#else.# def
03f0: 69 6e 65 20 4f 53 5f 57 49 4e 43 45 20 30 0a 23  ine OS_WINCE 0.#
0400: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
0410: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
0420: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
0430: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
0440: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
0450: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
0460: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
0470: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 74 79 70  #if OS_WINCE.typ
0480: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
0490: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
04a0: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
04b0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
04c0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
04d0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
04e0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
04f0: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
0500: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0510: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
0520: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
0530: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
0540: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
0550: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0560: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
0570: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
0580: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
0590: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
05a0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
05b0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
05c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
05d0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
05e0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 4f   a subclass of O
05f0: 73 46 69 6c 65 20 73 70 65 63 69 66 69 63 20 74  sFile specific t
0600: 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70  o the win32.** p
0610: 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72  ortability layer
0620: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0630: 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46  uct winFile winF
0640: 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46  ile;.struct winF
0650: 69 6c 65 20 7b 0a 20 20 49 6f 4d 65 74 68 6f 64  ile {.  IoMethod
0660: 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b   const *pMethod;
0670: 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  /* Must be first
0680: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
06a0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
06b0: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
06c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
06d0: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
06e0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
06f0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0700: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0710: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0720: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0730: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0740: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0750: 63 6b 20 2a 2f 0a 23 69 66 20 4f 53 5f 57 49 4e  ck */.#if OS_WIN
0760: 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44 65 6c  CE.  WCHAR *zDel
0770: 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20  eteOnClose;  /* 
0780: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
0790: 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f 73  delete when clos
07a0: 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ing */.  HANDLE 
07b0: 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  hMutex;         
07c0: 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20 74   /* Mutex used t
07d0: 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
07e0: 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b 20   to shared lock 
07f0: 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68 53  */  .  HANDLE hS
0800: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f  hared;         /
0810: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
0820: 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72  segment used for
0830: 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69   locking */.  wi
0840: 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20  nceLock local;  
0850: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f        /* Locks o
0860: 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20  btained by this 
0870: 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46  instance of winF
0880: 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ile */.  winceLo
0890: 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20  ck *shared;     
08a0: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65   /* Global share
08b0: 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f  d lock memory fo
08c0: 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23  r the file  */.#
08d0: 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  endif.};.../*.**
08e0: 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   Do not include 
08f0: 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c 65 20  any of the File 
0900: 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20 70 72  I/O interface pr
0910: 6f 63 65 64 75 72 65 73 20 69 66 20 74 68 65 0a  ocedures if the.
0920: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ** SQLITE_OMIT_D
0930: 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73 20 64  ISKIO macro is d
0940: 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61 74 69  efined (indicati
0950: 6e 67 20 74 68 61 74 20 74 68 65 72 65 20 64 61  ng that there da
0960: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0970: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0980: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0990: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
09a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
09b0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73  wing variable is
09c0: 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20   (normally) set 
09d0: 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63  once and never c
09e0: 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61  hanges.** therea
09f0: 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64  fter.  It record
0a00: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70  s whether the op
0a10: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
0a20: 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57 69  s Win95.** or Wi
0a30: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20  nNT..**.** 0:   
0a40: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
0a50: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20   unknown..** 1: 
0a60: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
0a70: 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a 20  em is Win95..** 
0a80: 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  2:   Operating s
0a90: 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a  ystem is WinNT..
0aa0: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74  **.** In order t
0ab0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73  o facilitate tes
0ac0: 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20  ting on a WinNT 
0ad0: 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74  system, the test
0ae0: 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20   fixture.** can 
0af0: 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69  manually set thi
0b00: 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20  s value to 1 to 
0b10: 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65  emulate Win98 be
0b20: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
0b30: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
0b40: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   0;../*.** Retur
0b50: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
0b60: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
0b70: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
0b80: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
0b90: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
0ba0: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
0bb0: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
0bc0: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
0bd0: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
0be0: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
0bf0: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
0c00: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
0c10: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
0c20: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
0c30: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
0c40: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
0c50: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
0c60: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
0c70: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
0c80: 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39  win running Win9
0c90: 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c  5/98/ME.  A call
0ca0: 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
0cb0: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
0cc0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
0cd0: 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38  host is Win95/98
0ce0: 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f  /ME or.** WinNT/
0cf0: 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65  2K/XP so that we
0d00: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68   will know wheth
0d10: 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e  er or not we can
0d20: 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20   safely call.** 
0d30: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
0d40: 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f   API..*/.#if OS_
0d50: 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69  WINCE.# define i
0d60: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65  sNT()  (1).#else
0d70: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
0d80: 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66  NT(void){.    if
0d90: 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  ( sqlite3_os_typ
0da0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53  e==0 ){.      OS
0db0: 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66  VERSIONINFO sInf
0dc0: 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64  o;.      sInfo.d
0dd0: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
0de0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
0df0: 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72  o);.      GetVer
0e00: 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a  sionEx(&sInfo);.
0e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73        sqlite3_os
0e20: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  _type = sInfo.dw
0e30: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
0e40: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
0e50: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d  T ? 2 : 1;.    }
0e60: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0e70: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a  te3_os_type==2;.
0e80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53    }.#endif /* OS
0e90: 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINCE */../*.**
0ea0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
0eb0: 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f   string to micro
0ec0: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55 54  soft unicode (UT
0ed0: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
0ee0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
0ef0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
0f00: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0f10: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e 0a  m sqliteMalloc..
0f20: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
0f30: 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  *utf8ToUnicode(c
0f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0f50: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
0f60: 61 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69  ar;.  WCHAR *zWi
0f70: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
0f80: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
0f90: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
0fa0: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
0fb0: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
0fc0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
0fd0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
0fe0: 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69  nChar*sizeof(zWi
0ff0: 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  deFilename[0]) )
1000: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c  ;.  if( zWideFil
1010: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
1020: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1030: 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
1040: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
1050: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
1060: 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
1070: 6e 61 6d 65 2c 20 6e 43 68 61 72 29 3b 0a 20 20  name, nChar);.  
1080: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
1090: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
10a0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
10b0: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
10c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10d0: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
10e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
10f0: 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69  rt microsoft uni
1100: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
1110: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1120: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
1130: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
1140: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1150: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
1160: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55  char *unicodeToU
1170: 74 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20  tf8(const WCHAR 
1180: 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b  *zWideFilename){
1190: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
11a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
11b0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65  ..  nByte = Wide
11c0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
11d0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
11e0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
11f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46  , 0, 0, 0);.  zF
1200: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
1210: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
1220: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1230: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1240: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
1250: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1260: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
1270: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1280: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
1290: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
12c0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
12d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
12e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
12f0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
1300: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
1310: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
1320: 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73 69 20  Convert an ansi 
1330: 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f 73  string to micros
1340: 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62 61 73  oft unicode, bas
1350: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
1360: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
1370: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
1380: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
1390: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
13a0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
13b0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
13c0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
13d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52  .*/.static WCHAR
13e0: 20 2a 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28   *mbcsToUnicode(
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1400: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
1410: 79 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4d  yte;.  WCHAR *zM
1420: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  bcsFilename;.  i
1430: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72  nt codepage = Ar
1440: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1450: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
1460: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
1470: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
1480: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
1490: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
14a0: 4e 55 4c 4c 2c 30 29 2a 73 69 7a 65 6f 66 28 57  NULL,0)*sizeof(W
14b0: 43 48 41 52 29 3b 0a 20 20 7a 4d 62 63 73 46 69  CHAR);.  zMbcsFi
14c0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d  lename = sqliteM
14d0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
14e0: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
14f0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
1500: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
1510: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1520: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 4d  .  }.  nByte = M
1530: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
1540: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
1550: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
1560: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  MbcsFilename, nB
1570: 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  yte);.  if( nByt
1580: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
1590: 74 65 46 72 65 65 28 7a 4d 62 63 73 46 69 6c 65  teFree(zMbcsFile
15a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
15b0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
15c0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
15d0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
15e0: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f  ** Convert micro
15f0: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20  soft unicode to 
1600: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
1610: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
1620: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
1630: 27 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65  's Ansi codepage
1640: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1650: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1660: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1670: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
1680: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  liteMalloc()..*/
1690: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
16a0: 69 63 6f 64 65 54 6f 4d 62 63 73 28 63 6f 6e 73  icodeToMbcs(cons
16b0: 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69  t WCHAR *zWideFi
16c0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
16d0: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
16e0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
16f0: 6f 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c  odepage = AreFil
1700: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
1710: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
1720: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65  ..  nByte = Wide
1730: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
1740: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
1750: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
1760: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a  0, 0, 0, 0);.  z
1770: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
1780: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
1790: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
17a0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
17b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
17c0: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
17d0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
17e0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
17f0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
1800: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
1830: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
1840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1850: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1860: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
1870: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
1880: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1890: 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62  * Convert multib
18a0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
18b0: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20  ring to UTF-8.  
18c0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
18d0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
18e0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
18f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1900: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
1910: 63 68 61 72 20 2a 6d 62 63 73 54 6f 55 74 66 38  char *mbcsToUtf8
1920: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1930: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
1940: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
1950: 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69 64    WCHAR *zTmpWid
1960: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
1970: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
1980: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1990: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
19a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19b0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
19c0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
19d0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
19e0: 71 6c 69 74 65 46 72 65 65 28 7a 54 6d 70 57 69  qliteFree(zTmpWi
19f0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
1a00: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a  ilenameUtf8;.}..
1a10: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54  /*.** Convert UT
1a20: 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65  F-8 to multibyte
1a30: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
1a40: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
1a50: 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  d the .** return
1a60: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1a70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1a80: 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  eMalloc()..*/.st
1a90: 61 74 69 63 20 63 68 61 72 20 2a 75 74 66 38 54  atic char *utf8T
1aa0: 6f 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  oMbcs(const char
1ab0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1ac0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
1ad0: 62 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54  bcs;.  WCHAR *zT
1ae0: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
1af0: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
1b00: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1b10: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
1b20: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b30: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
1b40: 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65  meMbcs = unicode
1b50: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29  ToMbcs(zTmpWide)
1b60: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
1b70: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
1b80: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  rn zFilenameMbcs
1b90: 3b 0a 7d 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 43  ;.}..#if OS_WINC
1ba0: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
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 2a  ****************
1bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1bf0: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
1c00: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
1c10: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
1c20: 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f  .** WindowsCE do
1c30: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
1c40: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
1c50: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
1c60: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
1c70: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
1c80: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
1c90: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
1ca0: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
1cb0: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
1cc0: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
1cd0: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
1ce0: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
1cf0: 3b 0a 20 20 69 36 34 20 74 36 34 3b 0a 20 20 74  ;.  i64 t64;.  t
1d00: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
1d10: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
1d20: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
1d30: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
1d40: 6d 65 20 3d 20 74 36 34 20 26 20 30 78 46 46 46  me = t64 & 0xFFF
1d50: 46 46 46 46 46 3b 0a 20 20 75 54 6d 2e 64 77 48  FFFFF;.  uTm.dwH
1d60: 69 67 68 44 61 74 65 54 69 6d 65 3d 20 74 36 34  ighDateTime= t64
1d70: 20 3e 3e 20 33 32 3b 0a 20 20 46 69 6c 65 54 69   >> 32;.  FileTi
1d80: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
1d90: 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20  e(&uTm,&lTm);.  
1da0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
1db0: 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
1dc0: 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
1dd0: 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
1de0: 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
1df0: 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
1e00: 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
1e10: 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
1e20: 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
1e30: 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
1e40: 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
1e50: 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
1e60: 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
1e70: 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
1e80: 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
1e90: 0a 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 6e 65  ./* This will ne
1ea0: 76 65 72 20 62 65 20 63 61 6c 6c 65 64 2c 20 62  ver be called, b
1eb0: 75 74 20 64 65 66 69 6e 65 64 20 74 6f 20 6d 61  ut defined to ma
1ec0: 6b 65 20 74 68 65 20 63 6f 64 65 20 63 6f 6d 70  ke the code comp
1ed0: 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ile */.#define G
1ee0: 65 74 54 65 6d 70 50 61 74 68 41 28 61 2c 62 29  etTempPathA(a,b)
1ef0: 0a 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69  ..#define LockFi
1f00: 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20  le(a,b,c,d,e)   
1f10: 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c      winceLockFil
1f20: 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  e(&a, b, c, d, e
1f30: 29 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b  ).#define Unlock
1f40: 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20  File(a,b,c,d,e) 
1f50: 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46      winceUnlockF
1f60: 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  ile(&a, b, c, d,
1f70: 20 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b   e).#define Lock
1f80: 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65  FileEx(a,b,c,d,e
1f90: 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46  ,f)   winceLockF
1fa0: 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20  ileEx(&a, b, c, 
1fb0: 64 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66 69 6e  d, e, f)..#defin
1fc0: 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  e HANDLE_TO_WINF
1fd0: 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a  ILE(a) (winFile*
1fe0: 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 6f 66  )&((char*)a)[-of
1ff0: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
2000: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
2010: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
2020: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
2030: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
2040: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
2050: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
2060: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
2070: 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f    dwErr = WaitFo
2080: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
2090: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
20a0: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
20b0: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
20c0: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
20d0: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
20e0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
20f0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
2100: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
2110: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
2120: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
2130: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
2140: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
2150: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
2160: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
2170: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
2180: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
2190: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
21a0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
21b0: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
21c0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
21d0: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
21e0: 6c 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a 54  le){.  WCHAR *zT
21f0: 6f 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4e 61  ok;.  WCHAR *zNa
2200: 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  me = utf8ToUnico
2210: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
2220: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
2230: 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  UE;..  /* Initia
2240: 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c  lize the local l
2250: 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a 65 72  ockdata */.  Zer
2260: 6f 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65 2d 3e  oMemory(&pFile->
2270: 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28 70 46  local, sizeof(pF
2280: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
2290: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
22a0: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
22b0: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
22c0: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
22d0: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
22e0: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
22f0: 20 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f 77 65   zTok = CharLowe
2300: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
2310: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
2320: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
2330: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
2340: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
2350: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
2360: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
2370: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
2380: 20 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55   CreateMutexW(NU
2390: 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65  LL, FALSE, zName
23a0: 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  );.  if (!pFile-
23b0: 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 73 71  >hMutex){.    sq
23c0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
23d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
23e0: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  E;.  }..  /* Acq
23f0: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62  uire the mutex b
2400: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
2410: 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   */.  winceMutex
2420: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
2430: 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20  Mutex);.  .  /* 
2440: 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20  Since the names 
2450: 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73  of named mutexes
2460: 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69  , semaphores, fi
2470: 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20  le mappings etc 
2480: 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73  are .  ** case-s
2490: 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61  ensitive, take a
24a0: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74  dvantage of that
24b0: 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20   by uppercasing 
24c0: 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20  the mutex name. 
24d0: 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68   ** and using th
24e0: 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64  at as the shared
24f0: 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d   filemapping nam
2500: 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61 72 55 70  e..  */.  CharUp
2510: 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
2520: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
2530: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
2540: 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  gW(INVALID_HANDL
2550: 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20  E_VALUE, NULL,. 
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57        PAGE_READW
2590: 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28  RITE, 0, sizeof(
25a0: 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  winceLock),.    
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20     zName);  ..  
25e0: 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68  /* Set a flag th
25f0: 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27  at indicates we'
2600: 72 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20  re the first to 
2610: 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72  create the memor
2620: 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75  y so it .  ** mu
2630: 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69  st be zero-initi
2640: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28  alized */.  if (
2650: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
2660: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
2670: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
2680: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
2690: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
26a0: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
26b0: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
26c0: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
26d0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
26e0: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20  map it. */.  if 
26f0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
2700: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  {.    pFile->sha
2710: 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b  red = (winceLock
2720: 2a 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  *)MapViewOfFile(
2730: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20  pFile->hShared, 
2740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49  .             FI
2750: 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45  LE_MAP_READ|FILE
2760: 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30  _MAP_WRITE, 0, 0
2770: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
2780: 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ck));.    /* If 
2790: 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20  mapping failed, 
27a0: 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64  close the shared
27b0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61   memory handle a
27c0: 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20  nd erase it */. 
27d0: 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73     if (!pFile->s
27e0: 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20 43 6c  hared){.      Cl
27f0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
2800: 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
2810: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
2820: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
2830: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
2840: 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
2850: 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
2860: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
2870: 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
2880: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68    if (pFile->hSh
2890: 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20  ared == NULL){. 
28a0: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
28b0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
28c0: 65 78 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  ex);.    CloseHa
28d0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
28e0: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
28f0: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
2900: 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b     return FALSE;
2910: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69  .  }.  .  /* Ini
2920: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
2930: 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
2940: 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
2950: 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b  /.  if (bInit) {
2960: 0a 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28  .    ZeroMemory(
2970: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73  pFile->shared, s
2980: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
2990: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
29a0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
29b0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
29c0: 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a  turn TRUE;.}../*
29d0: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
29e0: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
29f0: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
2a00: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
2a10: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
2a20: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
2a30: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
2a40: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
2a50: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
2a60: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
2a70: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
2a80: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
2a90: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
2aa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
2ab0: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
2ac0: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
2ad0: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
2ae0: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
2af0: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
2b00: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
2b10: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
2b20: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
2b30: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
2b40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
2b50: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
2b60: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
2b70: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
2b80: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
2b90: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
2ba0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
2bb0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
2bc0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
2bd0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
2be0: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
2bf0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
2c00: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
2c10: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
2c20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
2c30: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
2c40: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
2c50: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
2c60: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
2c70: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
2c80: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
2c90: 6c 65 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56  le */.    UnmapV
2ca0: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
2cb0: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c  >shared);.    Cl
2cc0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
2cd0: 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
2ce0: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
2cf0: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
2d00: 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 70     DeleteFileW(p
2d10: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
2d20: 6c 6f 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  lose);.      sql
2d30: 69 74 65 46 72 65 65 28 70 46 69 6c 65 2d 3e 7a  iteFree(pFile->z
2d40: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
2d50: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65        pFile->zDe
2d60: 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b  leteOnClose = 0;
2d70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
2d80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74  one with the mut
2d90: 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
2da0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
2db0: 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a  e->hMutex);    .
2dc0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
2dd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
2de0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
2df0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
2e00: 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ./* .** An imple
2e10: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2e20: 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20   LockFile() API 
2e30: 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77  of windows for w
2e40: 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ince.*/.static B
2e50: 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  OOL winceLockFil
2e60: 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  e(.  HANDLE *phF
2e70: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
2e80: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
2e90: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
2ea0: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
2eb0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
2ec0: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
2ed0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
2ee0: 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  oLockHigh.){.  w
2ef0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
2f00: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
2f10: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
2f20: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
2f30: 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  E;..  if (!pFile
2f40: 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
2f50: 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
2f60: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
2f70: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
2f80: 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c   Wanting an excl
2f90: 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
2fa0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
2fb0: 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 46  tLow == SHARED_F
2fc0: 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
2fd0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
2fe0: 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44  ockLow == SHARED
2ff0: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
3000: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
3010: 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
3020: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3030: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
3040: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
3050: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
3060: 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
3070: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
3080: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
3090: 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
30a0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
30b0: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
30c0: 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
30d0: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 28 64 77  /.  else if ((dw
30e0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3e 3d  FileOffsetLow >=
30f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26   SHARED_FIRST &&
3100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
3110: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c 20 53  ileOffsetLow < S
3120: 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 53 48  HARED_FIRST + SH
3130: 41 52 45 44 5f 53 49 5a 45 29 20 26 26 0a 20 20  ARED_SIZE) &&.  
3140: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
3150: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
3160: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
3170: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
3180: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
3190: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
31a0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
31b0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
31c0: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
31d0: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
31e0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
31f0: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
3200: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
3210: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
3220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
3230: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
3240: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
3250: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
3260: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26   PENDING_BYTE &&
3270: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3280: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
3290: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e      /* If no pen
32a0: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
32b0: 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 65  en acquired, the
32c0: 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a  n acquire it */.
32d0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
32e0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
32f0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
3300: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
3310: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
3320: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
3330: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  .bPending = TRUE
3340: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
3350: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
3360: 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65  }.  /* Want a re
3370: 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a  served lock? */.
3380: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
3390: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 52 45  eOffsetLow == RE
33a0: 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e  SERVED_BYTE && n
33b0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
33c0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
33d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
33e0: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
33f0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69  = 0) {.      pFi
3400: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
3410: 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  erved = TRUE;.  
3420: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
3430: 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  .bReserved = TRU
3440: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3450: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3460: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
3470: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
3480: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
3490: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
34a0: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
34b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f  tion of the Unlo
34c0: 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 77 69  ckFile API of wi
34d0: 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a  ndows for wince.
34e0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
34f0: 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a  inceUnlockFile(.
3500: 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65    HANDLE *phFile
3510: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
3520: 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
3530: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
3540: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
3550: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
3560: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
3570: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3580: 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  UnlockHigh.){.  
3590: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
35a0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
35b0: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
35c0: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
35d0: 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  SE;..  if (!pFil
35e0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
35f0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
3600: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
3610: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
3620: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
3630: 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20  ader lock or an 
3640: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
3650: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
3660: 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41 52 45  fsetLow >= SHARE
3670: 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20  D_FIRST &&.     
3680: 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f    dwFileOffsetLo
3690: 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52 53 54  w < SHARED_FIRST
36a0: 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45 29 7b   + SHARED_SIZE){
36b0: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68  .    /* Did we h
36c0: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
36d0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66   lock? */.    if
36e0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
36f0: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
3700: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
3710: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
3720: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
3730: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
3740: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
3750: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
3760: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3770: 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65  Did we just have
3780: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20   a reader lock? 
3790: 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  */.    else if (
37a0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
37b0: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
37c0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
37d0: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
37e0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
37f0: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
3800: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
3810: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
3820: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
3830: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
3840: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
3850: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
3860: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
3870: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3880: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
3890: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  = PENDING_BYTE &
38a0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
38b0: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
38c0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
38d0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
38e0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
38f0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
3900: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
3910: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
3920: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
3930: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
3940: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
3950: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
3960: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
3970: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
3980: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 52  leOffsetLow == R
3990: 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20  ESERVED_BYTE && 
39a0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
39b0: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
39c0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
39d0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
39e0: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
39f0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
3a00: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
3a10: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
3a20: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
3a30: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
3a40: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
3a50: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
3a60: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
3a70: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
3a80: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
3a90: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
3aa0: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
3ab0: 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 77 69  leEx() API of wi
3ac0: 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a  ndows for wince.
3ad0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
3ae0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a  inceLockFileEx(.
3af0: 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65    HANDLE *phFile
3b00: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ,.  DWORD dwFlag
3b10: 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73  s,.  DWORD dwRes
3b20: 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e  erved,.  DWORD n
3b30: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
3b40: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
3b50: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3b60: 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56  LockHigh,.  LPOV
3b70: 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c  ERLAPPED lpOverl
3b80: 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a 20 49 66  apped.){.  /* If
3b90: 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e 74   the caller want
3ba0: 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64 20  s a shared read 
3bb0: 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74 68  lock, forward th
3bc0: 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20  is call.  ** to 
3bd0: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f  winceLockFile */
3be0: 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61 70  .  if (lpOverlap
3bf0: 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 53  ped->Offset == S
3c00: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
3c10: 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d 3d 20       dwFlags == 
3c20: 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75 6d 62  1 &&.      nNumb
3c30: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
3c40: 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53 49 5a  ow == SHARED_SIZ
3c50: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
3c60: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
3c70: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
3c80: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
3c90: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
3ca0: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
3cb0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
3cc0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
3cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d10: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
3d20: 20 2f 2a 20 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a   /* OS_WINCE */.
3d30: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
3d40: 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20   UTF-8 filename 
3d50: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
3d60: 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rm the underlyin
3d70: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  g.** operating s
3d80: 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65  ystem wants file
3d90: 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65  names in.  Space
3da0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
3db0: 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ult.** is obtain
3dc0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
3dd0: 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
3de0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
3df0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
3e00: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
3e10: 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
3e20: 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
3e30: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
3e40: 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
3e50: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
3e60: 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
3e70: 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
3e80: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
3e90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3ea0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38  Converted = utf8
3eb0: 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  ToMbcs(zFilename
3ec0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c  );.  }.  /* call
3ed0: 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
3ee0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
3ef0: 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
3f00: 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ted;.}../*.** De
3f10: 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
3f20: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
3f30: 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65  that windows doe
3f40: 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
3f50: 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
3f60: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
3f70: 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
3f80: 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
3f90: 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
3fa0: 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
3fb0: 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
3fc0: 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
3fd0: 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
3fe0: 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
3ff0: 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
4000: 77 68 61 74 65 76 65 72 20 69 74 20 69 73 20 69  whatever it is i
4010: 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
4020: 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
4030: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
4040: 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
4050: 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
4060: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
4070: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
4080: 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
4090: 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
40a0: 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
40b0: 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
40c0: 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
40d0: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
40e0: 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
40f0: 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
4100: 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
4110: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
4120: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
4130: 6e 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  ne MX_DELETION_A
4140: 54 54 45 4d 50 54 53 20 33 0a 69 6e 74 20 73 71  TTEMPTS 3.int sq
4150: 6c 69 74 65 33 57 69 6e 44 65 6c 65 74 65 28 63  lite3WinDelete(c
4160: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
4170: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 63 6e 74  name){.  int cnt
4180: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
4190: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
41a0: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
41b0: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
41c0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
41d0: 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
41e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
41f0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  MEM;.  }.  Simul
4200: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
4210: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
4220: 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 69 73  ELETE);.  if( is
4230: 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a  NT() ){.    do{.
4240: 20 20 20 20 20 20 72 63 20 3d 20 44 65 6c 65 74        rc = Delet
4250: 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
4260: 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  d);.    }while( 
4270: 72 63 3d 3d 30 20 26 26 20 47 65 74 46 69 6c 65  rc==0 && GetFile
4280: 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
4290: 76 65 72 74 65 64 29 21 3d 30 78 66 66 66 66 66  verted)!=0xfffff
42a0: 66 66 66 20 0a 20 20 20 20 20 20 20 20 20 20 20  fff .           
42b0: 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 44   && cnt++ < MX_D
42c0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
42d0: 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c   && (Sleep(100),
42e0: 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   1) );.  }else{.
42f0: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
4300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4310: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
4320: 64 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44  do{.      rc = D
4330: 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
4340: 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69  erted);.    }whi
4350: 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 47 65 74  le( rc==0 && Get
4360: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
4370: 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 30 78 66  zConverted)!=0xf
4380: 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
4390: 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d      && cnt++ < M
43a0: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
43b0: 50 54 53 20 26 26 20 28 53 6c 65 65 70 28 31 30  PTS && (Sleep(10
43c0: 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 66  0), 1) );.#endif
43d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
43e0: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
43f0: 20 4f 53 54 52 41 43 45 32 28 22 44 45 4c 45 54   OSTRACE2("DELET
4400: 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  E \"%s\"\n", zFi
4410: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
4420: 6e 20 72 63 21 3d 30 20 3f 20 53 51 4c 49 54 45  n rc!=0 ? SQLITE
4430: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
4440: 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  RR;.}../*.** Ret
4450: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
4460: 6e 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74  named file exist
4470: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
4480: 33 57 69 6e 46 69 6c 65 45 78 69 73 74 73 28 63  3WinFileExists(c
4490: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
44a0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 65 78 69  name){.  int exi
44b0: 73 74 73 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  sts = 0;.  void 
44c0: 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
44d0: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
44e0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
44f0: 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
4500: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4510: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4520: 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
4530: 7b 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 47  {.    exists = G
4540: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4550: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
4560: 72 74 65 64 29 20 21 3d 20 30 78 66 66 66 66 66  rted) != 0xfffff
4570: 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  fff;.  }else{.#i
4580: 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72  f OS_WINCE.    r
4590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
45a0: 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 65 78  EM;.#else.    ex
45b0: 69 73 74 73 20 3d 20 47 65 74 46 69 6c 65 41 74  ists = GetFileAt
45c0: 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
45d0: 29 7a 43 6f 6e 76 65 72 74 65 64 29 20 21 3d 20  )zConverted) != 
45e0: 30 78 66 66 66 66 66 66 66 66 3b 0a 23 65 6e 64  0xffffffff;.#end
45f0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  if.  }.  sqliteF
4600: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
4610: 0a 20 20 72 65 74 75 72 6e 20 65 78 69 73 74 73  .  return exists
4620: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
4630: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
4640: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
4650: 74 65 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c  teWinFile(winFil
4660: 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65  e *pInit, OsFile
4670: 20 2a 2a 70 49 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20   **pId);../*.** 
4680: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
4690: 61 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20  a file for both 
46a0: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
46b0: 69 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a  ing.  If that.**
46c0: 20 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e   fails, try open
46d0: 69 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ing it read-only
46e0: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64  .  If the file d
46f0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a  oes not exist,.*
4700: 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
4710: 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  it..**.** On suc
4720: 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66  cess, a handle f
4730: 6f 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  or the open file
4740: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
4750: 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64  id.** and *pRead
4760: 6f 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30  only is set to 0
4770: 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   if the file was
4780: 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
4790: 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69  ing and.** writi
47a0: 6e 67 20 6f 72 20 31 20 69 66 20 74 68 65 20 66  ng or 1 if the f
47b0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
47c0: 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66  ead-only.  The f
47d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
47e0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ** SQLITE_OK..**
47f0: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
4800: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
4810: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54  urns SQLITE_CANT
4820: 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a  OPEN and leaves.
4830: 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61  ** *id and *pRea
4840: 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e  donly unchanged.
4850: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
4860: 69 6e 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  inOpenReadWrite(
4870: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4880: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69  Filename,.  OsFi
4890: 6c 65 20 2a 2a 70 49 64 2c 0a 20 20 69 6e 74 20  le **pId,.  int 
48a0: 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20  *pReadonly.){.  
48b0: 77 69 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e  winFile f;.  HAN
48c0: 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
48d0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
48e0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
48f0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
4900: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
4910: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4920: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
4930: 20 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d    assert( *pId==
4940: 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54  0 );..  if( isNT
4950: 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72  () ){.    h = Cr
4960: 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41 52  eateFileW((WCHAR
4970: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
4980: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
4990: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
49a0: 45 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53  E,.       FILE_S
49b0: 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
49c0: 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20  _SHARE_WRITE,.  
49d0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
49e0: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
49f0: 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
4a00: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
4a10: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
4a20: 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55  CCESS,.       NU
4a30: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  LL.    );.    if
4a40: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
4a50: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
4a60: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
4a70: 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
4a80: 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
4a90: 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20  GENERIC_READ,.  
4aa0: 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52         FILE_SHAR
4ab0: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
4ac0: 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  ARE_WRITE,.     
4ad0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
4ae0: 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a     OPEN_ALWAYS,.
4af0: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
4b00: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
4b10: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
4b20: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
4b30: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b     NULL.      );
4b40: 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49 4e  .      if( h==IN
4b50: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
4b60: 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  UE ){.        sq
4b70: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72  liteFree(zConver
4b80: 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
4b90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
4ba0: 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OPEN;.      }.  
4bb0: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
4bc0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
4bd0: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20       *pReadonly 
4be0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 4f  = 0;.    }.#if O
4bf0: 53 5f 57 49 4e 43 45 0a 20 20 20 20 69 66 20 28  S_WINCE.    if (
4c00: 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  !winceCreateLock
4c10: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 29 29  (zFilename, &f))
4c20: 7b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e  {.      CloseHan
4c30: 64 6c 65 28 68 29 3b 0a 20 20 20 20 20 20 73 71  dle(h);.      sq
4c40: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72  liteFree(zConver
4c50: 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
4c60: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
4c70: 45 4e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  EN;.    }.#endif
4c80: 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53  .  }else{.#if OS
4c90: 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72  _WINCE.    retur
4ca0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4cb0: 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 43 72  #else.    h = Cr
4cc0: 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a  eateFileA((char*
4cd0: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
4ce0: 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44      GENERIC_READ
4cf0: 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
4d00: 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48  ,.       FILE_SH
4d10: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
4d20: 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20  SHARE_WRITE,.   
4d30: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
4d40: 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20   OPEN_ALWAYS,.  
4d50: 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42       FILE_ATTRIB
4d60: 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c  UTE_NORMAL | FIL
4d70: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
4d80: 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c  CESS,.       NUL
4d90: 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  L.    );.    if(
4da0: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
4db0: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
4dc0: 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65    h = CreateFile
4dd0: 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
4de0: 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 47 45  ted,.         GE
4df0: 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20  NERIC_READ,.    
4e00: 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f       FILE_SHARE_
4e10: 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
4e20: 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  E_WRITE,.       
4e30: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
4e40: 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20   OPEN_ALWAYS,.  
4e50: 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52         FILE_ATTR
4e60: 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46  IBUTE_NORMAL | F
4e70: 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
4e80: 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 20  ACCESS,.        
4e90: 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20   NULL.      );. 
4ea0: 20 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41       if( h==INVA
4eb0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
4ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4ed0: 74 65 46 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  teFree(zConverte
4ee0: 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
4ef0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
4f00: 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EN;.      }.    
4f10: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31    *pReadonly = 1
4f20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4f30: 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20     *pReadonly = 
4f40: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  0;.    }.#endif 
4f50: 2f 2a 20 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 20  /* OS_WINCE */. 
4f60: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65   }..  sqliteFree
4f70: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 0a 20  (zConverted);.. 
4f80: 20 66 2e 68 20 3d 20 68 3b 0a 23 69 66 20 4f 53   f.h = h;.#if OS
4f90: 5f 57 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65  _WINCE.  f.zDele
4fa0: 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 23  teOnClose = 0;.#
4fb0: 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33  endif.  OSTRACE3
4fc0: 28 22 4f 50 45 4e 20 52 2f 57 20 25 64 20 5c 22  ("OPEN R/W %d \"
4fd0: 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  %s\"\n", h, zFil
4fe0: 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  ename);.  return
4ff0: 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65   allocateWinFile
5000: 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f  (&f, pId);.}.../
5010: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
5020: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
5030: 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
5040: 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f  cess by this pro
5050: 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  cess..** The fil
5060: 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  e will be opened
5070: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
5080: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
5090: 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f  To avoid.** a po
50a0: 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79  tential security
50b0: 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20   problem, we do 
50c0: 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69  not allow the fi
50d0: 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72  le to have.** pr
50e0: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
50f0: 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c  .  Nor do we all
5100: 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  ow the file to b
5110: 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20  e a symbolic.** 
5120: 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  link..**.** If d
5130: 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  elFlag is true, 
5140: 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67  then make arrang
5150: 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61  ements to automa
5160: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a  tically delete.*
5170: 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20  * the file when 
5180: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
5190: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
51a0: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
51b0: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
51c0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
51d0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
51e0: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
51f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
5200: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 69  *.** Sometimes i
5210: 66 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  f we have just d
5220: 65 6c 65 74 65 64 20 61 20 70 72 69 6f 72 20 6a  eleted a prior j
5230: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 77 69 6e  ournal file, win
5240: 64 6f 77 73 0a 2a 2a 20 77 69 6c 6c 20 66 61 69  dows.** will fai
5250: 6c 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  l to open a new 
5260: 6f 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 72  one because ther
5270: 65 20 69 73 20 61 20 22 70 65 6e 64 69 6e 67 20  e is a "pending 
5280: 64 65 6c 65 74 65 22 2e 0a 2a 2a 20 54 6f 20 77  delete"..** To w
5290: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
52a0: 62 75 67 2c 20 77 65 20 70 61 75 73 65 20 66 6f  bug, we pause fo
52b0: 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
52c0: 64 73 20 61 6e 64 20 61 74 74 65 6d 70 74 0a 2a  ds and attempt.*
52d0: 2a 20 61 20 73 65 63 6f 6e 64 20 6f 70 65 6e 20  * a second open 
52e0: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
52f0: 6f 6e 65 20 66 61 69 6c 73 2e 20 20 54 68 65 20  one fails.  The 
5300: 77 68 6f 6c 65 20 6f 70 65 72 61 74 69 6f 6e 20  whole operation 
5310: 6f 6e 6c 79 0a 2a 2a 20 66 61 69 6c 73 20 69 66  only.** fails if
5320: 20 62 6f 74 68 20 6f 70 65 6e 20 61 74 74 65 6d   both open attem
5330: 70 74 73 20 61 72 65 20 75 6e 73 75 63 63 65 73  pts are unsucces
5340: 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sful..*/.int sql
5350: 69 74 65 33 57 69 6e 4f 70 65 6e 45 78 63 6c 75  ite3WinOpenExclu
5360: 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72 20  sive(const char 
5370: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
5380: 6c 65 20 2a 2a 70 49 64 2c 20 69 6e 74 20 64 65  le **pId, int de
5390: 6c 46 6c 61 67 29 7b 0a 20 20 77 69 6e 46 69 6c  lFlag){.  winFil
53a0: 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  e f;.  HANDLE h;
53b0: 0a 20 20 44 57 4f 52 44 20 66 69 6c 65 66 6c 61  .  DWORD filefla
53c0: 67 73 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  gs;.  void *zCon
53d0: 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
53e0: 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
53f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
5400: 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
5410: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5420: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
5430: 73 73 65 72 74 28 20 2a 70 49 64 20 3d 3d 20 30  ssert( *pId == 0
5440: 20 29 3b 0a 20 20 66 69 6c 65 66 6c 61 67 73 20   );.  fileflags 
5450: 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
5460: 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 69 66 20 21  OM_ACCESS;.#if !
5470: 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 64  OS_WINCE.  if( d
5480: 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 66 69  elFlag ){.    fi
5490: 6c 65 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f  leflags |= FILE_
54a0: 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52  ATTRIBUTE_TEMPOR
54b0: 41 52 59 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f  ARY | FILE_FLAG_
54c0: 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
54d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
54e0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
54f0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
5500: 20 64 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 43   do{.      h = C
5510: 72 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41  reateFileW((WCHA
5520: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
5530: 20 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f          GENERIC_
5540: 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
5550: 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 30  RITE,.         0
5560: 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  ,.         NULL,
5570: 0a 20 20 20 20 20 20 20 20 20 43 52 45 41 54 45  .         CREATE
5580: 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20  _ALWAYS,.       
5590: 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20 20    fileflags,.   
55a0: 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20        NULL.     
55b0: 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   );.    }while( 
55c0: 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
55d0: 45 5f 56 41 4c 55 45 20 26 26 20 63 6e 74 2b 2b  E_VALUE && cnt++
55e0: 20 3c 20 32 20 26 26 20 28 53 6c 65 65 70 28 31   < 2 && (Sleep(1
55f0: 30 30 29 2c 20 31 29 20 29 3b 0a 20 20 7d 65 6c  00), 1) );.  }el
5600: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
5610: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5620: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
5630: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
5640: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 68  .    do{.      h
5650: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 28   = CreateFileA((
5660: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
5670: 2c 0a 20 20 20 20 20 20 20 20 47 45 4e 45 52 49  ,.        GENERI
5680: 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
5690: 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20  _WRITE,.        
56a0: 30 2c 0a 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  0,.        NULL,
56b0: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 5f  .        CREATE_
56c0: 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20  ALWAYS,.        
56d0: 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20 20 20 20  fileflags,.     
56e0: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b     NULL.      );
56f0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 68 3d 3d  .    }while( h==
5700: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
5710: 41 4c 55 45 20 26 26 20 63 6e 74 2b 2b 20 3c 20  ALUE && cnt++ < 
5720: 32 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29  2 && (Sleep(100)
5730: 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 66 20 2f  , 1) );.#endif /
5740: 2a 20 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 20 20  * OS_WINCE */.  
5750: 7d 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  }.#if OS_WINCE. 
5760: 20 69 66 28 20 64 65 6c 46 6c 61 67 20 26 26 20   if( delFlag && 
5770: 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
5780: 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 66  E_VALUE ){.    f
5790: 2e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  .zDeleteOnClose 
57a0: 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
57b0: 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30    zConverted = 0
57c0: 3b 0a 20 20 7d 0a 20 20 66 2e 68 4d 75 74 65 78  ;.  }.  f.hMutex
57d0: 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
57e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
57f0: 6e 76 65 72 74 65 64 29 3b 0a 20 20 69 66 28 20  nverted);.  if( 
5800: 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
5810: 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 72  E_VALUE ){.    r
5820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
5830: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e 68  TOPEN;.  }.  f.h
5840: 20 3d 20 68 3b 0a 20 20 4f 53 54 52 41 43 45 33   = h;.  OSTRACE3
5850: 28 22 4f 50 45 4e 20 45 58 20 25 64 20 5c 22 25  ("OPEN EX %d \"%
5860: 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65  s\"\n", h, zFile
5870: 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  name);.  return 
5880: 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28  allocateWinFile(
5890: 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a  &f, pId);.}../*.
58a0: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
58b0: 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f  en a new file fo
58c0: 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65  r read-only acce
58d0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ss..**.** On suc
58e0: 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20  cess, write the 
58f0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f  file handle into
5900: 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20   *id and return 
5910: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
5920: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74   On failure, ret
5930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
5940: 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  PEN..*/.int sqli
5950: 74 65 33 57 69 6e 4f 70 65 6e 52 65 61 64 4f 6e  te3WinOpenReadOn
5960: 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ly(const char *z
5970: 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65  Filename, OsFile
5980: 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e 46 69   **pId){.  winFi
5990: 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45 20 68  le f;.  HANDLE h
59a0: 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
59b0: 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
59c0: 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
59d0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
59e0: 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
59f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5a00: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
5a10: 65 72 74 28 20 2a 70 49 64 3d 3d 30 20 29 3b 0a  ert( *pId==0 );.
5a20: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
5a30: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
5a40: 6c 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  leW((WCHAR*)zCon
5a50: 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 47  verted,.       G
5a60: 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20  ENERIC_READ,.   
5a70: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55      0,.       NU
5a80: 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f  LL,.       OPEN_
5a90: 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20  EXISTING,.      
5aa0: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
5ab0: 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c  NORMAL | FILE_FL
5ac0: 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
5ad0: 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20  ,.       NULL.  
5ae0: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69    );.  }else{.#i
5af0: 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72  f OS_WINCE.    r
5b00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5b10: 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  EM;.#else.    h 
5b20: 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 28 63  = CreateFileA((c
5b30: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
5b40: 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f  .       GENERIC_
5b50: 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30 2c 0a  READ,.       0,.
5b60: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
5b70: 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e      OPEN_EXISTIN
5b80: 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41  G,.       FILE_A
5b90: 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20  TTRIBUTE_NORMAL 
5ba0: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  | FILE_FLAG_RAND
5bb0: 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20  OM_ACCESS,.     
5bc0: 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 23 65    NULL.    );.#e
5bd0: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
5be0: 65 46 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  eFree(zConverted
5bf0: 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  );.  if( h==INVA
5c00: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
5c10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5c20: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
5c30: 20 20 7d 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 23    }.  f.h = h;.#
5c40: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 66 2e  if OS_WINCE.  f.
5c50: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d  zDeleteOnClose =
5c60: 20 30 3b 0a 20 20 66 2e 68 4d 75 74 65 78 20 3d   0;.  f.hMutex =
5c70: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20   NULL;.#endif.  
5c80: 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 52  OSTRACE3("OPEN R
5c90: 4f 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  O %d \"%s\"\n", 
5ca0: 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  h, zFilename);. 
5cb0: 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65   return allocate
5cc0: 57 69 6e 46 69 6c 65 28 26 66 2c 20 70 49 64 29  WinFile(&f, pId)
5cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
5ce0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
5cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
5d00: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
5d10: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
5d20: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
5d30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
5d40: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
5d50: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
5d60: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
5d70: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
5d80: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
5d90: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
5da0: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
5db0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
5dc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
5dd0: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
5de0: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
5df0: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
5e00: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
5e10: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
5e20: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
5e30: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
5e40: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
5e50: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70   a previously op
5e60: 65 6e 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69  en file is at *i
5e70: 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20  d is.** updated 
5e80: 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72  with the new dir
5e90: 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
5ea0: 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54  riptor and SQLIT
5eb0: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
5ec0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  ned..**.** On fa
5ed0: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
5ee0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
5ef0: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
5f00: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e  leaves.** *id un
5f10: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
5f20: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 44 69  ic int winOpenDi
5f30: 72 65 63 74 6f 72 79 28 0a 20 20 4f 73 46 69 6c  rectory(.  OsFil
5f40: 65 20 2a 69 64 2c 0a 20 20 63 6f 6e 73 74 20 63  e *id,.  const c
5f50: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 0a 29 7b  har *zDirname.){
5f60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5f70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
5f80: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
5f90: 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
5fa0: 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
5fb0: 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
5fc0: 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  ** hold at least
5fd0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
5fe0: 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65 72 73  _SIZE characters
5ff0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6000: 57 69 6e 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  WinTempFileName(
6010: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
6020: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
6030: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
6040: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
6050: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
6060: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
6070: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
6080: 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20  3456789";.  int 
6090: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65  i, j;.  char zTe
60a0: 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54 45  mpPath[SQLITE_TE
60b0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20  MPNAME_SIZE];.  
60c0: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
60d0: 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
60e0: 20 20 73 74 72 6e 63 70 79 28 7a 54 65 6d 70 50    strncpy(zTempP
60f0: 61 74 68 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  ath, sqlite3_tem
6100: 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 53 51 4c  p_directory, SQL
6110: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
6120: 45 2d 33 30 29 3b 0a 20 20 20 20 7a 54 65 6d 70  E-30);.    zTemp
6130: 50 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Path[SQLITE_TEMP
6140: 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 5d 20 3d 20  NAME_SIZE-30] = 
6150: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  0;.  }else if( i
6160: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
6170: 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57  r *zMulti;.    W
6180: 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 53  CHAR zWidePath[S
6190: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
61a0: 49 5a 45 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d  IZE];.    GetTem
61b0: 70 50 61 74 68 57 28 53 51 4c 49 54 45 5f 54 45  pPathW(SQLITE_TE
61c0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20  MPNAME_SIZE-30, 
61d0: 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
61e0: 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
61f0: 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
6200: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
6210: 69 20 29 7b 0a 20 20 20 20 20 20 73 74 72 6e 63  i ){.      strnc
6220: 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 7a 4d  py(zTempPath, zM
6230: 75 6c 74 69 2c 20 53 51 4c 49 54 45 5f 54 45 4d  ulti, SQLITE_TEM
6240: 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b 0a  PNAME_SIZE-30);.
6250: 20 20 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b        zTempPath[
6260: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
6270: 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20  SIZE-30] = 0;.  
6280: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6290: 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73  Multi);.    }els
62a0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
62b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
62c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
62d0: 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20   char *zUtf8;.  
62e0: 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68    char zMbcsPath
62f0: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
6300: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 47 65 74 54  _SIZE];.    GetT
6310: 65 6d 70 50 61 74 68 41 28 53 51 4c 49 54 45 5f  empPathA(SQLITE_
6320: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
6330: 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  , zMbcsPath);.  
6340: 20 20 7a 55 74 66 38 20 3d 20 6d 62 63 73 54 6f    zUtf8 = mbcsTo
6350: 55 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  Utf8(zMbcsPath);
6360: 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
6370: 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
6380: 7a 54 65 6d 70 50 61 74 68 2c 20 7a 55 74 66 38  zTempPath, zUtf8
6390: 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  , SQLITE_TEMPNAM
63a0: 45 5f 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20  E_SIZE-30);.    
63b0: 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49    zTempPath[SQLI
63c0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
63d0: 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  -30] = 0;.      
63e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 55 74 66 38  sqliteFree(zUtf8
63f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6400: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6410: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
6420: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65   }.  for(i=strle
6430: 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e  n(zTempPath); i>
6440: 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
6450: 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
6460: 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
6470: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b   = 0;.  for(;;){
6480: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
6490: 66 2c 20 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49  f, "%s\\"TEMP_FI
64a0: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70  LE_PREFIX, zTemp
64b0: 50 61 74 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73  Path);.    j = s
64c0: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
64d0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
64e0: 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
64f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6500: 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
6510: 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
6520: 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
6530: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
6540: 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
6550: 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
6560: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
6570: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   0;.    if( !sql
6580: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
6590: 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b 0a  (zBuf) ) break;.
65a0: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 32 28 22    }.  OSTRACE2("
65b0: 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25  TEMP FILENAME: %
65c0: 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72  s\n", zBuf);.  r
65d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65e0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65   .}../*.** Close
65f0: 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   a file..**.** I
6600: 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68  t is reported th
6610: 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  at an attempt to
6620: 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   close a handle 
6630: 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a  might sometimes.
6640: 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69  ** fail.  This i
6650: 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f  s a very unreaso
6660: 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75  nable result, bu
6670: 74 20 77 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74  t windows is not
6680: 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65  orious.** for be
6690: 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ing unreasonable
66a0: 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75   so I do not dou
66b0: 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  bt that it might
66c0: 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20   happen.  If.** 
66d0: 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c  the close fails,
66e0: 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30   we pause for 10
66f0: 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
6700: 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41  nd try again.  A
6710: 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f  s.** many as MX_
6720: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74  CLOSE_ATTEMPT at
6730: 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20  tempts to close 
6740: 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d  the handle are m
6750: 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69  ade before.** gi
6760: 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75  ving up and retu
6770: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
6780: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c  */.#define MX_CL
6790: 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74  OSE_ATTEMPT 3.st
67a0: 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73  atic int winClos
67b0: 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  e(OsFile **pId){
67c0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
67d0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  e;.  int rc = 1;
67e0: 0a 20 20 69 66 28 20 70 49 64 20 26 26 20 28 70  .  if( pId && (p
67f0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
6800: 29 2a 70 49 64 29 21 3d 30 20 29 7b 0a 20 20 20  )*pId)!=0 ){.   
6810: 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
6820: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 22  ;.    OSTRACE2("
6830: 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69  CLOSE %d\n", pFi
6840: 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 64 6f 7b 0a  le->h);.    do{.
6850: 20 20 20 20 20 20 72 63 20 3d 20 43 6c 6f 73 65        rc = Close
6860: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29  Handle(pFile->h)
6870: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
6880: 3d 3d 30 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d  ==0 && cnt++ < M
6890: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
68a0: 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20  && (Sleep(100), 
68b0: 31 29 20 29 3b 0a 23 69 66 20 4f 53 5f 57 49 4e  1) );.#if OS_WIN
68c0: 43 45 0a 20 20 20 20 77 69 6e 63 65 44 65 73 74  CE.    winceDest
68d0: 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
68e0: 23 65 6e 64 69 66 0a 20 20 20 20 4f 70 65 6e 43  #endif.    OpenC
68f0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20  ounter(-1);.    
6900: 73 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65  sqliteFree(pFile
6910: 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30 3b  );.    *pId = 0;
6920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6930: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
6940: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a  QLITE_IOERR;.}..
6950: 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
6960: 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
6970: 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
6980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
6990: 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
69a0: 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
69b0: 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
69c0: 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
69d0: 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
69e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
69f0: 6e 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64  nRead(OsFile *id
6a00: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
6a10: 74 20 61 6d 74 29 7b 0a 20 20 44 57 4f 52 44 20  t amt){.  DWORD 
6a20: 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
6a30: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
6a40: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
6a50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
6a60: 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  AD);.  OSTRACE3(
6a70: 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64  "READ %d lock=%d
6a80: 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29  \n", ((winFile*)
6a90: 69 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c  id)->h, ((winFil
6aa0: 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65  e*)id)->locktype
6ab0: 29 3b 0a 20 20 69 66 28 20 21 52 65 61 64 46 69  );.  if( !ReadFi
6ac0: 6c 65 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  le(((winFile*)id
6ad0: 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  )->h, pBuf, amt,
6ae0: 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a 20 20 20   &got, 0) ){.   
6af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6b00: 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  OERR_READ;.  }. 
6b10: 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52 44   if( got==(DWORD
6b20: 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  )amt ){.    retu
6b30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
6b50: 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
6b60: 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
6b70: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
6b80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
6b90: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
6ba0: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
6bb0: 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
6bc0: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
6bd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
6be0: 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
6bf0: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
6c00: 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
6c10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6c20: 6e 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69  nWrite(OsFile *i
6c30: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
6c40: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
6c50: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
6c60: 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 61 73  WORD wrote;.  as
6c70: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
6c80: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
6c90: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
6ca0: 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 53 69  OERR_READ);.  Si
6cb0: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
6cc0: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
6cd0: 45 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54 52 41  E_FULL);.  OSTRA
6ce0: 43 45 33 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE3("WRITE %d lo
6cf0: 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 77 69 6e 46  ck=%d\n", ((winF
6d00: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28 77  ile*)id)->h, ((w
6d10: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  inFile*)id)->loc
6d20: 6b 74 79 70 65 29 3b 0a 20 20 61 73 73 65 72 74  ktype);.  assert
6d30: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69  ( amt>0 );.  whi
6d40: 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 72 63  le( amt>0 && (rc
6d50: 20 3d 20 57 72 69 74 65 46 69 6c 65 28 28 28 77   = WriteFile(((w
6d60: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  inFile*)id)->h, 
6d70: 70 42 75 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74  pBuf, amt, &wrot
6d80: 65 2c 20 30 29 29 21 3d 30 0a 20 20 20 20 20 20  e, 0))!=0.      
6d90: 20 20 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b     && wrote>0 ){
6da0: 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
6db0: 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28  e;.    pBuf = &(
6dc0: 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f  (char*)pBuf)[wro
6dd0: 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  te];.  }.  if( !
6de0: 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77  rc || amt>(int)w
6df0: 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75  rote ){.    retu
6e00: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
6e10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6e20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6e30: 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f 66 74 20   Some microsoft 
6e40: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
6e50: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
6e60: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
6e70: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
6e80: 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56  TER.# define INV
6e90: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
6ea0: 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31  INTER ((DWORD)-1
6eb0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6ec0: 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72  Move the read/wr
6ed0: 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61  ite pointer in a
6ee0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
6ef0: 20 69 6e 74 20 77 69 6e 53 65 65 6b 28 4f 73 46   int winSeek(OsF
6f00: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
6f10: 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70  set){.  LONG upp
6f20: 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 3e  erBits = offset>
6f30: 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  >32;.  LONG lowe
6f40: 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26  rBits = offset &
6f50: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 44   0xffffffff;.  D
6f60: 57 4f 52 44 20 72 63 3b 0a 20 20 61 73 73 65 72  WORD rc;.  asser
6f70: 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 64  t( id!=0 );.#ifd
6f80: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
6f90: 20 69 66 28 20 6f 66 66 73 65 74 20 29 20 53 69   if( offset ) Si
6fa0: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
6fb0: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
6fc0: 45 5f 46 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  E_FULL);.#endif.
6fd0: 20 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f    rc = SetFilePo
6fe0: 69 6e 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a  inter(((winFile*
6ff0: 29 69 64 29 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  )id)->h, lowerBi
7000: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
7010: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 4f  FILE_BEGIN);.  O
7020: 53 54 52 41 43 45 33 28 22 53 45 45 4b 20 25 64  STRACE3("SEEK %d
7030: 20 25 6c 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46   %lld\n", ((winF
7040: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6f 66 66  ile*)id)->h, off
7050: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
7060: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
7070: 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c  _POINTER && GetL
7080: 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45  astError()!=NO_E
7090: 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75  RROR ){.    retu
70a0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
70b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
70c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
70d0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
70e0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
70f0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
7100: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
7110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7120: 77 69 6e 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  winSync(OsFile *
7130: 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  id, int dataOnly
7140: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ){.  assert( id!
7150: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 33  =0 );.  OSTRACE3
7160: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
7170: 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a  d\n", ((winFile*
7180: 29 69 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69  )id)->h, ((winFi
7190: 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
71a0: 65 29 3b 0a 20 20 69 66 28 20 46 6c 75 73 68 46  e);.  if( FlushF
71b0: 69 6c 65 42 75 66 66 65 72 73 28 28 28 77 69 6e  ileBuffers(((win
71c0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 29 20 29 7b  File*)id)->h) ){
71d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
71e0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
71f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7200: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a  E_IOERR;.  }.}..
7210: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
7220: 69 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d  irectory zDirnam
7230: 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  e. This is a no-
7240: 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20  op on operating 
7250: 73 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a  systems other.**
7260: 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 69   than UNIX..*/.i
7270: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 53 79 6e  nt sqlite3WinSyn
7280: 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  cDirectory(const
7290: 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29   char *zDirname)
72a0: 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  {.  SimulateIOEr
72b0: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
72c0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
72d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
72e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
72f0: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
7300: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
7310: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
7320: 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28  int winTruncate(
7330: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  OsFile *id, i64 
7340: 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20 75  nByte){.  LONG u
7350: 70 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74 65  pperBits = nByte
7360: 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28 20  >>32;.  assert( 
7370: 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
7380: 43 45 33 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE3("TRUNCATE %d
7390: 20 25 6c 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46   %lld\n", ((winF
73a0: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6e 42 79  ile*)id)->h, nBy
73b0: 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  te);.  SimulateI
73c0: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
73d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
73e0: 41 54 45 29 3b 0a 20 20 53 65 74 46 69 6c 65 50  ATE);.  SetFileP
73f0: 6f 69 6e 74 65 72 28 28 28 77 69 6e 46 69 6c 65  ointer(((winFile
7400: 2a 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 2c  *)id)->h, nByte,
7410: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
7420: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 53 65 74 45  E_BEGIN);.  SetE
7430: 6e 64 4f 66 46 69 6c 65 28 28 28 77 69 6e 46 69  ndOfFile(((winFi
7440: 6c 65 2a 29 69 64 29 2d 3e 68 29 3b 0a 20 20 72  le*)id)->h);.  r
7450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
7470: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
7480: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
7490: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
74a0: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
74b0: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  e(OsFile *id, i6
74c0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f  4 *pSize){.  DWO
74d0: 52 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c 6f  RD upperBits, lo
74e0: 77 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65 72  werBits;.  asser
74f0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
7500: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
7510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
7520: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
7530: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
7540: 69 7a 65 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ize(((winFile*)i
7550: 64 29 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  d)->h, &upperBit
7560: 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28  s);.  *pSize = (
7570: 28 28 69 36 34 29 75 70 70 65 72 42 69 74 73 29  ((i64)upperBits)
7580: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
7590: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
75a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
75b0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
75c0: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
75d0: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
75e0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
75f0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
7600: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
7610: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
7620: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
7630: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
7640: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
7650: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
7660: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
7670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
7680: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
7690: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
76a0: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
76b0: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
76c0: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
76d0: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 69 64  Lock(winFile *id
76e0: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
76f0: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
7700: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
7710: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
7720: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
7730: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
7740: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
7750: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
7760: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
7770: 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c 4f 43  ileEx(id->h, LOC
7780: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
7790: 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41 52 45  IATELY, 0, SHARE
77a0: 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70 29 3b  D_SIZE,0,&ovlp);
77b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
77c0: 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
77d0: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
77e0: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
77f0: 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b    id->sharedLock
7800: 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
7810: 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
7820: 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
7830: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69  res = LockFile(i
7840: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  d->h, SHARED_FIR
7850: 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63  ST+id->sharedLoc
7860: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
7870: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
7880: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
7890: 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
78a0: 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
78b0: 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
78c0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
78d0: 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
78e0: 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  ) ){.    res = U
78f0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
7900: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7910: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7920: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
7930: 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46     res = UnlockF
7940: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
7950: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 46 69  ARED_FIRST + pFi
7960: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
7970: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
7980: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
7990: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
79a0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
79b0: 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  GMAS./*.** Check
79c0: 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70 61   that a given pa
79d0: 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65  thname is a dire
79e0: 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72 69  ctory and is wri
79f0: 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74  table .**.*/.int
7a00: 20 73 71 6c 69 74 65 33 57 69 6e 49 73 44 69 72   sqlite3WinIsDir
7a10: 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a  Writable(char *z
7a20: 44 69 72 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  Dirname){.  int 
7a30: 66 69 6c 65 41 74 74 72 3b 0a 20 20 76 6f 69 64  fileAttr;.  void
7a40: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
7a50: 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d 3d 30 20  if( zDirname==0 
7a60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7a70: 28 20 21 69 73 4e 54 28 29 20 26 26 20 73 74 72  ( !isNT() && str
7a80: 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3e 4d 41  len(zDirname)>MA
7a90: 58 5f 50 41 54 48 20 29 20 72 65 74 75 72 6e 20  X_PATH ) return 
7aa0: 30 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  0;..  zConverted
7ab0: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
7ac0: 6c 65 6e 61 6d 65 28 7a 44 69 72 6e 61 6d 65 29  lename(zDirname)
7ad0: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
7ae0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
7af0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7b00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
7b10: 28 29 20 29 7b 0a 20 20 20 20 66 69 6c 65 41 74  () ){.    fileAt
7b20: 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  tr = GetFileAttr
7b30: 69 62 75 74 65 73 57 28 28 57 43 48 41 52 2a 29  ibutesW((WCHAR*)
7b40: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
7b50: 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  else{.#if OS_WIN
7b60: 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  CE.    return 0;
7b70: 0a 23 65 6c 73 65 0a 20 20 20 20 66 69 6c 65 41  .#else.    fileA
7b80: 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
7b90: 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
7ba0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
7bb0: 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
7bc0: 46 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  Free(zConverted)
7bd0: 3b 0a 20 20 69 66 28 20 66 69 6c 65 41 74 74 72  ;.  if( fileAttr
7be0: 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66 20 29   == 0xffffffff )
7bf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7c00: 20 28 66 69 6c 65 41 74 74 72 20 26 20 46 49 4c   (fileAttr & FIL
7c10: 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
7c20: 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45 5f 41  CTORY) != FILE_A
7c30: 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
7c40: 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  RY ){.    return
7c50: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7c60: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
7c70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7c80: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f 2a  R_PRAGMAS */../*
7c90: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
7ca0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
7cb0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
7cc0: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
7cd0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
7ce0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
7cf0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
7d00: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
7d10: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
7d20: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
7d30: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
7d40: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
7d50: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
7d60: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
7d70: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
7d80: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
7d90: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
7da0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
7db0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
7dc0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
7dd0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
7de0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
7df0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
7e00: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
7e10: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
7e20: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
7e30: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
7e40: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
7e50: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
7e60: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
7e70: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
7e80: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
7e90: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
7ea0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
7eb0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
7ec0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
7ed0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
7ee0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
7ef0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
7f00: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
7f10: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
7f20: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
7f30: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
7f40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7f50: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
7f60: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
7f70: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
7f80: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
7f90: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
7fa0: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
7fb0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
7fc0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
7fd0: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
7fe0: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
7ff0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
8000: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
8010: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
8020: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
8030: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
8040: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
8050: 74 20 77 69 6e 4c 6f 63 6b 28 4f 73 46 69 6c 65  t winLock(OsFile
8060: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
8070: 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
8080: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
8090: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
80a0: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
80b0: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
80c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
80d0: 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f 77 73  ult of a windows
80e0: 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
80f0: 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
8100: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 64         /* Set id
8110: 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
8120: 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
8130: 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
8140: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
8150: 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
8160: 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
8170: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
8180: 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
8190: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
81a0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
81b0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
81c0: 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20   OSTRACE5("LOCK 
81d0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
81e0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
81f0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
8200: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
8210: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
8220: 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f  dLockByte);..  /
8230: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
8240: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
8250: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
8260: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
8270: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
8280: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
8290: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
82a0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
82b0: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
82c0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
82d0: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
82e0: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
82f0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
8300: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
8310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8320: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
8330: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
8340: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
8350: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
8360: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
8370: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
8380: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
8390: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
83a0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
83b0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
83c0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
83d0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
83e0: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
83f0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8400: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
8410: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
8420: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
8430: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
8440: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
8450: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
8460: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
8470: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
8480: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
8490: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
84a0: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
84b0: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
84c0: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
84d0: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
84e0: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70  ocktype;.  if( p
84f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
8500: 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c  NO_LOCK.   || (l
8510: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
8520: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
8530: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
8540: 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  RVED_LOCK).  ){.
8550: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
8560: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
8570: 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f  ->0 && (res = Lo
8580: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
8590: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
85a0: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
85b0: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
85c0: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
85d0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
85e0: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d  e pending lock m
85f0: 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a  ight be.      **
8600: 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
8610: 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20   reader process 
8620: 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  who will release
8630: 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e   it momentarily.
8640: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8650: 4f 53 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20  OSTRACE2("could 
8660: 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e  not get a PENDIN
8670: 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e  G lock. cnt=%d\n
8680: 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53  ", cnt);.      S
8690: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
86a0: 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
86b0: 6b 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20  k = res;.  }..  
86c0: 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61  /* Acquire a sha
86d0: 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  red lock.  */.  
86e0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
86f0: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  ARED_LOCK && res
8700: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8710: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
8720: 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  =NO_LOCK );.    
8730: 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63  res = getReadLoc
8740: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  k(pFile);.    if
8750: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
8760: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
8770: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
8780: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
8790: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
87a0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
87b0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
87c0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
87e0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
87f0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
8800: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
8810: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
8820: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
8830: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
8840: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
8850: 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
8860: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
8870: 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
8880: 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
8890: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
88a0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
88b0: 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
88c0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
88d0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
88e0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
88f0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
8900: 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
8910: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
8920: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
8930: 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
8940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
8950: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
8960: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
8970: 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
8980: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
8990: 20 20 20 4f 53 54 52 41 43 45 32 28 22 75 6e 72     OSTRACE2("unr
89a0: 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
89b0: 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20 3d   res);.    res =
89c0: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
89d0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
89e0: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
89f0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
8a00: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
8a10: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
8a20: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
8a30: 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  se{.      OSTRAC
8a40: 45 32 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d  E2("error-code =
8a50: 20 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45   %d\n", GetLastE
8a60: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 20  rror());.    }. 
8a70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
8a80: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
8a90: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
8aa0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
8ab0: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
8ac0: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
8ad0: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
8ae0: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
8af0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
8b00: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
8b10: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
8b20: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
8b30: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
8b40: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
8b50: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
8b60: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
8b70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
8b80: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
8b90: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
8ba0: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
8bb0: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
8bc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8bd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
8be0: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 46 41 49  TRACE4("LOCK FAI
8bf0: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
8c00: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
8c10: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
8c20: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
8c30: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 3b  e, newLocktype);
8c40: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8c50: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69  _BUSY;.  }.  pFi
8c60: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e  le->locktype = n
8c70: 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  ewLocktype;.  re
8c80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8c90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
8ca0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
8cb0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
8cc0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
8cd0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
8ce0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
8cf0: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
8d00: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
8d10: 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
8d20: 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
8d30: 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
8d40: 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
8d50: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46  ReservedLock(OsF
8d60: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
8d70: 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  rc;.  winFile *p
8d80: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
8d90: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  )id;.  assert( p
8da0: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  File!=0 );.  if(
8db0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
8dc0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
8dd0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
8de0: 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 45 53     OSTRACE3("TES
8df0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
8e00: 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c  (local)\n", pFil
8e10: 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65 6c  e->h, rc);.  }el
8e20: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63  se{.    rc = Loc
8e30: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
8e40: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
8e50: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
8e60: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c   rc ){.      Unl
8e70: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
8e80: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
8e90: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
8ea0: 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
8eb0: 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 45 53     OSTRACE3("TES
8ec0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
8ed0: 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
8ee0: 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a  le->h, rc);.  }.
8ef0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8f00: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
8f10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
8f20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8f30: 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e   id to locktype.
8f40: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
8f50: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
8f60: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
8f70: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
8f80: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
8f90: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
8fa0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
8fb0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
8fc0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
8fd0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
8fe0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
8ff0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  no-op..**.** It 
9000: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
9010: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
9020: 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20   to fail if the 
9030: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
9040: 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20  ** is NO_LOCK.  
9050: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
9060: 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44  gument is SHARED
9070: 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20  _LOCK then this 
9080: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
9090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
90a0: 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  OERR;.*/.static 
90b0: 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 4f 73  int winUnlock(Os
90c0: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
90d0: 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
90e0: 79 70 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ype;.  int rc = 
90f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 77 69 6e  SQLITE_OK;.  win
9100: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
9110: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73  inFile*)id;.  as
9120: 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
9130: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
9140: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
9150: 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  K );.  OSTRACE5(
9160: 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64  "UNLOCK %d to %d
9170: 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20   was %d(%d)\n", 
9180: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
9190: 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46  pe,.          pF
91a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
91b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
91c0: 42 79 74 65 29 3b 0a 20 20 74 79 70 65 20 3d 20  Byte);.  type = 
91d0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
91e0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
91f0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
9200: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
9210: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
9220: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
9230: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
9240: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
9250: 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
9260: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
9270: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9280: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
9290: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
92a0: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
92b0: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
92c0: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
92d0: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
92e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
92f0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
9300: 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
9310: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
9320: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
9330: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
9340: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
9350: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
9360: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
9370: 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
9380: 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
9390: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
93a0: 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
93b0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
93c0: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
93d0: 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
93e0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
93f0: 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
9400: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
9410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9420: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
9430: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
9440: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
9450: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
9460: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
9470: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
9480: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
9490: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
94a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
94b0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
94c0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
94d0: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
94e0: 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
94f0: 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
9500: 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
9510: 68 61 72 20 2a 73 71 6c 69 74 65 33 57 69 6e 46  har *sqlite3WinF
9520: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e 73  ullPathname(cons
9530: 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
9540: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  e){.  char *zFul
9550: 6c 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  l;.#if defined(_
9560: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
9570: 20 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74 65 20   nByte;.  nByte 
9580: 3d 20 73 74 72 6c 65 6e 28 7a 52 65 6c 61 74 69  = strlen(zRelati
9590: 76 65 29 20 2b 20 4d 41 58 5f 50 41 54 48 20 2b  ve) + MAX_PATH +
95a0: 20 31 30 30 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d   1001;.  zFull =
95b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
95c0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
95d0: 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ull==0 ) return 
95e0: 30 3b 0a 20 20 69 66 28 20 63 79 67 77 69 6e 5f  0;.  if( cygwin_
95f0: 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
9600: 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76  32_path(zRelativ
9610: 65 2c 20 7a 46 75 6c 6c 29 20 29 20 72 65 74 75  e, zFull) ) retu
9620: 72 6e 20 30 3b 0a 23 65 6c 69 66 20 4f 53 5f 57  rn 0;.#elif OS_W
9630: 49 4e 43 45 0a 20 20 2f 2a 20 57 69 6e 43 45 20  INCE.  /* WinCE 
9640: 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
9650: 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
9660: 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
9670: 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 7a 46 75  m told. */.  zFu
9680: 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  ll = sqliteStrDu
9690: 70 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65  p(zRelative);.#e
96a0: 6c 73 65 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  lse.  int nByte;
96b0: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
96c0: 74 65 64 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ted;.  zConverte
96d0: 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
96e0: 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
96f0: 65 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  e);.  if( isNT()
9700: 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a   ){.    WCHAR *z
9710: 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
9720: 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  = GetFullPathNam
9730: 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
9740: 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20  erted, 0, 0, 0) 
9750: 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  + 3;.    zTemp =
9760: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
9770: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
9780: 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
9790: 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
97a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43     sqliteFree(zC
97b0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
97c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
97d0: 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68  .    GetFullPath
97e0: 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43  NameW((WCHAR*)zC
97f0: 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
9800: 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
9810: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76  sqliteFree(zConv
9820: 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 46 75 6c  erted);.    zFul
9830: 6c 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  l = unicodeToUtf
9840: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
9850: 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b  liteFree(zTemp);
9860: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
9870: 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
9880: 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61  Byte = GetFullPa
9890: 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
98a0: 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
98b0: 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65   0) + 3;.    zTe
98c0: 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mp = sqliteMallo
98d0: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
98e0: 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
98f0: 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
9900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
9910: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
9920: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
9930: 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c     }.    GetFull
9940: 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
9950: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
9960: 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
9970: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43     sqliteFree(zC
9980: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
9990: 46 75 6c 6c 20 3d 20 6d 62 63 73 54 6f 55 74 66  Full = mbcsToUtf
99a0: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
99b0: 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b  liteFree(zTemp);
99c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
99d0: 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f  turn zFull;.}../
99e0: 2a 0a 2a 2a 20 54 68 65 20 66 75 6c 6c 53 79 6e  *.** The fullSyn
99f0: 63 20 6f 70 74 69 6f 6e 20 69 73 20 6d 65 61 6e  c option is mean
9a00: 69 6e 67 6c 65 73 73 20 6f 6e 20 77 69 6e 64 6f  ingless on windo
9a10: 77 73 2e 20 20 20 54 68 69 73 20 69 73 20 61 20  ws.   This is a 
9a20: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9a30: 20 76 6f 69 64 20 77 69 6e 53 65 74 46 75 6c 6c   void winSetFull
9a40: 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
9a50: 20 69 6e 74 20 76 29 7b 0a 20 20 72 65 74 75 72   int v){.  retur
9a60: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
9a70: 72 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rn the underlyin
9a80: 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  g file handle fo
9a90: 72 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73  r an OsFile.*/.s
9aa0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
9ab0: 65 48 61 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a  eHandle(OsFile *
9ac0: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69  id){.  return (i
9ad0: 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  nt)((winFile*)id
9ae0: 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  )->h;.}../*.** R
9af0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
9b00: 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 74 68   that indices th
9b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  e type of lock c
9b20: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a 2a 2a  urrently held.**
9b30: 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   by this handle.
9b40: 20 20 28 55 73 65 64 20 66 6f 72 20 74 65 73 74    (Used for test
9b50: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
9b60: 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61 74 69   only.).*/.stati
9b70: 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 53 74 61  c int winLockSta
9b80: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  te(OsFile *id){.
9b90: 20 20 72 65 74 75 72 6e 20 28 28 77 69 6e 46 69    return ((winFi
9ba0: 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
9bb0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
9bc0: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
9bd0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
9be0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
9bf0: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
9c00: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
9c10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
9c20: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
9c30: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
9c40: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
9c50: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
9c60: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
9c70: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
9c80: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
9c90: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
9ca0: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
9cb0: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
9cc0: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
9cd0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
9ce0: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
9cf0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
9d00: 27 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  's journal file)
9d10: 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
9d20: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
9d30: 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
9d40: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
9d50: 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
9d60: 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
9d70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
9d80: 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
9d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9da0: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
9db0: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
9dc0: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
9dd0: 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  on an OsFile.** 
9de0: 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
9df0: 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74  atic const IoMet
9e00: 68 6f 64 20 73 71 6c 69 74 65 33 57 69 6e 49 6f  hod sqlite3WinIo
9e10: 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 77 69 6e  Method = {.  win
9e20: 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 4f 70 65 6e  Close,.  winOpen
9e30: 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 77 69 6e  Directory,.  win
9e40: 52 65 61 64 2c 0a 20 20 77 69 6e 57 72 69 74 65  Read,.  winWrite
9e50: 2c 0a 20 20 77 69 6e 53 65 65 6b 2c 0a 20 20 77  ,.  winSeek,.  w
9e60: 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20 20 77 69  inTruncate,.  wi
9e70: 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 53 65 74 46  nSync,.  winSetF
9e80: 75 6c 6c 53 79 6e 63 2c 0a 20 20 77 69 6e 46 69  ullSync,.  winFi
9e90: 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 77 69 6e 46  leHandle,.  winF
9ea0: 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f  ileSize,.  winLo
9eb0: 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c  ck,.  winUnlock,
9ec0: 0a 20 20 77 69 6e 4c 6f 63 6b 53 74 61 74 65 2c  .  winLockState,
9ed0: 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
9ee0: 76 65 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 53 65  vedLock,.  winSe
9ef0: 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a  ctorSize,.};../*
9f00: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
9f10: 6f 72 79 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c  ory for an OsFil
9f20: 65 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  e.  Initialize t
9f30: 68 65 20 6e 65 77 20 4f 73 46 69 6c 65 0a 2a 2a  he new OsFile.**
9f40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67 69   to the value gi
9f50: 76 65 6e 20 69 6e 20 70 49 6e 69 74 20 61 6e 64  ven in pInit and
9f60: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
9f70: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
9f80: 4f 73 46 69 6c 65 2e 20 20 49 66 20 77 65 20 72  OsFile.  If we r
9f90: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
9fa0: 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
9fb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
9fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9fd0: 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28  allocateWinFile(
9fe0: 77 69 6e 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20  winFile *pInit, 
9ff0: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20  OsFile **pId){. 
a000: 20 77 69 6e 46 69 6c 65 20 2a 70 4e 65 77 3b 0a   winFile *pNew;.
a010: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
a020: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a030: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
a040: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6c 6f  ew==0 ){.    Clo
a050: 73 65 48 61 6e 64 6c 65 28 70 49 6e 69 74 2d 3e  seHandle(pInit->
a060: 68 29 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  h);.#if OS_WINCE
a070: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a080: 70 49 6e 69 74 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pInit->zDeleteOn
a090: 43 6c 6f 73 65 29 3b 0a 23 65 6e 64 69 66 0a 20  Close);.#endif. 
a0a0: 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20     *pId = 0;.   
a0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a0c0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
a0d0: 20 20 20 2a 70 4e 65 77 20 3d 20 2a 70 49 6e 69     *pNew = *pIni
a0e0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  t;.    pNew->pMe
a0f0: 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 57  thod = &sqlite3W
a100: 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  inIoMethod;.    
a110: 70 4e 65 77 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  pNew->locktype =
a120: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4e   NO_LOCK;.    pN
a130: 65 77 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  ew->sharedLockBy
a140: 74 65 20 3d 20 30 3b 0a 20 20 20 20 2a 70 49 64  te = 0;.    *pId
a150: 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77   = (OsFile*)pNew
a160: 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
a170: 72 28 2b 31 29 3b 0a 20 20 20 20 72 65 74 75 72  r(+1);.    retur
a180: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
a190: 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}...#endif /* S
a1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
a1b0: 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  O */./**********
a1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a200: 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20  *.** Everything 
a210: 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68  above deals with
a220: 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72   file I/O.  Ever
a230: 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c  ything that foll
a240: 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74  ows deals.** wit
a250: 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61  h other miscella
a260: 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66 20  nous aspects of 
a270: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
a280: 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a  stem interface.*
a290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
a2e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a2f0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
a300: 4e 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 49 6e 74  NSION)./*.** Int
a310: 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
a320: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
a330: 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
a340: 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
a350: 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
a360: 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
a370: 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
a380: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64  library..*/.void
a390: 20 2a 73 71 6c 69 74 65 33 57 69 6e 44 6c 6f 70   *sqlite3WinDlop
a3a0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
a3b0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
a3c0: 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
a3d0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
a3e0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
a3f0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
a400: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
a410: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a420: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
a430: 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61  ) ){.    h = Loa
a440: 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52  dLibraryW((WCHAR
a450: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
a460: 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57   }else{.#if OS_W
a470: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
a480: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  0;.#else.    h =
a490: 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63   LoadLibraryA((c
a4a0: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
a4b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
a4c0: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6e 76 65  qliteFree(zConve
a4d0: 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
a4e0: 28 76 6f 69 64 2a 29 68 3b 0a 20 20 0a 7d 0a 76  (void*)h;.  .}.v
a4f0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 57 69 6e 44  oid *sqlite3WinD
a500: 6c 73 79 6d 28 76 6f 69 64 20 2a 70 48 61 6e 64  lsym(void *pHand
a510: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
a520: 7a 53 79 6d 62 6f 6c 29 7b 0a 23 69 66 20 4f 53  zSymbol){.#if OS
a530: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
a540: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
a550: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
a560: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77  y available on w
a570: 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72  ince. */.  retur
a580: 6e 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  n GetProcAddress
a590: 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  A((HANDLE)pHandl
a5a0: 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c  e, zSymbol);.#el
a5b0: 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65  se.  /* All othe
a5c0: 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f  r windows platfo
a5d0: 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72  rms expect GetPr
a5e0: 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74  ocAddress() to t
a5f0: 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69  ake.  ** an Ansi
a600: 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65   string regardle
a610: 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f  ss of the _UNICO
a620: 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  DE setting */.  
a630: 72 65 74 75 72 6e 20 47 65 74 50 72 6f 63 41 64  return GetProcAd
a640: 64 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48  dress((HANDLE)pH
a650: 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b  andle, zSymbol);
a660: 0a 23 65 6e 64 69 66 0a 7d 0a 69 6e 74 20 73 71  .#endif.}.int sq
a670: 6c 69 74 65 33 57 69 6e 44 6c 63 6c 6f 73 65 28  lite3WinDlclose(
a680: 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
a690: 20 20 72 65 74 75 72 6e 20 46 72 65 65 4c 69 62    return FreeLib
a6a0: 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61  rary((HANDLE)pHa
a6b0: 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ndle);.}.#endif 
a6c0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
a6d0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a  LOAD_EXTENSION *
a6e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66  /../*.** Get inf
a6f0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64  ormation to seed
a700: 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62   the random numb
a710: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54  er generator.  T
a720: 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72  he seed.** is wr
a730: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62  itten into the b
a740: 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e  uffer zBuf[256].
a750: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
a760: 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73  nction must.** s
a770: 75 70 70 6c 79 20 61 20 73 75 66 66 69 63 69 65  upply a sufficie
a780: 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65  ntly large buffe
a790: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
a7a0: 33 57 69 6e 52 61 6e 64 6f 6d 53 65 65 64 28 63  3WinRandomSeed(c
a7b0: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
a7c0: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
a7d0: 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
a7e0: 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
a7f0: 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
a800: 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
a810: 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
a820: 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
a830: 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
a840: 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
a850: 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
a860: 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
a870: 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
a880: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
a890: 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
a8a0: 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
a8b0: 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
a8c0: 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
a8d0: 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
a8e0: 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
a8f0: 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
a900: 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
a910: 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
a920: 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
a930: 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
a940: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
a950: 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
a960: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
a970: 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
a980: 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
a990: 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
a9a0: 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
a9b0: 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
a9c0: 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
a9d0: 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
a9e0: 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
a9f0: 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
aa00: 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .* This makes th
aa10: 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
aa20: 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
aa30: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
aa40: 32 35 36 29 3b 0a 20 20 47 65 74 53 79 73 74 65  256);.  GetSyste
aa50: 6d 54 69 6d 65 28 28 4c 50 53 59 53 54 45 4d 54  mTime((LPSYSTEMT
aa60: 49 4d 45 29 7a 42 75 66 29 3b 0a 20 20 72 65 74  IME)zBuf);.  ret
aa70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
aa80: 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
aa90: 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
aaa0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
aab0: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
aac0: 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
aad0: 65 33 57 69 6e 53 6c 65 65 70 28 69 6e 74 20 6d  e3WinSleep(int m
aae0: 73 29 7b 0a 20 20 53 6c 65 65 70 28 6d 73 29 3b  s){.  Sleep(ms);
aaf0: 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a 7d 0a  .  return ms;.}.
ab00: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61  ./*.** Static va
ab10: 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72  riables used for
ab20: 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e   thread synchron
ab30: 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ization.*/.stati
ab40: 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20  c int inMutex = 
ab50: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
ab60: 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 73  _W32_THREADS.  s
ab70: 74 61 74 69 63 20 44 57 4f 52 44 20 6d 75 74 65  tatic DWORD mute
ab80: 78 4f 77 6e 65 72 3b 0a 20 20 73 74 61 74 69 63  xOwner;.  static
ab90: 20 43 52 49 54 49 43 41 4c 5f 53 45 43 54 49 4f   CRITICAL_SECTIO
aba0: 4e 20 63 73 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  N cs;.#endif../*
abb0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
abc0: 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e  g pair of routin
abd0: 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74  es implement mut
abe0: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f  ual exclusion fo
abf0: 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  r.** multi-threa
ac00: 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20  ded processes.  
ac10: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68  Only a single th
ac20: 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20  read is allowed 
ac30: 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63  to.** executed c
ac40: 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72  ode that is surr
ac50: 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d  ounded by EnterM
ac60: 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65  utex() and Leave
ac70: 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53  Mutex()..**.** S
ac80: 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20  QLite uses only 
ac90: 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20  a single Mutex. 
aca0: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   There is not mu
acb0: 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63  ch critical.** c
acc0: 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74  ode and what lit
acd0: 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65  tle there is exe
ace0: 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e  cutes quickly an
acf0: 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69  d without blocki
ad00: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f  ng..**.** Versio
ad10: 6e 20 33 2e 33 2e 31 20 61 6e 64 20 65 61 72 6c  n 3.3.1 and earl
ad20: 69 65 72 20 75 73 65 64 20 61 20 73 69 6d 70 6c  ier used a simpl
ad30: 65 20 6d 75 74 65 78 2e 20 20 42 65 67 69 6e 6e  e mutex.  Beginn
ad40: 69 6e 67 20 77 69 74 68 0a 2a 2a 20 76 65 72 73  ing with.** vers
ad50: 69 6f 6e 20 33 2e 33 2e 32 2c 20 61 20 72 65 63  ion 3.3.2, a rec
ad60: 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 73 20  ursive mutex is 
ad70: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69  required..*/.voi
ad80: 64 20 73 71 6c 69 74 65 33 57 69 6e 45 6e 74 65  d sqlite3WinEnte
ad90: 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66  rMutex(){.#ifdef
ada0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
adb0: 41 44 53 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ADS.  static int
adc0: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77   isInit = 0;.  w
add0: 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 29 7b  hile( !isInit ){
ade0: 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67  .    static long
adf0: 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69   lock = 0;.    i
ae00: 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e  f( InterlockedIn
ae10: 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d  crement(&lock)==
ae20: 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69  1 ){.      Initi
ae30: 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63  alizeCriticalSec
ae40: 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 20  tion(&cs);.     
ae50: 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20   isInit = 1;.   
ae60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c   }else{.      Sl
ae70: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
ae80: 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69 63 61  }.  EnterCritica
ae90: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20  lSection(&cs);. 
aea0: 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20 47 65   mutexOwner = Ge
aeb0: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64  tCurrentThreadId
aec0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 4d  ();.#endif.  inM
aed0: 75 74 65 78 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 73  utex++;.}.void s
aee0: 71 6c 69 74 65 33 57 69 6e 4c 65 61 76 65 4d 75  qlite3WinLeaveMu
aef0: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
af00: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
af10: 4d 75 74 65 78 2d 2d 3b 0a 23 69 66 64 65 66 20  Mutex--;.#ifdef 
af20: 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41  SQLITE_W32_THREA
af30: 44 53 0a 20 20 61 73 73 65 72 74 28 20 6d 75 74  DS.  assert( mut
af40: 65 78 4f 77 6e 65 72 3d 3d 47 65 74 43 75 72 72  exOwner==GetCurr
af50: 65 6e 74 54 68 72 65 61 64 49 64 28 29 20 29 3b  entThreadId() );
af60: 0a 20 20 4c 65 61 76 65 43 72 69 74 69 63 61 6c  .  LeaveCritical
af70: 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65  Section(&cs);.#e
af80: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
af90: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
afa0: 20 6d 75 74 65 78 20 69 73 20 63 75 72 72 65 6e   mutex is curren
afb0: 74 6c 79 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  tly held..**.** 
afc0: 49 66 20 74 68 65 20 74 68 69 73 54 68 72 65 61  If the thisThrea
afd0: 64 4f 6e 6c 79 20 70 61 72 61 6d 65 74 65 72 20  dOnly parameter 
afe0: 69 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20  is true, return 
aff0: 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79  true if and only
b000: 20 69 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69   if the.** calli
b010: 6e 67 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20  ng thread holds 
b020: 74 68 65 20 6d 75 74 65 78 2e 20 20 49 66 20 74  the mutex.  If t
b030: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
b040: 66 61 6c 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a  false, return.**
b050: 20 74 72 75 65 20 69 66 20 61 6e 79 20 74 68 72   true if any thr
b060: 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  ead holds the mu
b070: 74 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  tex..*/.int sqli
b080: 74 65 33 57 69 6e 49 6e 4d 75 74 65 78 28 69 6e  te3WinInMutex(in
b090: 74 20 74 68 69 73 54 68 72 65 61 64 4f 6e 6c 79  t thisThreadOnly
b0a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
b0b0: 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 72  _W32_THREADS.  r
b0c0: 65 74 75 72 6e 20 69 6e 4d 75 74 65 78 3e 30 20  eturn inMutex>0 
b0d0: 26 26 20 28 74 68 69 73 54 68 72 65 61 64 4f 6e  && (thisThreadOn
b0e0: 6c 79 3d 3d 30 20 7c 7c 20 6d 75 74 65 78 4f 77  ly==0 || mutexOw
b0f0: 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e 74 54  ner==GetCurrentT
b100: 68 72 65 61 64 49 64 28 29 29 3b 0a 23 65 6c 73  hreadId());.#els
b110: 65 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74  e.  return inMut
b120: 65 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ex>0;.#endif.}..
b130: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
b140: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
b150: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
b160: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
b170: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
b180: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
b190: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
b1a0: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
b1b0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
b1c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
b1d0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
b1e0: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
b1f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
b200: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
b210: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
b220: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
b230: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
b240: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
b250: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
b260: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
b270: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
b280: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
b290: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
b2a0: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
b2b0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
b2c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b2d0: 33 57 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28  3WinCurrentTime(
b2e0: 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
b2f0: 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
b300: 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
b310: 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
b320: 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
b330: 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
b340: 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
b350: 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
b360: 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
b370: 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
b380: 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
b390: 0a 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23  .  double now;.#
b3a0: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59  if OS_WINCE.  SY
b3b0: 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20  STEMTIME time;. 
b3c0: 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26   GetSystemTime(&
b3d0: 74 69 6d 65 29 3b 0a 20 20 53 79 73 74 65 6d 54  time);.  SystemT
b3e0: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
b3f0: 69 6d 65 2c 26 66 74 29 3b 0a 23 65 6c 73 65 0a  ime,&ft);.#else.
b400: 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41    GetSystemTimeA
b410: 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
b420: 3b 0a 23 65 6e 64 69 66 0a 20 20 6e 6f 77 20 3d  ;.#endif.  now =
b430: 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48   ((double)ft.dwH
b440: 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34  ighDateTime) * 4
b450: 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20  294967296.0; .  
b460: 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20  *prNow = (now + 
b470: 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
b480: 29 2f 38 36 34 30 30 30 30 30 30 30 30 30 2e 30  )/864000000000.0
b490: 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 69   + 2305813.5;.#i
b4a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
b4b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
b4c0: 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
b4d0: 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
b4e0: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
b4f0: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
b500: 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
b510: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b520: 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  /*.** Remember t
b530: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72  he number of thr
b540: 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74  ead-specific-dat
b550: 61 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74  a blocks allocat
b560: 65 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  ed..** Use this 
b570: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 77  to verify that w
b580: 65 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69 6e  e are not leakin
b590: 67 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  g thread-specifi
b5a0: 63 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b 65  c-data..** Ticke
b5b0: 74 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64 65  t #1601.*/.#ifde
b5c0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
b5d0: 74 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f  t sqlite3_tsd_co
b5e0: 75 6e 74 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e  unt = 0;.# defin
b5f0: 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 49 4e  e TSD_COUNTER_IN
b600: 43 52 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e  CR InterlockedIn
b610: 63 72 65 6d 65 6e 74 28 26 73 71 6c 69 74 65 33  crement(&sqlite3
b620: 5f 74 73 64 5f 63 6f 75 6e 74 29 0a 23 20 64 65  _tsd_count).# de
b630: 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52  fine TSD_COUNTER
b640: 5f 44 45 43 52 20 49 6e 74 65 72 6c 6f 63 6b 65  _DECR Interlocke
b650: 64 44 65 63 72 65 6d 65 6e 74 28 26 73 71 6c 69  dDecrement(&sqli
b660: 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 29 0a 23  te3_tsd_count).#
b670: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 53  else.# define TS
b680: 44 5f 43 4f 55 4e 54 45 52 5f 49 4e 43 52 20 20  D_COUNTER_INCR  
b690: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65  /* no-op */.# de
b6a0: 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52  fine TSD_COUNTER
b6b0: 5f 44 45 43 52 20 20 2f 2a 20 6e 6f 2d 6f 70 20  _DECR  /* no-op 
b6c0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  */.#endif..../*.
b6d0: 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74  ** If called wit
b6e0: 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 31  h allocateFlag>1
b6f0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
b700: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 72 65 61  pointer to threa
b710: 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61  d.** specific da
b720: 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
b730: 6e 74 20 74 68 72 65 61 64 2e 20 20 41 6c 6c 6f  nt thread.  Allo
b740: 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68  cate and zero th
b750: 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73 70 65 63  e.** thread-spec
b760: 69 66 69 63 20 64 61 74 61 20 69 66 20 69 74 20  ific data if it 
b770: 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
b780: 20 65 78 69 73 74 20 6e 65 63 65 73 73 61 72 79   exist necessary
b790: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65  ..**.** If calle
b7a0: 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46  d with allocateF
b7b0: 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 63 68 65  lag==0, then che
b7c0: 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ck the current t
b7d0: 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69  hread.** specifi
b7e0: 63 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20  c data.  Return 
b7f0: 69 74 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  it if it exists.
b800: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
b810: 20 65 78 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20   exist,.** then 
b820: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
b830: 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74  ** If called wit
b840: 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30  h allocateFlag<0
b850: 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
b860: 66 20 74 68 65 20 74 68 72 65 61 64 20 73 70 65  f the thread spe
b870: 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 69 73  cific.** data is
b880: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
b890: 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20 49 66 20  s all zero.  If 
b8a0: 69 74 20 69 73 20 74 68 65 6e 20 64 65 61 6c 6c  it is then deall
b8b0: 6f 63 61 74 65 20 69 74 2e 0a 2a 2a 20 52 65 74  ocate it..** Ret
b8c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b8d0: 20 74 68 65 20 74 68 72 65 61 64 20 73 70 65 63   the thread spec
b8e0: 69 66 69 63 20 64 61 74 61 20 6f 72 20 4e 55 4c  ific data or NUL
b8f0: 4c 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 75 6e  L if it is.** un
b900: 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 67 65 74  allocated or get
b910: 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  s deallocated..*
b920: 2f 0a 54 68 72 65 61 64 44 61 74 61 20 2a 73 71  /.ThreadData *sq
b930: 6c 69 74 65 33 57 69 6e 54 68 72 65 61 64 53 70  lite3WinThreadSp
b940: 65 63 69 66 69 63 44 61 74 61 28 69 6e 74 20 61  ecificData(int a
b950: 6c 6c 6f 63 61 74 65 46 6c 61 67 29 7b 0a 20 20  llocateFlag){.  
b960: 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79 3b 0a  static int key;.
b970: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79    static int key
b980: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 74 61 74  Init = 0;.  stat
b990: 69 63 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  ic const ThreadD
b9a0: 61 74 61 20 7a 65 72 6f 44 61 74 61 20 3d 20 7b  ata zeroData = {
b9b0: 30 7d 3b 0a 20 20 54 68 72 65 61 64 44 61 74 61  0};.  ThreadData
b9c0: 20 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28 20 21   *pTsd;..  if( !
b9d0: 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  keyInit ){.    s
b9e0: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
b9f0: 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 21 6b  ex();.    if( !k
ba00: 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  eyInit ){.      
ba10: 6b 65 79 20 3d 20 54 6c 73 41 6c 6c 6f 63 28 29  key = TlsAlloc()
ba20: 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 65 79 3d  ;.      if( key=
ba30: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
ba40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
ba50: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
ba60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
ba70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65        }.      ke
ba80: 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  yInit = 1;.    }
ba90: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
baa0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
bab0: 20 20 70 54 73 64 20 3d 20 54 6c 73 47 65 74 56    pTsd = TlsGetV
bac0: 61 6c 75 65 28 6b 65 79 29 3b 0a 20 20 69 66 28  alue(key);.  if(
bad0: 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20   allocateFlag>0 
bae0: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 54 73 64  ){.    if( !pTsd
baf0: 20 29 7b 0a 20 20 20 20 20 20 70 54 73 64 20 3d   ){.      pTsd =
bb00: 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
bb10: 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74  ( sizeof(zeroDat
bb20: 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a) );.      if( 
bb30: 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pTsd ){.        
bb40: 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61  *pTsd = zeroData
bb50: 3b 0a 20 20 20 20 20 20 20 20 54 6c 73 53 65 74  ;.        TlsSet
bb60: 56 61 6c 75 65 28 6b 65 79 2c 20 70 54 73 64 29  Value(key, pTsd)
bb70: 3b 0a 20 20 20 20 20 20 20 20 54 53 44 5f 43 4f  ;.        TSD_CO
bb80: 55 4e 54 45 52 5f 49 4e 43 52 3b 0a 20 20 20 20  UNTER_INCR;.    
bb90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
bba0: 65 20 69 66 28 20 70 54 73 64 21 3d 30 20 26 26  e if( pTsd!=0 &&
bbb0: 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 20   allocateFlag<0 
bbc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
bbd0: 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26  & memcmp(pTsd, &
bbe0: 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66  zeroData, sizeof
bbf0: 28 54 68 72 65 61 64 44 61 74 61 29 29 3d 3d 30  (ThreadData))==0
bc00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
bc10: 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20 20 20  sFree(pTsd);.   
bc20: 20 54 6c 73 53 65 74 56 61 6c 75 65 28 6b 65 79   TlsSetValue(key
bc30: 2c 20 30 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f  , 0);.    TSD_CO
bc40: 55 4e 54 45 52 5f 44 45 43 52 3b 0a 20 20 20 20  UNTER_DECR;.    
bc50: 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pTsd = 0;.  }.  
bc60: 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 7d 0a 23  return pTsd;.}.#
bc70: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 20  endif /* OS_WIN 
bc80: 2a 2f 0a                                         */.