/ Hex Artifact Content
Login

Artifact 8a549824ca5cf85a06b550fa95090fa911c4e5ee:


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 57 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 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 48 41 4e 44 4c 45  _OS_WINRT.HANDLE
06d0: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
06e0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
06f0: 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52  (HANDLE, LPSECUR
0700: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
0710: 5c 0a 20 20 20 20 20 20 20 20 55 4c 4f 4e 47 2c  \.        ULONG,
0720: 20 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54   ULONG64, LPCWST
0730: 52 29 3b 0a 0a 4c 50 56 4f 49 44 20 57 49 4e 41  R);..LPVOID WINA
0740: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
0750: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20  FromApp(HANDLE, 
0760: 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20  ULONG, ULONG64, 
0770: 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23  SIZE_T);.#else.#
0780: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0790: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
07a0: 29 0a 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20  ).HANDLE WINAPI 
07b0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
07c0: 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43  gA(HANDLE, LPSEC
07d0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
07e0: 2c 20 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  , DWORD, \.     
07f0: 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c     DWORD, DWORD,
0800: 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66   LPCSTR);.#endif
0810: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
0820: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0830: 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  I) */..#if defin
0840: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0850: 48 41 53 5f 57 49 44 45 29 0a 48 41 4e 44 4c 45  HAS_WIDE).HANDLE
0860: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
0870: 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c  leMappingW(HANDL
0880: 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54  E, LPSECURITY_AT
0890: 54 52 49 42 55 54 45 53 2c 20 44 57 4f 52 44 2c  TRIBUTES, DWORD,
08a0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
08b0: 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52  , DWORD, LPCWSTR
08c0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
08d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
08e0: 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a  2_HAS_WIDE) */..
08f0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
0900: 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e 44  pViewOfFile(HAND
0910: 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  LE, DWORD, DWORD
0920: 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54 29  , DWORD, SIZE_T)
0930: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
0940: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
0950: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0960: 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20 63  mapping API is c
0970: 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69  ommon to both Wi
0980: 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a  n32 and WinRT..*
0990: 2f 0a 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  /.BOOL WINAPI Un
09a0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
09b0: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
09c0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
09d0: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
09e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
09f0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a  E_OMIT_WAL) */..
0a00: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f 20 66  /*.** Macro to f
0a10: 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ind the minimum 
0a20: 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63 20 76  of two numeric v
0a30: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  alues..*/.#ifnde
0a40: 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65 20 4d  f MIN.# define M
0a50: 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28 79 29  IN(x,y) ((x)<(y)
0a60: 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64 69 66  ?(x):(y)).#endif
0a70: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63  ../*.** Some Mic
0a80: 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
0a90: 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
0aa0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
0ab0: 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  f INVALID_FILE_A
0ac0: 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66 69  TTRIBUTES.# defi
0ad0: 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ne INVALID_FILE_
0ae0: 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57 4f  ATTRIBUTES ((DWO
0af0: 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66 0a 0a  RD)-1) .#endif..
0b00: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
0b10: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
0b20: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
0b30: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
0b40: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
0b50: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
0b60: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
0b70: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
0b80: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
0b90: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
0ba0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0bb0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
0bc0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0bd0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0be0: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0bf0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0c00: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0c10: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0c20: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
0c30: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
0c40: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
0c50: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
0c60: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
0c70: 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61  * WinCE lacks na
0c80: 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72  tive support for
0c90: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f   file locking so
0ca0: 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65   we have to fake
0cb0: 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65   it.** with some
0cc0: 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e   code of our own
0cd0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0ce0: 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66  OS_WINCE.typedef
0cf0: 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63   struct winceLoc
0d00: 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65  k {.  int nReade
0d10: 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  rs;       /* Num
0d20: 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f  ber of reader lo
0d30: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  cks obtained */.
0d40: 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b    BOOL bPending;
0d50: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74        /* Indicat
0d60: 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  es a pending loc
0d70: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
0d80: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  ned */.  BOOL bR
0d90: 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20  eserved;     /* 
0da0: 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65  Indicates a rese
0db0: 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65  rved lock has be
0dc0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
0dd0: 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65   BOOL bExclusive
0de0: 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65  ;    /* Indicate
0df0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
0e00: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0e10: 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65  ained */.} wince
0e20: 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  Lock;.#endif../*
0e30: 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20  .** The winFile 
0e40: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73  structure is a s
0e50: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
0e60: 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69  e3_file* specifi
0e70: 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a  c to the win32.*
0e80: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61  * portability la
0e90: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0ea0: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77  struct winFile w
0eb0: 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77  inFile;.struct w
0ec0: 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74  inFile {.  const
0ed0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
0ee0: 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a  ods *pMethod; /*
0ef0: 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  ** Must be first
0f00: 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   ***/.  sqlite3_
0f10: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
0f20: 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20  /* The VFS used 
0f30: 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  to open this fil
0f40: 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  e */.  HANDLE h;
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f60: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
0f70: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
0f80: 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65  */.  u8 locktype
0f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0fa0: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
0fb0: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
0fc0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
0fd0: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
0fe0: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
0ff0: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
1000: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
1010: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c  ock */.  u8 ctrl
1020: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1030: 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20   /* Flags.  See 
1040: 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20  WINFILE_* below 
1050: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
1060: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  rrno;        /* 
1070: 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1080: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1090: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66  I/O error */.#if
10a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10b0: 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70  _WAL.  winShm *p
10c0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
10d0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
10e0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
10f0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  his file */.#end
1100: 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  if.  const char 
1110: 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20  *zPath;      /* 
1120: 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  Full pathname of
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1140: 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  int szChunk;    
1150: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b          /* Chunk
1160: 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64   size configured
1170: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1180: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1190: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50  TE_OS_WINCE.  LP
11a0: 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c  WSTR zDeleteOnCl
11b0: 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ose;  /* Name of
11c0: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
11d0: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
11e0: 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b    HANDLE hMutex;
11f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
1200: 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  ex used to contr
1210: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61  ol access to sha
1220: 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20  red lock */  .  
1230: 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20  HANDLE hShared; 
1240: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1250: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1260: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1270: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b  g */.  winceLock
1280: 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f   local;        /
1290: 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  * Locks obtained
12a0: 20 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63   by this instanc
12b0: 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a  e of winFile */.
12c0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61    winceLock *sha
12d0: 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f  red;      /* Glo
12e0: 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  bal shared lock 
12f0: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66  memory for the f
1300: 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  ile  */.#endif.}
1310: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
1320: 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46   values for winF
1330: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f  ile.ctrlFlags.*/
1340: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
1350: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20  _PERSIST_WAL    
1360: 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69   0x04   /* Persi
1370: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
1380: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
1390: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20 20  E_PSOW          
13a0: 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49    0x10   /* SQLI
13b0: 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
13c0: 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a  FE_OVERWRITE */.
13d0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20  ./*. * The size 
13e0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75 73  of the buffer us
13f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69  ed by sqlite3_wi
1400: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
1410: 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ).. */.#ifndef S
1420: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
1430: 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  BUF_SIZE.#  defi
1440: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1450: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28  DBG_BUF_SIZE   (
1460: 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f  (int)(4096-sizeo
1470: 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69  f(DWORD))).#endi
1480: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
1490: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
14a0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
14b0: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
14c0: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
14d0: 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
14e0: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
14f0: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
1500: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
1510: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
1520: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1530: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
1540: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a  ECTORY_TYPE (1).
1550: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
1560: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
1570: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
1580: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
1590: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
15a0: 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79   * the temporary
15b0: 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c   directory shoul
15c0: 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a  d be changed.. *
15d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
15e0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
15f0: 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65  CTORY_TYPE.#  de
1600: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1610: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
1620: 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66  _TYPE (2).#endif
1630: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69  ../*. * If compi
1640: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
1650: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20  WIN32_MALLOC on 
1660: 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c  Windows, we will
1670: 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69   use the. * vari
1680: 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68 65  ous Win32 API he
1690: 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73  ap functions ins
16a0: 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  tead of our own.
16b0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
16c0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
16d0: 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69  ./*. * If this i
16e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69  s non-zero, an i
16f0: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
1700: 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79 20  l be created by 
1710: 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32  the native Win32
1720: 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75  . * allocator su
1730: 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69  bsystem; otherwi
1740: 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
1750: 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c  process heap wil
1760: 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69 73  l be used.  This
1770: 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20  . * setting has 
1780: 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20 63  no effect when c
1790: 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e  ompiling for Win
17a0: 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  RT.  By default,
17b0: 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64   this is enabled
17c0: 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61  . * and an isola
17d0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
17e0: 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72   created to stor
17f0: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20  e all allocated 
1800: 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a  data.. *. ******
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1850: 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e  ********. * WARN
1860: 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72  ING: It is impor
1870: 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61  tant to note tha
1880: 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74 74  t when this sett
1890: 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ing is non-zero 
18a0: 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20  and the. *      
18b0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
18c0: 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  wn function is c
18d0: 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74  alled (e.g. by t
18e0: 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  he sqlite3_shutd
18f0: 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20  own. *          
1900: 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64  function), all d
1910: 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c  ata that was all
1920: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ocated using the
1930: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1940: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ill. *          
1950: 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61  be freed immedia
1960: 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74  tely and any att
1970: 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61  empt to access a
1980: 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65 64  ny of that freed
1990: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  . *          dat
19a0: 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65  a will almost ce
19b0: 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69  rtainly result i
19c0: 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61  n an immediate a
19d0: 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e  ccess violation.
19e0: 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . **************
19f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a30: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
1a40: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
1a50: 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20  REATE.#  define 
1a60: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
1a70: 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52 55  P_CREATE    (TRU
1a80: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
1a90: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   The initial siz
1aa0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1ab0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1ac0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1ad0: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1ae0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1af0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  HEAP_INIT_SIZE.#
1b00: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
1b10: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
1b20: 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45  SIZE ((SQLITE_DE
1b30: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
1b40: 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ) * \.          
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
1b70: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1b80: 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30  E_SIZE) + 419430
1b90: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  4).#endif../*. *
1ba0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
1bb0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1bc0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1bd0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1be0: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1bf0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1c00: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20  HEAP_MAX_SIZE.# 
1c10: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1c20: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
1c30: 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a  ZE  (0).#endif..
1c40: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
1c50: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
1c60: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
1c70: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
1c80: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1c90: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
1ca0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
1cb0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
1cc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1cd0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
1ce0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1cf0: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29  AP_FLAGS     (0)
1d00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d10: 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74  he winMemData st
1d20: 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69  ructure stores i
1d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
1d40: 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32  red by the Win32
1d50: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c  -specific.** sql
1d60: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
1d70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1d80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1d90: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1da0: 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74  nMemData;.struct
1db0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69   winMemData {.#i
1dc0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75  fndef NDEBUG.  u
1dd0: 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20  32 magic;    /* 
1de0: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20  Magic number to 
1df0: 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65  detect structure
1e00: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a   corruption. */.
1e10: 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20  #endif.  HANDLE 
1e20: 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61  hHeap; /* The ha
1e30: 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70  ndle to our heap
1e40: 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e  . */.  BOOL bOwn
1e50: 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77  ed;  /* Do we ow
1e60: 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e  n the heap (i.e.
1e70: 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73   destroy it on s
1e80: 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a  hutdown)? */.};.
1e90: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ea0: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
1eb0: 41 47 49 43 20 20 20 20 20 30 78 34 32 62 32 38  AGIC     0x42b28
1ec0: 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  30b.#endif..stat
1ed0: 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ic struct winMem
1ee0: 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  Data win_mem_dat
1ef0: 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  a = {.#ifndef ND
1f00: 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41  EBUG.  WINMEM_MA
1f10: 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55  GIC,.#endif.  NU
1f20: 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69  LL, FALSE.};..#i
1f30: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
1f40: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
1f50: 74 4d 61 67 69 63 28 29 20 61 73 73 65 72 74 28  tMagic() assert(
1f60: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61   win_mem_data.ma
1f70: 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  gic==WINMEM_MAGI
1f80: 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  C ).#else.#defin
1f90: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
1fa0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
1fb0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48  efine winMemGetH
1fc0: 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61  eap() win_mem_da
1fd0: 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63  ta.hHeap..static
1fe0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
1ff0: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
2000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2010: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
2020: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
2030: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
2040: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
2050: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
2060: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
2070: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
2080: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
2090: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
20a0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
20b0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
20c0: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
20d0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
20e0: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
20f0: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
2100: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
2110: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
2120: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
2130: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2140: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
2150: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2160: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
2170: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
2180: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
2190: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
21a0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
21b0: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
21c0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
21d0: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
21e0: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
21f0: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
2200: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
2210: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
2220: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
2230: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2240: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
2250: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
2260: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
2270: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
2280: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
2290: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
22a0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
22b0: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
22c0: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
22d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22e0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
22f0: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
2300: 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20  else.static int 
2310: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
2320: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 0;.#endif..#if
2330: 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20  ndef SYSCALL.#  
2340: 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73  define SYSCALL s
2350: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2360: 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  tr.#endif../*.**
2370: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2380: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
2390: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72  on Windows CE or
23a0: 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66   WinRT.. */..#if
23b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
23c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
23d0: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  NRT.#  define os
23e0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
23f0: 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66  )       1.#endif
2400: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2410: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2420: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2430: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2440: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2450: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2460: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2470: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2480: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2490: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
24a0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
24b0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
24c0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
24d0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
24e0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
24f0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2500: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2510: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
2520: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
2530: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
2540: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2550: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
2560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2570: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
2580: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
2590: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
25a0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
25b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
25c0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
25d0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
25e0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
25f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2600: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
2610: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72  OS_WINRT.  { "Ar
2620: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
2630: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2640: 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  )AreFileApisANSI
2650: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
2660: 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c  else.  { "AreFil
2670: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
2680: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
26b0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65  f..#ifndef osAre
26c0: 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65  FileApisANSI.#de
26d0: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
26e0: 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49  isANSI ((BOOL(WI
26f0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
2700: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
2710: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
2720: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
2730: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2740: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2750: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
2760: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2770: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
2780: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
2790: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
27a0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
27c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
27e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
27f0: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
2800: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
2810: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
2820: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
2830: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2840: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2850: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2860: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
2870: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
2880: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2890: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
28a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
28b0: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
28c0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
28d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2900: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
2910: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
2920: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
2930: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
2940: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
2950: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
2960: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2970: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
2980: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2990: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
29a0: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
29b0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
29c0: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
29d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
29e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
29f0: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
2a00: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
2a10: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2a20: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
2a30: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2a40: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2a50: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
2a60: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2a90: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2aa0: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
2ab0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
2ac0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
2ad0: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
2ae0: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
2af0: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
2b00: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
2b10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
2b20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
2b30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2b40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2b50: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2b70: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2b80: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
2b90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2ba0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
2bb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2bc0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2bd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2be0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2bf0: 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28  osCreateFileW ((
2c00: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2c10: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
2c20: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
2c30: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
2c40: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
2c50: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
2c60: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[5].pCurrent)..
2c70: 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f  #if (!SQLITE_OS_
2c80: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
2c90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2ca0: 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20  S_ANSI) && \.   
2cb0: 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51       !defined(SQ
2cc0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
2cd0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
2ce0: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
2cf0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2d00: 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20  leMappingA,     
2d10: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2d20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
2d30: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
2d40: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2d60: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2d70: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2d80: 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28  ppingA ((HANDLE(
2d90: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
2da0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
2db0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
2dc0: 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f   DWORD,DWORD,DWO
2dd0: 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63  RD,LPCSTR))aSysc
2de0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
2df0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2e00: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
2e10: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2e20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2e30: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
2e40: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
2e50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
2e60: 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  AL)).  { "Create
2e70: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2e80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2e90: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
2ea0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2eb0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2ec0: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
2ed0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2f00: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2f10: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
2f20: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
2f30: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
2f40: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
2f50: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
2f60: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
2f70: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
2f80: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
2f90: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2fa0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2fb0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2fc0: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
2fd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
2fe0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
2ff0: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
3000: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3010: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3020: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3030: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3040: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3050: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3060: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
3070: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3080: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
3090: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
30a0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
30b0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
30c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
30d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
30e0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
30f0: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
3100: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3110: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
3120: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3130: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
3140: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
3150: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3170: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3180: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
3190: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
31a0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
31b0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
31c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
31d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
31e0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
31f0: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3210: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
3220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3230: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3240: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
3250: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3260: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3270: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3280: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3290: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
32a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
32b0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
32c0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
32d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
32e0: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
32f0: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
3300: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
3310: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
3320: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
3330: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
3340: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
3350: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3370: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3380: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
3390: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
33a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
33b0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
33c0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
33d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
33e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
33f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3400: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
3410: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
3420: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
3430: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
3440: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3450: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
3460: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
3470: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3490: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
34a0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
34b0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
34c0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
34d0: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
34e0: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
34f0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
3500: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3510: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
3520: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3530: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
3540: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
3550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
3560: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
3570: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3580: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
3590: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
35a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
35b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
35c0: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
35d0: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
35e0: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
35f0: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
3600: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3610: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
3620: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3630: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3650: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3660: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
3670: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
3680: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
3690: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
36a0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
36b0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
36c0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
36d0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36e0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
36f0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
3700: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
3710: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3720: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
3730: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
3740: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
3750: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
3760: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3790: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
37a0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
37b0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
37c0: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
37d0: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
37e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
37f0: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
3800: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
3810: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
3820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
3830: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
3840: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
3850: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3860: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
3870: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3880: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
3890: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
38a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
38d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
38e0: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
38f0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
3900: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
3910: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3920: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
3930: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
3940: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
3950: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
3960: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
3970: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
3980: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3990: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
39a0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
39b0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
39c0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
39d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
39e0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
39f0: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
3a00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3a10: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
3a20: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
3a30: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
3a40: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
3a50: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3a80: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
3a90: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
3aa0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3ab0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
3ac0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
3ad0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
3ae0: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3af0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3b00: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3b10: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3b20: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3b30: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3b40: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
3b50: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
3b60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
3b70: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
3b80: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3b90: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3ba0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
3bb0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3be0: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
3bf0: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
3c00: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
3c10: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3c20: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
3c30: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
3c40: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3c50: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3c60: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3c70: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3c80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
3c90: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3ca0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3cb0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
3cc0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
3cd0: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
3ce0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3d10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3d20: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
3d30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3d40: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
3d50: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3d60: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3d70: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3d80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3d90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
3da0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3dc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3dd0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
3de0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3df0: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
3e00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3e30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
3e40: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
3e50: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
3e60: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3e70: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
3e80: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3e90: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3ea0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
3eb0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3ec0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
3ed0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
3ee0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3ef0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3f00: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
3f10: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3f40: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
3f50: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
3f60: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
3f70: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
3f80: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
3f90: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
3fa0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
3fb0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3fc0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
3fd0: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
3fe0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3ff0: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
4000: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4010: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4020: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4030: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4050: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4060: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4070: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
4080: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
4090: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
40a0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
40b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
40c0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
40d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
40e0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
40f0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
4100: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4110: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
4120: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
4130: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4140: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
4150: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4170: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4180: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4190: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
41a0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
41b0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
41c0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
41d0: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
41e0: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
41f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4200: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4210: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4230: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4240: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
4250: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
4260: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
4270: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
4280: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
4290: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
42a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
42d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
42e0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
42f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4300: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
4310: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4320: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
4330: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
4340: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
4350: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
4360: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
4370: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
4380: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4390: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
43a0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
43b0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
43c0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
43d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
43e0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
43f0: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
4400: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
4410: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
4420: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
4430: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
4440: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
4450: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
4460: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
4470: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
4480: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
4490: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
44a0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
44b0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
44c0: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
44d0: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
44e0: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
44f0: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
4500: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
4510: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
4520: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
4530: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4540: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
4550: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4560: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
4570: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
4580: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
4590: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
45b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
45c0: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
45d0: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
45e0: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
45f0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
4600: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
4610: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4620: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4630: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
4640: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
4650: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
4660: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
4670: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4680: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
4690: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
46a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
46c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
46d0: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
46e0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
46f0: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
4700: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
4710: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
4720: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4730: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4740: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
4750: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4760: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
4770: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
4780: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
4790: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
47a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
47b0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
47c0: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
47d0: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
47e0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
47f0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4800: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4810: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
4820: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
4830: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4850: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4860: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
4870: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
4880: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
4890: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
48a0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
48b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
48c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
48d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
48e0: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
48f0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
4900: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4910: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
4920: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4930: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
4940: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4950: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4970: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4980: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
4990: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
49a0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
49b0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
49c0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
49d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
49e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
49f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4a00: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
4a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4a20: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
4a30: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
4a40: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4a50: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
4a60: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4a70: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4a80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4a90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4aa0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
4ab0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4ac0: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
4ad0: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
4ae0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4af0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4b00: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
4b10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4b20: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
4b50: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
4b60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4ba0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
4bb0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
4bc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
4bd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4be0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4bf0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4c00: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
4c10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4c20: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
4c30: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
4c40: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4c50: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
4c60: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c70: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4ca0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
4cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4cc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
4cd0: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
4ce0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
4cf0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
4d00: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
4d10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4d20: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
4d30: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4d40: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
4d50: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
4d60: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
4d70: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4d80: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
4d90: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4da0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4db0: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4dd0: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
4de0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4df0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4e00: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
4e10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4e20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4e40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4e50: 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28   osHeapCreate ((
4e60: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
4e70: 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a  DWORD,SIZE_T, \.
4e80: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
4e90: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
4ea0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4eb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4ec0: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ee0: 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79  CALL)HeapDestroy
4ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4f00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
4f10: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
4f20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4f30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4f40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4f50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4f60: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
4f70: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4f80: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  DLE))aSyscall[37
4f90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4fa0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4fc0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fe0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
4ff0: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
5000: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5010: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
5020: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
5030: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
5040: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
5050: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5060: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
5070: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5080: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
5090: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
50a0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
50b0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
50c0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
50d0: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
50e0: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
50f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5100: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
5110: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5120: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5130: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
5140: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
5150: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
5160: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
5170: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
5180: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5190: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
51a0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
51b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
51c0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
51d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
51e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
51f0: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
5200: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5210: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5220: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5230: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5240: 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42  HeapValidate ((B
5250: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
5260: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5270: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
5280: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
5290: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
52a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
52b0: 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66  AS_ANSI) && !def
52c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
52d0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
52e0: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
52f0: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
5300: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
5310: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
5320: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5330: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
5340: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5350: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5370: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5380: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
5390: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
53a0: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
53b0: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
53c0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
53d0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
53e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
53f0: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5400: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
5410: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
5420: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
5430: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
5440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5450: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
5460: 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yW,            0
5470: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
5480: 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20  oadLibraryW",   
5490: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
54a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
54b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
54c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
54d0: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28  osLoadLibraryW (
54e0: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
54f0: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
5500: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
5510: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5520: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
5530: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
5540: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5550: 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20  LocalFree,      
5560: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5570: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72  lse.  { "LocalFr
5580: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
5590: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
55c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61  ..#define osLoca
55d0: 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57  lFree ((HLOCAL(W
55e0: 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29  INAPI*)(HLOCAL))
55f0: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75  aSyscall[44].pCu
5600: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5610: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
5620: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5630: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
5660: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5670: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5680: 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20   "LockFile",    
5690: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
56a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
56c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
56d0: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64  ef osLockFile.#d
56e0: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
56f0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5700: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
5710: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
5720: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
5730: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e  call[45].pCurren
5740: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  t).#endif..#if !
5750: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
5760: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
5770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
5780: 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65  SYSCALL)LockFile
5790: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ex,             
57a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
57b0: 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  "LockFileEx",   
57c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
57d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
57f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
5800: 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23  f osLockFileEx.#
5810: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
5820: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
5830: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5840: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5850: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5860: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
5870: 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e  call[46].pCurren
5880: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
5890: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
58a0: 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  | (!SQLITE_OS_WI
58b0: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
58c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
58d0: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
58e0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
58f0: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
5900: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
5910: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5920: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
5930: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5940: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5960: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5970: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
5980: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
5990: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
59a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
59b0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
59c0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70  ))aSyscall[47].p
59d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
59e0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
59f0: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
5a00: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
5a10: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
5a20: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
5a30: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
5a40: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
5a50: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
5a60: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
5a70: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
5a80: 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74  all[48].pCurrent
5a90: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
5aa0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
5ab0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
5ac0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5ad0: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
5ae0: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
5af0: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
5b00: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5b10: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
5b20: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
5b30: 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  49].pCurrent).. 
5b40: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5b60: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5b90: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
5ba0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5bb0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
5bc0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5bd0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5be0: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
5bf0: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
5c00: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
5c10: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
5c20: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
5c30: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5c40: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
5c50: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5c60: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
5c70: 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e  call[51].pCurren
5c80: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5c90: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
5ca0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
5cb0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5cc0: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
5cd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5ce0: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
5cf0: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
5d00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5d30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
5d40: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
5d50: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5d60: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
5d70: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
5d80: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
5d90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5da0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5db0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5dd0: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5df0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
5e00: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
5e10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5e20: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5e40: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5e50: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
5e60: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
5e70: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
5e80: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
5e90: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
5ea0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
5eb0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
5ec0: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
5ed0: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
5ee0: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
5ef0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
5f00: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
5f10: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
5f20: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
5f30: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5f40: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5f50: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
5f60: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
5f70: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
5f80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
5f90: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
5fa0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5fb0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
5fc0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
5fd0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6000: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
6010: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
6020: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
6030: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6040: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6050: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6060: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
6070: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
6080: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6090: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
60a0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
60b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
60c0: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
60d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
60e0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
60f0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
6100: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6130: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
6140: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
6150: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6160: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6170: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
6180: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
6190: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
61a0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
61b0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
61c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
61d0: 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70  _WAL).  { "Unmap
61e0: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
61f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
6200: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  mapViewOfFile,  
6210: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6220: 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77  e.  { "UnmapView
6230: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
6240: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6270: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56  #define osUnmapV
6280: 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c  iewOfFile ((BOOL
6290: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49  (WINAPI*)(LPCVOI
62a0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
62b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
62c0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
62d0: 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41  yte",     (SYSCA
62e0: 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  LL)WideCharToMul
62f0: 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c  tiByte,     0 },
6300: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65  ..#define osWide
6310: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20  CharToMultiByte 
6320: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
6330: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  INT,DWORD,LPCWST
6340: 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c  R,int,LPSTR,int,
6350: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
6360: 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61  R,LPBOOL))aSysca
6370: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
6380: 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65  ..  { "WriteFile
6390: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
63a0: 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46   (SYSCALL)WriteF
63b0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
63c0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
63d0: 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42   osWriteFile ((B
63e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
63f0: 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  DLE,LPCVOID,DWOR
6400: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
6410: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
6420: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e  D))aSyscall[59].
6430: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6440: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6450: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
6460: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  xW",          (S
6470: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65  YSCALL)CreateEve
6480: 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20 20  ntExW,          
6490: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
64a0: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c  CreateEventExW",
64b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
64c0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
64e0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
64f0: 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78   osCreateEventEx
6500: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
6510: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
6520: 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54  TTRIBUTES,LPCWST
6530: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
6540: 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  RD,DWORD))aSysca
6550: 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[60].pCurrent)
6560: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6570: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
6580: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22  ForSingleObject"
6590: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57  ,     (SYSCALL)W
65a0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
65b0: 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ct,     0 },.#el
65c0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
65d0: 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20  ingleObject",   
65e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6610: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6620: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28  orSingleObject (
6630: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6640: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
6650: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6660: 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[61].pCurrent).
6670: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6680: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
6690: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22  rSingleObjectEx"
66a0: 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69  ,   (SYSCALL)Wai
66b0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
66c0: 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  Ex,   0 },.#else
66d0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
66e0: 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20  gleObjectEx",   
66f0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6720: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
6730: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28  SingleObjectEx (
6740: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6750: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6760: 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53          BOOL))aS
6770: 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72  yscall[62].pCurr
6780: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
6790: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
67a0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22  etFilePointerEx"
67b0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
67c0: 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  L)SetFilePointer
67d0: 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  Ex,        0 },.
67e0: 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69  #else.  { "SetFi
67f0: 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20  lePointerEx",   
6800: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6830: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  if..#define osSe
6840: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28  tFilePointerEx (
6850: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6860: 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45  ANDLE,LARGE_INTE
6870: 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50  GER, \.        P
6880: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57  LARGE_INTEGER,DW
6890: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33  ORD))aSyscall[63
68a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
68b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
68c0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
68d0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
68e0: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  Ex", (SYSCALL)Ge
68f0: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6900: 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c  ByHandleEx, 0 },
6910: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
6920: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
6930: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
6940: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6950: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6960: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
6970: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
6980: 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f  nByHandleEx ((BO
6990: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
69a0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49  LE, \.        FI
69b0: 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c  LE_INFO_BY_HANDL
69c0: 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44  E_CLASS,LPVOID,D
69d0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
69e0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
69f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
6a00: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
6a10: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
6a20: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6a30: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
6a40: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
6a50: 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20  FileFromApp,    
6a60: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a70: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
6a80: 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41  mApp",    (SYSCA
6a90: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6ab0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6ac0: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6ad0: 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44  FromApp ((LPVOID
6ae0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6af0: 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20  ,ULONG,ULONG64, 
6b00: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6b10: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
6b20: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6b30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6b40: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b60: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
6b70: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  2,             0
6b80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
6b90: 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20  reateFile2",    
6ba0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6bb0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6bc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6bd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6be0: 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28  osCreateFile2 ((
6bf0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
6c00: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
6c10: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6c20: 20 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c       LPCREATEFIL
6c30: 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
6c40: 4d 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c  METERS))aSyscall
6c50: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
6c60: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6c70: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6c80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
6c90: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
6ca0: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
6cb0: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
6cc0: 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64  ALL)LoadPackaged
6cd0: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d  Library,     0 }
6ce0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6cf0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
6d00: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6d10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6d20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6d30: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6d40: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
6d50: 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ary ((HMODULE(WI
6d60: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20  NAPI*)(LPCWSTR, 
6d70: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6d80: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
6d90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
6da0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6db0: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
6dc0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6dd0: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
6de0: 74 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20  t64,          0 
6df0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6e00: 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20  tTickCount64",  
6e10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6e20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6e30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6e40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6e50: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20  sGetTickCount64 
6e60: 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41  ((ULONGLONG(WINA
6e70: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
6e80: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
6e90: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6ea0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e  _WINRT.  { "GetN
6eb0: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
6ec0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ,     (SYSCALL)G
6ed0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
6ee0: 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  fo,     0 },.#el
6ef0: 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76  se.  { "GetNativ
6f00: 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  eSystemInfo",   
6f10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6f40: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61  .#define osGetNa
6f50: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28  tiveSystemInfo (
6f60: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
6f70: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
6f80: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
6f90: 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[69].pCurrent).
6fa0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6fb0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6fc0: 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  SI).  { "OutputD
6fd0: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
6fe0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
6ff0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20  utDebugStringA, 
7000: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7010: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7020: 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28  StringA",      (
7030: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7060: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
7070: 62 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49  bugStringA ((VOI
7080: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
7090: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e  R))aSyscall[70].
70a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
70b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
70c0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
70d0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
70e0: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
70f0: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
7100: 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30  gStringW,      0
7110: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
7120: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7130: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
7140: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7150: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7160: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7170: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
7180: 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41  ingW ((VOID(WINA
7190: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
71a0: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
71b0: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72  ent)..  { "GetPr
71c0: 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20  ocessHeap",     
71d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
71e0: 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20  tProcessHeap,   
71f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7200: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73  fine osGetProces
7210: 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57  sHeap ((HANDLE(W
7220: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
7230: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
7240: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7250: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
7260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7270: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61  T_WAL).  { "Crea
7280: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
7290: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
72a0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
72b0: 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23  gFromApp, 0 },.#
72c0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
72d0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
72e0: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  pp", (SYSCALL)0,
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7310: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7320: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
7330: 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57  omApp ((HANDLE(W
7340: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
7350: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
7360: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
7370: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50  ULONG,ULONG64,LP
7380: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
7390: 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  73].pCurrent)..}
73a0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
73b0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
73c0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
73d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
73e0: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
73f0: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
7400: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
7410: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
7420: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
7430: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
7440: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
7450: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
7460: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
7470: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
7480: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
7490: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
74a0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
74b0: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
74c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
74d0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
74e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
74f0: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
7500: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
7510: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
7520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7540: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
7550: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
7560: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
7570: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
7580: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
7590: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
75a0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
75b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
75c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
75d0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
75e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
75f0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
7600: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
7610: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
7620: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
7630: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
7640: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
7650: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
7660: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
7670: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
7680: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7690: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
76a0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
76b0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
76c0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
76d0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
76e0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
76f0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7700: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
7710: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
7720: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7730: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
7740: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
7750: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
7760: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
7770: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
7780: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
7790: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
77a0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
77b0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
77c0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
77d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
77e0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
77f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
7800: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
7810: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
7820: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
7830: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
7840: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
7850: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
7860: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
7870: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7880: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
7890: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
78a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
78b0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
78c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
78d0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
78e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
78f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7920: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
7930: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
7940: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
7950: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
7960: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
7970: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
7980: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
7990: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
79a0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
79b0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
79c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
79d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
79e0: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
79f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
7a00: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
7a10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
7a20: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
7a30: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
7a40: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
7a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
7a60: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
7a70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
7a80: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
7a90: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
7aa0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7ab0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
7ac0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
7ad0: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
7ae0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
7af0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7b00: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7b10: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
7b20: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
7b30: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
7b40: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
7b50: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
7b60: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
7b70: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
7b80: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
7b90: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
7ba0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
7bb0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
7bc0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
7bd0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7be0: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
7bf0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
7c00: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
7c10: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
7c20: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
7c30: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
7c40: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
7c50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
7c60: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
7c70: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
7c80: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7c90: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7ca0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
7cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
7cc0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
7cd0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
7ce0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
7cf0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7d00: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
7d10: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
7d20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7d40: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
7d50: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
7d60: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
7d70: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
7d80: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
7d90: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
7da0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
7db0: 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a 42 75  _debug(char *zBu
7dc0: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
7dd0: 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c  char zDbgBuf[SQL
7de0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
7df0: 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e  F_SIZE];.  int n
7e00: 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20  Min = MIN(nBuf, 
7e10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  (SQLITE_WIN32_DB
7e20: 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29  G_BUF_SIZE - 1))
7e30: 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61  ; /* may be nega
7e40: 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  tive. */.  if( n
7e50: 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20  Min<-1 ) nMin = 
7e60: 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74  -1; /* all negat
7e70: 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d  ive values becom
7e80: 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72  e -1. */.  asser
7e90: 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e  t( nMin==-1 || n
7ea0: 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53  Min==0 || nMin<S
7eb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7ec0: 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20  BUF_SIZE );.#if 
7ed0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
7ee0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
7ef0: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
7f00: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
7f10: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
7f20: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
7f30: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
7f40: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
7f50: 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  );.    osOutputD
7f60: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67  ebugStringA(zDbg
7f70: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
7f80: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
7f90: 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20  StringA(zBuf);. 
7fa0: 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64   }.#elif defined
7fb0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
7fc0: 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74  S_WIDE).  memset
7fd0: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
7fe0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
7ff0: 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20  F_SIZE);.  if ( 
8000: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
8010: 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20  eChar(.         
8020: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
8030: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
8040: 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75  CP_OEMCP, 0, zBu
8050: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69  f,.          nMi
8060: 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42  n, (LPWSTR)zDbgB
8070: 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  uf, SQLITE_WIN32
8080: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69  _DBG_BUF_SIZE/si
8090: 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20  zeof(WCHAR))<=0 
80a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
80b0: 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62   }.  osOutputDeb
80c0: 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53  ugStringW((LPCWS
80d0: 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c  TR)zDbgBuf);.#el
80e0: 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  se.  if( nMin>0 
80f0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
8100: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
8110: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
8120: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
8130: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
8140: 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e  nMin);.    fprin
8150: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c  tf(stderr, "%s",
8160: 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c   zDbgBuf);.  }el
8170: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
8180: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42  stderr, "%s", zB
8190: 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  uf);.  }.#endif.
81a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
81b0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  lowing routine s
81c0: 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72  uspends the curr
81d0: 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61  ent thread for a
81e0: 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69  t least ms.** mi
81f0: 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69  lliseconds.  Thi
8200: 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
8210: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65  to the Win32 Sle
8220: 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  ep() interface..
8230: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
8240: 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41  _WINRT.static HA
8250: 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20  NDLE sleepObj = 
8260: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f  NULL;.#endif..vo
8270: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
8280: 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c  _sleep(DWORD mil
8290: 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  liseconds){.#if 
82a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
82b0: 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d    if ( sleepObj=
82c0: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65  =NULL ){.    sle
82d0: 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65  epObj = osCreate
82e0: 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e  EventExW(NULL, N
82f0: 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e  ULL, CREATE_EVEN
8300: 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a  T_MANUAL_RESET,.
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20  SYNCHRONIZE);.  
8340: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65  }.  assert( slee
8350: 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  pObj!=NULL );.  
8360: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
8370: 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a  bjectEx(sleepObj
8380: 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  , milliseconds, 
8390: 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20  FALSE);.#else.  
83a0: 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63  osSleep(millisec
83b0: 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  onds);.#endif.}.
83c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
83d0: 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
83e0: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
83f0: 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e  under WinNT, Win
8400: 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72  2K, WinXP,.** or
8410: 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20   WinCE.  Return 
8420: 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72  false (zero) for
8430: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f   Win95, Win98, o
8440: 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48  r WinME..**.** H
8450: 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65  ere is an intere
8460: 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f  sting observatio
8470: 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  n:  Win95, Win98
8480: 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b  , and WinME lack
8490: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
84a0: 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77  Ex() API.  But w
84b0: 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74  e can still stat
84c0: 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69  ically link agai
84d0: 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20  nst that.** API 
84e0: 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f  as long as we do
84f0: 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e  n't call it when
8500: 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39   running Win95/9
8510: 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f  8/ME.  A call to
8520: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
8530: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
8540: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73  rmine if the hos
8550: 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45  t is Win95/98/ME
8560: 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f   or.** WinNT/2K/
8570: 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69  XP so that we wi
8580: 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  ll know whether 
8590: 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61  or not we can sa
85a0: 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65  fely call.** the
85b0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
85c0: 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  I..*/.#if SQLITE
85d0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
85e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64  ITE_OS_WINRT.# d
85f0: 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31  efine isNT()  (1
8600: 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  ).#elif !defined
8610: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
8620: 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65  S_WIDE).# define
8630: 20 69 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c   isNT()  (0).#el
8640: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  se.  static int 
8650: 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20  isNT(void){.    
8660: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  if( sqlite3_os_t
8670: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
8680: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
8690: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66  Info;.      sInf
86a0: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
86b0: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
86c0: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47  Info);.      osG
86d0: 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49  etVersionExA(&sI
86e0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
86f0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49  te3_os_type = sI
8700: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
8710: 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57  ==VER_PLATFORM_W
8720: 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b  IN32_NT ? 2 : 1;
8730: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
8740: 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  n sqlite3_os_typ
8750: 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  e==2;.  }.#endif
8760: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8770: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
8780: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
8790: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
87a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
87b0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
87c0: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
87d0: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
87e0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
87f0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
8800: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
8810: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
8820: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8830: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
8840: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8850: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
8860: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
8870: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8880: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
8890: 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  E).  assert ( os
88a0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
88b0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
88c0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
88d0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  L) );.#endif.  a
88e0: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
88f0: 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70   );.  p = osHeap
8900: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
8910: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8920: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
8930: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20  ytes);.  if( !p 
8940: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
8950: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
8960: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
8970: 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28  Alloc %u bytes (
8980: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
89a0: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
89b0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
89c0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
89d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
89e0: 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   Free memory..*/
89f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
8a00: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
8a10: 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20  rior){.  HANDLE 
8a20: 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  hHeap;..  winMem
8a30: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
8a40: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
8a50: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
8a60: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
8a70: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8a80: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
8a90: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
8aa0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8ab0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8ac0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
8ad0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20  IDATE).  assert 
8ae0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
8af0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
8b00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
8b10: 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64   pPrior) );.#end
8b20: 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  if.  if( !pPrior
8b30: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61   ) return; /* Pa
8b40: 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65  ssing NULL to He
8b50: 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69  apFree is undefi
8b60: 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f  ned. */.  if( !o
8b70: 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c  sHeapFree(hHeap,
8b80: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
8b90: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
8ba0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8bb0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
8bc0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
8bd0: 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20  apFree block %p 
8be0: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73  pPrior, osGetLas
8c10: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
8c20: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  )hHeap);.  }.}..
8c30: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
8c40: 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73   size of an exis
8c50: 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ting memory allo
8c60: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
8c70: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
8c80: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
8c90: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  r, int nBytes){.
8ca0: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
8cb0: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
8cc0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
8cd0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
8ce0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
8cf0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
8d00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
8d10: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
8d20: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
8d30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
8d40: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
8d50: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
8d60: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
8d70: 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69  ert ( osHeapVali
8d80: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
8d90: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8da0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
8db0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
8dc0: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
8dd0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20  if( !pPrior ){. 
8de0: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c     p = osHeapAll
8df0: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
8e00: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8e10: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
8e20: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
8e30: 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c   p = osHeapReAll
8e40: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
8e50: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8e60: 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45  S, pPrior, (SIZE
8e70: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a  _T)nBytes);.  }.
8e80: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
8e90: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
8ea0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
8eb0: 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73  d to %s %u bytes
8ec0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
8ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ee0: 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52   pPrior ? "HeapR
8ef0: 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41  eAlloc" : "HeapA
8f00: 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f  lloc", nBytes, o
8f10: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
8f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f30: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
8f40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
8f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8f60: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f  the size of an o
8f70: 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63  utstanding alloc
8f80: 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e  ation, in bytes.
8f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
8fa0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
8fb0: 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  p){.  HANDLE hHe
8fc0: 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a  ap;.  SIZE_T n;.
8fd0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
8fe0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
8ff0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
9000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
9010: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
9020: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9030: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9040: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9050: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9060: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9070: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9080: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
9090: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
90a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
90b0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
90c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
90d0: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
90e0: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
90f0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9100: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
9110: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
9120: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
9130: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9140: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
9150: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
9160: 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70  ck %p (%d), heap
9170: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
9180: 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61        p, osGetLa
9190: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
91a0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65  *)hHeap);.    re
91b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
91c0: 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a  turn (int)n;.}..
91d0: 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61  /*.** Round up a
91e0: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f   request size to
91f0: 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20   the next valid 
9200: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e  allocation size.
9210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9220: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
9230: 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b   n){.  return n;
9240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
9250: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
9260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9270: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
9280: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
9290: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
92a0: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
92b0: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
92c0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
92d0: 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ata ) return SQL
92e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73  ITE_ERROR;.  ass
92f0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
9300: 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f  ->magic==WINMEM_
9310: 4d 41 47 49 43 20 29 3b 0a 0a 23 69 66 20 21 53  MAGIC );..#if !S
9320: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
9330: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  & SQLITE_WIN32_H
9340: 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28  EAP_CREATE.  if(
9350: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
9360: 48 65 61 70 20 29 7b 0a 20 20 20 20 70 57 69 6e  Heap ){.    pWin
9370: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
9380: 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51   osHeapCreate(SQ
9390: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
93a0: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
93d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
93e0: 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  NIT_SIZE,.      
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9420: 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20  P_MAX_SIZE);.   
9430: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
9440: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
9450: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
9460: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20  LITE_NOMEM,.    
9470: 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f        "failed to
9480: 20 48 65 61 70 43 72 65 61 74 65 20 28 25 64 29   HeapCreate (%d)
9490: 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74  , flags=%u, init
94a0: 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65  Size=%u, maxSize
94b0: 3d 25 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%u",.          
94c0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
94d0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
94e0: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
94f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
9500: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
9510: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9520: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20  EAP_MAX_SIZE);. 
9530: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9540: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
9550: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
9560: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
9570: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
9580: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
9590: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70  );.  }.#else.  p
95a0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
95b0: 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73  p = osGetProcess
95c0: 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70  Heap();.  if( !p
95d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
95e0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
95f0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
9600: 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c  M,.        "fail
9610: 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73  ed to GetProcess
9620: 48 65 61 70 20 28 25 64 29 22 2c 20 6f 73 47 65  Heap (%d)", osGe
9630: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
9640: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9650: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57  _NOMEM;.  }.  pW
9660: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
9670: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73  d = FALSE;.  ass
9680: 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74  ert( !pWinMemDat
9690: 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e  a->bOwned );.#en
96a0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57  dif.  assert( pW
96b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
96c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
96d0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
96e0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
96f0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
9700: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
9710: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
9720: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
9730: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
9740: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
9750: 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  ate(pWinMemData-
9760: 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  >hHeap, SQLITE_W
9770: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9780: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
9790: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
97a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
97b0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  initialize this 
97c0: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
97d0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75  c void winMemShu
97e0: 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70  tdown(void *pApp
97f0: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
9800: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
9810: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
9820: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
9830: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
9840: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
9850: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9860: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
9870: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
9880: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
9890: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
98a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
98b0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
98c0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
98d0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61  _VALIDATE).    a
98e0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
98f0: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
9900: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
9910: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9920: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
9930: 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d  if.    if( pWinM
9940: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
9950: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48  {.      if( !osH
9960: 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d  eapDestroy(pWinM
9970: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29  emData->hHeap) )
9980: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9990: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
99a0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
99b0: 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29 2c  eapDestroy (%d),
99c0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
99e0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
99f0: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
9a00: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
9a10: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
9a20: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
9a30: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
9a40: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
9a50: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
9a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
9a70: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
9a80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
9a90: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
9aa0: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
9ab0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
9ac0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
9ad0: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
9ae0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
9af0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
9b00: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
9b10: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
9b20: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
9b30: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
9b40: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
9b50: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
9b60: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
9b70: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
9b80: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
9b90: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
9ba0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
9bb0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
9bc0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
9bd0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
9be0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
9bf0: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
9c00: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
9c10: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
9c20: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
9c30: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
9c40: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
9c50: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
9c60: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
9c70: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
9c80: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
9c90: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
9ca0: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
9cb0: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
9cc0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
9cd0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
9ce0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
9cf0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
9d00: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
9d10: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
9d20: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
9d30: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
9d40: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
9d50: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
9d60: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
9d70: 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70  -16?). .**.** Sp
9d80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
9d90: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
9da0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
9db0: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
9dc0: 69 63 20 4c 50 57 53 54 52 20 75 74 66 38 54 6f  ic LPWSTR utf8To
9dd0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
9de0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
9df0: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
9e00: 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
9e10: 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
9e20: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
9e30: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
9e40: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
9e50: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28   NULL, 0);.  if(
9e60: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
9e70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9e80: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
9e90: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
9ea0: 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  ro( nChar*sizeof
9eb0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
9ec0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
9ed0: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
9ee0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9ef0: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
9f00: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
9f10: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
9f20: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
9f30: 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
9f60: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
9f70: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9f80: 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
9f90: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
9fa0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
9fb0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
9fc0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
9fd0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
9fe0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
9ff0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
a000: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
a010: 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ed string is.** 
a020: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
a030: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
a040: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a050: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50  unicodeToUtf8(LP
a060: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
a070: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
a080: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
a090: 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  name;..  nByte =
a0a0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
a0b0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
a0c0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
a0d0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
a0e0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
a0f0: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
a100: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
a110: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
a120: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
a130: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
a140: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
a150: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
a160: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
a170: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
a180: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
a190: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
a1a0: 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ame, nByte,.    
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
a1d0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
a1e0: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
a1f0: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
a200: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
a210: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a220: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
a230: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
a240: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74  an ANSI string t
a250: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
a260: 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ode, based on th
a270: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64  e.** current cod
a280: 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66  epage settings f
a290: 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a  or file apis..**
a2a0: 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f   .** Space to ho
a2b0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
a2c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
a2d0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a2e0: 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  e3_malloc..*/.st
a2f0: 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63 73  atic LPWSTR mbcs
a300: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
a310: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
a320: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
a330: 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c   LPWSTR zMbcsFil
a340: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64  ename;.  int cod
a350: 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c  epage = osAreFil
a360: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
a370: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
a380: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  ..  nByte = osMu
a390: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
a3a0: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
a3b0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
a3c0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43      0)*sizeof(WC
a3f0: 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  HAR);.  if( nByt
a400: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
a410: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63  rn 0;.  }.  zMbc
a420: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  sFilename = sqli
a430: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
a440: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63  Byte*sizeof(zMbc
a450: 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  sFilename[0]) );
a460: 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65  .  if( zMbcsFile
a470: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
a480: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
a490: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
a4a0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
a4b0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
a4c0: 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69  ame, -1, zMbcsFi
a4d0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a          nByte);.
a500: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
a510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a520: 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  ee(zMbcsFilename
a530: 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65  );.    zMbcsFile
a540: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
a550: 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65  return zMbcsFile
a560: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
a570: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
a580: 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74   Unicode to mult
a590: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
a5a0: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
a5b0: 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20  n the.** user's 
a5c0: 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a  ANSI codepage..*
a5d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
a5e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
a5f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
a600: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
a610: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
a620: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
a630: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
a640: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
a650: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
a660: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
a670: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
a680: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
a690: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
a6a0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
a6b0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
a6c0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
a6d0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
a6e0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
a6f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
a700: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
a710: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a720: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
a730: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
a740: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
a750: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
a760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a770: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
a780: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
a790: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
a7a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
a7b0: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  1, zFilename,.  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
a7e0: 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  yte, 0, 0);.  if
a7f0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
a800: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a810: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
a820: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
a830: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
a840: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a850: 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79   Convert multiby
a860: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
a870: 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ing to UTF-8.  S
a880: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
a890: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
a8a0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
a8b0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
a8c0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
a8d0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
a8e0: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
a8f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
a900: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
a910: 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53  nameUtf8;.  LPWS
a920: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
a930: 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54  zTmpWide = mbcsT
a940: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
a950: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
a960: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
a970: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
a980: 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e  ilenameUtf8 = un
a990: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
a9a0: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
a9b0: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
a9c0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
a9d0: 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameUtf8;.}../*.*
a9e0: 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20  * Convert UTF-8 
a9f0: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
aa00: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20  racter string.  
aa10: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
aa20: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  e .** returned s
aa30: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
aa40: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
aa50: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
aa60: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
aa70: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e  utf8_to_mbcs(con
aa80: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
aa90: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
aaa0: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50  lenameMbcs;.  LP
aab0: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
aac0: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66    zTmpWide = utf
aad0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
aae0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
aaf0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
ab00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ab10: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20  zFilenameMbcs = 
ab20: 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  unicodeToMbcs(zT
ab30: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
ab40: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
ab50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
ab60: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a  enameMbcs;.}../*
ab70: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ab80: 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20  n sets the data 
ab90: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65  directory or the
aba0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
abb0: 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  tory based on.**
abc0: 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72   the provided ar
abd0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79  guments.  The ty
abe0: 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  pe argument must
abf0: 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74   be 1 in order t
ac00: 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o set the.** dat
ac10: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32  a directory or 2
ac20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74   in order to set
ac30: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
ac40: 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a  irectory.  The z
ac50: 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  Value.** argumen
ac60: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
ac70: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
ac80: 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75  o use.  The retu
ac90: 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  rn value will be
aca0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
acb0: 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
acc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
acd0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
ace0: 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57  DWORD type, LPCW
acf0: 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63  STR zValue){.  c
ad00: 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72  har **ppDirector
ad10: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
ad20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
ad30: 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  NIT.  int rc = s
ad40: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
ad50: 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
ad60: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
ad70: 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51  f.  if( type==SQ
ad80: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
ad90: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
ada0: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
adb0: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74  y = &sqlite3_dat
adc0: 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  a_directory;.  }
add0: 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53  else if( type==S
ade0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
adf0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
ae00: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
ae10: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65  ry = &sqlite3_te
ae20: 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
ae30: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  }.  assert( !ppD
ae40: 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65  irectory || type
ae50: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  ==SQLITE_WIN32_D
ae60: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
ae70: 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  PE.          || 
ae80: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
ae90: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
aea0: 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73  Y_TYPE.  );.  as
aeb0: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
aec0: 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d  ry || sqlite3Mem
aed0: 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70  debugHasType(*pp
aee0: 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59  Directory, MEMTY
aef0: 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66  PE_HEAP) );.  if
af00: 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b  ( ppDirectory ){
af10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75  .    char *zValu
af20: 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69  eUtf8 = 0;.    i
af30: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61  f( zValue && zVa
af40: 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lue[0] ){.      
af50: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 75 6e 69  zValueUtf8 = uni
af60: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
af70: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
af80: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
af90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
afa0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
afb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
afc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44  qlite3_free(*ppD
afd0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a  irectory);.    *
afe0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56  ppDirectory = zV
aff0: 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65  alueUtf8;.    re
b000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b020: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
b030: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
b040: 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45  alue of getLastE
b050: 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65  rrorMsg.** is ze
b060: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
b070: 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
b080: 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
b090: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
b0a0: 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
b0b0: 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
b0c0: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
b0d0: 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  nt getLastErrorM
b0e0: 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72  sg(DWORD lastErr
b0f0: 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  no, int nBuf, ch
b100: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
b110: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65  FormatMessage re
b120: 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75  turns 0 on failu
b130: 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69  re.  Otherwise i
b140: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  t.  ** returns t
b150: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48  he number of TCH
b160: 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ARs written to t
b170: 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62  he output.  ** b
b180: 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67  uffer, excluding
b190: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
b1a0: 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f   null char..  */
b1b0: 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d  .  DWORD dwLen =
b1c0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   0;.  char *zOut
b1d0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e   = 0;..  if( isN
b1e0: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
b1f0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
b200: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d  CHAR zTempWide[M
b210: 41 58 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e  AX_PATH+1]; /* N
b220: 4f 54 45 3a 20 53 6f 6d 65 77 68 61 74 20 61 72  OTE: Somewhat ar
b230: 62 69 74 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20  bitrary. */.    
b240: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
b250: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
b260: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
b270: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b2a0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
b2b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
b2d0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57            zTempW
b340: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 4d 41 58 5f 50 41 54 48 2c 0a 20 20 20 20    MAX_PATH,.    
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c           0);.#el
b390: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
b3a0: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
b3b0: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
b3c0: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
b3d0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
b3e0: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b410: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
b420: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b450: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
b460: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
b4f0: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
b500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
b520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
b540: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
b550: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
b560: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
b570: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
b580: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
b590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
b5a0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
b5b0: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75  ;.      zOut = u
b5c0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
b5d0: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73  mpWide);.      s
b5e0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
b5f0: 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51  alloc();.#if !SQ
b600: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
b610: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
b620: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
b630: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
b640: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
b650: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
b660: 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66  empWide);.#endif
b670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
b680: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
b690: 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
b6a0: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
b6b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
b6c0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
b6d0: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
b6e0: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
b6f0: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b720: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
b750: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
b760: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
b7b0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65      (LPSTR) &zTe
b800: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
b850: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
b860: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
b870: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
b880: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
b890: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
b8a0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
b8b0: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
b8c0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
b8d0: 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
b8e0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
b8f0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
b900: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
b910: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
b920: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
b930: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
b940: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
b950: 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  emp);.    }.  }.
b960: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d  #endif.  if( 0 =
b970: 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73  = dwLen ){.    s
b980: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b990: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45  nBuf, zBuf, "OsE
b9a0: 72 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c  rror 0x%x (%u)",
b9b0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74   lastErrno, last
b9c0: 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  Errno);.  }else{
b9d0: 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d  .    /* copy a m
b9e0: 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63  aximum of nBuf c
b9f0: 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62  hars to output b
ba00: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  uffer */.    sql
ba10: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
ba20: 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  uf, zBuf, "%s", 
ba30: 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72  zOut);.    /* fr
ba40: 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66  ee the UTF8 buff
ba50: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
ba60: 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
ba70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ba80: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
ba90: 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67  unction - winLog
baa0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20  ErrorAtLine() - 
bab0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
bac0: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
bad0: 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72  o.** winLogError
bae0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
baf0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
bb00: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
bb10: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
bb20: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
bb30: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
bb40: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
bb50: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
bb60: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
bb70: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   of.** error cod
bb80: 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  e and, if possib
bb90: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
bba0: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
bbb0: 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61  t from .** Forma
bbc0: 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  tMessage..**.** 
bbd0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
bbe0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
bbf0: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
bc00: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
bc10: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
bc20: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
bc30: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
bc40: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
bc50: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
bc60: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
bc70: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
bc80: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
bc90: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
bca0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
bcb0: 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73  ailed and the as
bcc0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
bcd0: 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e  stem path, if an
bce0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  y..*/.#define wi
bcf0: 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c  nLogError(a,b,c,
bd00: 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  d)   winLogError
bd10: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f  AtLine(a,b,c,d,_
bd20: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
bd30: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
bd40: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
bd50: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
bd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
bd70: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
bd80: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
bd90: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
bda0: 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74     /* Win32 last
bdb0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
bdc0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bde0: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
bdf0: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
be00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
be10: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
be20: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
be30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
be40: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
be50: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
be60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
be70: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
be80: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
be90: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
bea0: 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20  har zMsg[500];  
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bec0: 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  * Human readable
bed0: 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20   error text */. 
bee0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bf10: 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d   */..  zMsg[0] =
bf20: 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72   0;.  getLastErr
bf30: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
bf40: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
bf50: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
bf60: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
bf70: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
bf80: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
bf90: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
bfa0: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
bfb0: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
bfc0: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
bfd0: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
bfe0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
bff0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
c000: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  win.c:%d: (%d) %
c010: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
c020: 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72     iLine, lastEr
c030: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
c040: 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20  h, zMsg.  );..  
c050: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
c060: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  }../*.** The num
c070: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
c080: 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20  t a ReadFile(), 
c090: 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64  WriteFile(), and
c0a0: 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a   DeleteFile().**
c0b0: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64   will be retried
c0c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63   following a loc
c0d0: 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f  king error - pro
c0e0: 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20  bably caused by 
c0f0: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
c100: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
c110: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
c120: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
c130: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
c140: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
c150: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
c160: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
c170: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
c180: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
c190: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
c1a0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
c1b0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
c1c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c1d0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
c1e0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
c1f0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
c200: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
c210: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
c220: 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53  32IoerrRetry = S
c230: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c240: 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20  R_RETRY;.static 
c250: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
c260: 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54  tryDelay = SQLIT
c270: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c280: 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a  TRY_DELAY;../*.*
c290: 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28  * If a ReadFile(
c2a0: 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29  ) or WriteFile()
c2b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69   error occurs, i
c2c0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
c2d0: 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ne.** to see if 
c2e0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  it should be ret
c2f0: 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52  ried.  Return TR
c300: 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65  UE to retry.  Re
c310: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f  turn FALSE.** to
c320: 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e   give up with an
c330: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
c340: 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72  c int retryIoerr
c350: 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
c360: 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
c370: 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
c380: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
c390: 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
c3a0: 33 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a  32IoerrRetry ){.
c3b0: 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
c3c0: 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
c3d0: 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = e;.    }.    r
c3e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
c3f0: 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45  f( e==ERROR_ACCE
c400: 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20  SS_DENIED ||.   
c410: 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b     e==ERROR_LOCK
c420: 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20  _VIOLATION ||.  
c430: 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41      e==ERROR_SHA
c440: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29  RING_VIOLATION )
c450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
c460: 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 33 32 49  n32_sleep(win32I
c470: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28  oerrRetryDelay*(
c480: 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20  1+*pnRetry));.  
c490: 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20    ++*pnRetry;.  
c4a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c4b0: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
c4c0: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
c4d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20  .}../*.** Log a 
c4f0: 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20  I/O error retry 
c500: 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  episode..*/.stat
c510: 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72 72  ic void logIoerr
c520: 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20  (int nRetry){.  
c530: 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20  if( nRetry ){.  
c540: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c550: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20  LITE_IOERR, .   
c560: 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73     "delayed %dms
c570: 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e   for lock/sharin
c580: 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20  g conflict",.   
c590: 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
c5a0: 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
c5b0: 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20  nRetry+1)/2.    
c5c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
c5d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a  LITE_OS_WINCE./*
c5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c620: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73  ********.** This
c630: 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e   section contain
c640: 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45  s code for WinCE
c650: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   only..*/./*.** 
c660: 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65 73 20  Windows CE does 
c670: 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c  not have a local
c680: 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  time() function.
c690: 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a    So create a.**
c6a0: 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a   substitute..*/.
c6b0: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
c6c0: 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63  >.struct tm *__c
c6d0: 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63  decl localtime(c
c6e0: 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a  onst time_t *t).
c6f0: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
c700: 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49  t tm y;.  FILETI
c710: 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53  ME uTm, lTm;.  S
c720: 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20  YSTEMTIME pTm;. 
c730: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
c740: 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a  64;.  t64 = *t;.
c750: 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31    t64 = (t64 + 1
c760: 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30  1644473600)*1000
c770: 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f  0000;.  uTm.dwLo
c780: 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f  wDateTime = (DWO
c790: 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46  RD)(t64 & 0xFFFF
c7a0: 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48  FFFF);.  uTm.dwH
c7b0: 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57  ighDateTime= (DW
c7c0: 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b  ORD)(t64 >> 32);
c7d0: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c  .  osFileTimeToL
c7e0: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
c7f0: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c  m,&lTm);.  osFil
c800: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
c810: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
c820: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
c830: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
c840: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
c850: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
c860: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
c870: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
c880: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
c890: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
c8a0: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
c8b0: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
c8c0: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
c8d0: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
c8e0: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 23 64  return &y;.}..#d
c8f0: 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
c900: 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
c910: 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
c920: 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
c930: 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
c940: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
c950: 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
c960: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
c970: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
c980: 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
c990: 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
c9a0: 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
c9b0: 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
c9c0: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
c9d0: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
c9e0: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
c9f0: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
ca00: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
ca10: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
ca20: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
ca30: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
ca40: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
ca50: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
ca60: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
ca70: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
ca80: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
ca90: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
caa0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
cab0: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
cac0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
cad0: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
cae0: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65  ic BOOL winceCre
caf0: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
cb00: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
cb10: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
cb20: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20    LPWSTR zTok;. 
cb30: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20   LPWSTR zName;. 
cb40: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
cb50: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75  UE;..  zName = u
cb60: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
cb70: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
cb80: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
cb90: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
cba0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  */.    return FA
cbb0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  LSE;.  }..  /* I
cbc0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
cbd0: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
cbe0: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d    memset(&pFile-
cbf0: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  >local, 0, sizeo
cc00: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
cc10: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
cc20: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
cc30: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
cc40: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
cc50: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
cc60: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
cc70: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68  */.  zTok = osCh
cc80: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b  arLowerW(zName);
cc90: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a  .  for (;*zTok;z
cca0: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28  Tok++){.    if (
ccb0: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a  *zTok == '\\') *
ccc0: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a  zTok = '_';.  }.
ccd0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65  .  /* Create/ope
cce0: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65  n the named mute
ccf0: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  x */.  pFile->hM
cd00: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d  utex = osCreateM
cd10: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
cd20: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
cd30: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
cd40: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
cd50: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
cd60: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
cd70: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
cd80: 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e  E_ERROR, pFile->
cd90: 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63  lastErrno, "winc
cda0: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
cdb0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
cdc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
cdd0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
cde0: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
cdf0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
ce00: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
ce10: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
ce20: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
ce30: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
ce40: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
ce50: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
ce60: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
ce70: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
ce80: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
ce90: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
cea0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
ceb0: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
cec0: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
ced0: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
cee0: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
cef0: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
cf00: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
cf10: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
cf20: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
cf30: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
cf40: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
cf50: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
cf60: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
cf90: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
cfa0: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
cfb0: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
cfe0: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
cff0: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
d000: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
d010: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
d020: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
d030: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
d040: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
d050: 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61  */.  if (osGetLa
d060: 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52  stError() == ERR
d070: 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54  OR_ALREADY_EXIST
d080: 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20  S){.    bInit = 
d090: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  FALSE;.  }..  sq
d0a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
d0b0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
d0c0: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
d0d0: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
d0e0: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
d0f0: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
d100: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
d110: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
d120: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
d130: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
d140: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
d160: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
d170: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
d180: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d190: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
d1a0: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
d1b0: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
d1c0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
d1d0: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
d1e0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68    if (!pFile->sh
d1f0: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  ared){.      pFi
d200: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d210: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
d220: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
d230: 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
d240: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d250: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d260: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
d270: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
d280: 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  );.      osClose
d290: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
d2a0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
d2b0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
d2c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
d2d0: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
d2e0: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
d2f0: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
d300: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
d310: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
d320: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
d330: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20  d == NULL){.    
d340: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
d350: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d360: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
d370: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
d380: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
d390: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
d3a0: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
d3b0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
d3c0: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
d3d0: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
d3e0: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
d3f0: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
d400: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
d410: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
d420: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
d430: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
d440: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
d450: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
d460: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
d470: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
d480: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
d490: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
d4a0: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
d4b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
d4c0: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
d4d0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
d4e0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
d4f0: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
d500: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
d510: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
d520: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
d530: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
d540: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
d550: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
d560: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
d570: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
d580: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
d590: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
d5a0: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
d5b0: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
d5c0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
d5d0: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
d5e0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
d5f0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
d600: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
d610: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
d620: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
d630: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
d640: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
d650: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
d660: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
d670: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
d680: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
d690: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
d6a0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
d6b0: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
d6c0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
d6d0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
d6e0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
d6f0: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
d700: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
d710: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
d720: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
d730: 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56   */.    osUnmapV
d740: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
d750: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73  >shared);.    os
d760: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
d770: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20  e->hShared);..  
d780: 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74    /* Done with t
d790: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
d7a0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
d7b0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d7c0: 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73  ;    .    osClos
d7d0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
d7e0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
d7f0: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
d800: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
d810: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
d820: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
d830: 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  e() API of Windo
d840: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
d850: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
d860: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
d870: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
d880: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
d890: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
d8a0: 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
d8b0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
d8c0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20  ytesToLockLow,. 
d8d0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
d8e0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a  BytesToLockHigh.
d8f0: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
d900: 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
d910: 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
d920: 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
d930: 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
d940: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
d950: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
d960: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d970: 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
d980: 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  sToLockHigh);.. 
d990: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
d9a0: 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
d9b0: 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
d9c0: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
d9d0: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74  tex);..  /* Want
d9e0: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
d9f0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28   lock? */.  if (
da00: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
da10: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
da20: 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26  _FIRST.       &&
da30: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
da40: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  oLockLow == (DWO
da50: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b  RD)SHARED_SIZE){
da60: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
da70: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
da80: 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e   == 0 && pFile->
da90: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
daa0: 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
dab0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
dac0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
dad0: 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  E;.       pFile-
dae0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
daf0: 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
db00: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
db10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
db20: 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c   Want a read-onl
db30: 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  y lock? */.  els
db40: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
db50: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
db60: 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a  SHARED_FIRST &&.
db70: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62             nNumb
db80: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
db90: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
dba0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
dbb0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
dbc0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
dbd0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b  local.nReaders +
dbe0: 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  +;.      if (pFi
dbf0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
dc00: 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20  rs == 1){.      
dc10: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
dc20: 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  >nReaders ++;.  
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
dc40: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
dc50: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
dc60: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f   a pending lock?
dc70: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
dc80: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
dc90: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
dca0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
dcb0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
dcc0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49   == 1){.    /* I
dcd0: 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63  f no pending loc
dce0: 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69  k has been acqui
dcf0: 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72  red, then acquir
dd00: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  e it */.    if (
dd10: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
dd20: 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a  Pending == 0) {.
dd30: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
dd40: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
dd50: 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
dd60: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
dd70: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
dd80: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
dd90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
dda0: 57 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20  Want a reserved 
ddb0: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
ddc0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
ddd0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
dde0: 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e  SERVED_BYTE && n
ddf0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
de00: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
de10: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
de20: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
de30: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69  = 0) {.      pFi
de40: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
de50: 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  erved = TRUE;.  
de60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
de70: 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  .bReserved = TRU
de80: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
de90: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
dea0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
deb0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
dec0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
ded0: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
dee0: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
def0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f  tion of the Unlo
df00: 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69  ckFile API of Wi
df10: 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
df20: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
df30: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c  eUnlockFile(.  L
df40: 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a  PHANDLE phFile,.
df50: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
df60: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
df70: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
df80: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
df90: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
dfa0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
dfb0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
dfc0: 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  lockHigh.){.  wi
dfd0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
dfe0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
dff0: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
e000: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
e010: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
e020: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
e030: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
e040: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
e050: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e060: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
e070: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
e080: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
e090: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
e0a0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e0b0: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
e0c0: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f   a reader lock o
e0d0: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
e0e0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ock */.  if (dwF
e0f0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e100: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
e110: 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64  RST){.    /* Did
e120: 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c   we have an excl
e130: 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
e140: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e150: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
e160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
e170: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e180: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
e190: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a  D)SHARED_SIZE);.
e1a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
e1b0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
e1c0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
e1d0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
e1e0: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
e1f0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e200: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TRUE;.    }..   
e210: 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20   /* Did we just 
e220: 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f  have a reader lo
e230: 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ck? */.    else 
e240: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e250: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
e260: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
e270: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e280: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
e290: 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d  RED_SIZE || nNum
e2a0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e2b0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
e2c0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e2d0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
e2e0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e2f0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
e300: 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
e310: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
e320: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
e330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
e340: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
e350: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
e360: 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
e370: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
e380: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
e390: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
e3a0: 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e  NDING_BYTE && nN
e3b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e3c0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
e3d0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e3e0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
e3f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e400: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
e410: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
e420: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
e430: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
e440: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
e450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
e460: 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
e470: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
e480: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
e490: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
e4a0: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
e4b0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e4c0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
e4d0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
e4e0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e4f0: 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
e500: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e510: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
e520: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e530: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
e540: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
e550: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e560: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
e570: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
e580: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
e590: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
e5a0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
e5b0: 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
e5c0: 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
e5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e610: 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
e620: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
e630: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
e640: 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
e650: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
e660: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
e670: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
e680: 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
e690: 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
e6a0: 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
e6b0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
e6c0: 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
e6d0: 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
e6e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
e6f0: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
e700: 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
e710: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
e720: 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
e730: 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
e740: 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
e750: 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
e760: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
e770: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
e780: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
e790: 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
e7b0: 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
e7c0: 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
e7d0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
e7e0: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
e7f0: 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
e800: 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
e810: 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
e820: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
e830: 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
e840: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
e850: 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
e860: 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
e870: 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66  ileEx(*phFile, f
e880: 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65  lags, 0, numByte
e890: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
e8a0: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
e8b0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
e8c0: 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  osLockFile(*phFi
e8d0: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
e8e0: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
e8f0: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
e910: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
e920: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e930: 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72   Unlock a file r
e940: 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69  egion.. */.stati
e950: 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b  c BOOL winUnlock
e960: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
e970: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
e980: 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
e990: 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
e9a0: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
e9b0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
e9c0: 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
e9d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
e9e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
e9f0: 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
ea00: 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
ea10: 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
ea20: 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
ea30: 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
ea40: 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a   UnlockFile..  *
ea50: 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
ea60: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  UnlockFile(phFil
ea70: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
ea80: 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20     numBytesLow, 
eab0: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23  numBytesHigh);.#
eac0: 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28  else.  if( isNT(
ead0: 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
eae0: 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
eaf0: 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
eb00: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
eb10: 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
eb20: 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
eb30: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
eb40: 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
eb50: 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
eb60: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
eb70: 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
eb80: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
eb90: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
eba0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ebb0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
ebc0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
ebd0: 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
ebe0: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
ec10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ec20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ec70: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
ec80: 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
ec90: 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
eca0: 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
ecb0: 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
ecc0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
ecd0: 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
ece0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed20: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
ed30: 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
ed40: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
ed50: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
ed60: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
ed70: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
ed80: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
ed90: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
eda0: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
edb0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
edc0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
edd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
ede0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
edf0: 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
ee00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
ee10: 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
ee20: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
ee30: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
ee40: 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
ee50: 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
ee60: 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
ee70: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
ee80: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
ee90: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
eea0: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
eeb0: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
eec0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
eed0: 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65  INRT.  LONG uppe
eee0: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
eef0: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73         /* Most s
ef00: 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
ef10: 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c  ew offset */.  L
ef20: 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20  ONG lowerBits;  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef40: 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20  * Least sig. 32 
ef50: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
ef60: 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  et */.  DWORD dw
ef70: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
ef80: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
ef90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
efa0: 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f  FilePointer() */
efb0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
efc0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
efd0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
efe0: 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
eff0: 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70  rror() */..  upp
f000: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
f010: 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
f020: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
f030: 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
f040: 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
f050: 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
f060: 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
f070: 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
f080: 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
f090: 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
f0a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f0b0: 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
f0c0: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
f0d0: 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
f0e0: 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
f0f0: 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
f100: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
f110: 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
f120: 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
f130: 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
f140: 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
f150: 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
f160: 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
f170: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
f180: 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
f190: 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
f1a0: 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c  ccured, it is al
f1b0: 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
f1c0: 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
f1d0: 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
f1e0: 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
f1f0: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
f200: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
f210: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
f220: 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
f230: 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
f240: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f250: 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
f260: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f270: 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
f280: 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
f290: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f2a0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
f2b0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
f2c0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
f2d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65               "se
f2f0: 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c  ekWinFile", pFil
f300: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
f310: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
f320: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
f330: 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61    /*.  ** Same a
f340: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
f350: 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d  that this implem
f360: 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66  entation works f
f370: 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a  or WinRT..  */..
f380: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
f390: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
f3a0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66    /* The new off
f3b0: 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  set */.  BOOL bR
f3c0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
f3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f3e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
f3f0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29  tFilePointerEx()
f400: 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72   */..  x.QuadPar
f410: 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62  t = iOffset;.  b
f420: 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
f430: 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e  ointerEx(pFile->
f440: 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45  h, x, 0, FILE_BE
f450: 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65  GIN);..  if(!bRe
f460: 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  t){.    pFile->l
f470: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f480: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
f490: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f4a0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
f4b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f4c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
f4d0: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
f4e0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
f4f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
f500: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
f510: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
f520: 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e a file..**.** 
f530: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
f540: 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hat an attempt t
f550: 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  o close a handle
f560: 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73   might sometimes
f570: 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20  .** fail.  This 
f580: 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73  is a very unreas
f590: 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62  onable result, b
f5a0: 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f  ut Windows is no
f5b0: 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62  torious.** for b
f5c0: 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c  eing unreasonabl
f5d0: 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f  e so I do not do
f5e0: 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68  ubt that it migh
f5f0: 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a  t happen.  If.**
f600: 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73   the close fails
f610: 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31  , we pause for 1
f620: 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
f630: 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20  and try again.  
f640: 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58  As.** many as MX
f650: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61  _CLOSE_ATTEMPT a
f660: 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65  ttempts to close
f670: 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20   the handle are 
f680: 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67  made before.** g
f690: 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74  iving up and ret
f6a0: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
f6b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
f6c0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73  LOSE_ATTEMPT 3.s
f6d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f  tatic int winClo
f6e0: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f6f0: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  *id){.  int rc, 
f700: 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69  cnt = 0;.  winFi
f710: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
f720: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
f730: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69  ert( id!=0 );.#i
f740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f750: 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20  T_WAL.  assert( 
f760: 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29  pFile->pShm==0 )
f770: 3b 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  ;.#endif.  OSTRA
f780: 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
f790: 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
f7a0: 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43  do{.    rc = osC
f7b0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
f7c0: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
f7d0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
f7e0: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
f7f0: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
f800: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
f810: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
f820: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
f830: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
f840: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
f850: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
f860: 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
f870: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
f880: 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
f890: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
f8a0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
f8b0: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
f8c0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
f8d0: 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
f8e0: 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
f8f0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
f900: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
f910: 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
f920: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
f930: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
f940: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
f950: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
f960: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
f970: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
f980: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
f990: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
f9a0: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
f9b0: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
f9c0: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
f9d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f9e0: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
f9f0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
fa00: 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
fa10: 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73  CE(("CLOSE %d %s
fa20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
fa30: 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
fa40: 65 64 22 29 29 3b 0a 20 20 69 66 28 20 72 63 20  ed"));.  if( rc 
fa50: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
fa60: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
fa70: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
fa80: 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
fa90: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
faa0: 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
fab0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
fac0: 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
fad0: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
fb00: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
fb10: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
fb20: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
fb30: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
fb40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
fb50: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
fb60: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
fb70: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
fb80: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
fb90: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
fba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
fbb0: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
fbc0: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
fbd0: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
fbe0: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
fbf0: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
fc00: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
fc10: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
fc20: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
fc30: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
fc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fc50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
fc60: 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
fc70: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
fc80: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
fc90: 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
fca0: 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
fcb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
fcc0: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
fcd0: 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
fce0: 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
fcf0: 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
fd00: 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
fd10: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
fd20: 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
fd30: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
fd40: 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd60: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
fd70: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
fd80: 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
fd90: 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fdb0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
fdc0: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
fdd0: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
fde0: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
fdf0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
fe00: 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  EAD);.  OSTRACE(
fe10: 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25  ("READ %d lock=%
fe20: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
fe30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
fe40: 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
fe50: 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65  S_WINCE.  if( se
fe60: 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c  ekWinFile(pFile,
fe70: 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
fe80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
fe90: 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  LL;.  }.  while(
fea0: 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
feb0: 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
fec0: 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a  , &nRead, 0) ){.
fed0: 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26  #else.  memset(&
fee0: 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
fef0: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
ff00: 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  ));.  overlapped
ff10: 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
ff20: 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
ff30: 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70  ffff);.  overlap
ff40: 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
ff50: 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
ff60: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
ff70: 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73  f);.  while( !os
ff80: 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
ff90: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
ffa0: 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65  Read, &overlappe
ffb0: 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f  d) &&.         o
ffc0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21  sGetLastError()!
ffd0: 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f  =ERROR_HANDLE_EO
ffe0: 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  F ){.#endif.    
fff0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
10000 0a 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f  .    if( retryIo
10010 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
10020 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
10030 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  nue;.    pFile->
10040 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
10050 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  Errno;.    retur
10060 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
10070 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c  LITE_IOERR_READ,
10080 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10090 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
100a0 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
100b0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
100c0 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  logIoerr(nRetry)
100d0 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
100e0 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
100f0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
10100 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
10110 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
10120 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
10130 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
10140 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
10150 65 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ead);.    return
10160 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
10170 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
10180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10190 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
101a0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
101b0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
101c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
101d0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
101e0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
101f0 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
10200 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
10210 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
10220 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
10230 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
10240 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
10250 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
10260 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
10270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10280 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
10290 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
102a0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
102b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
102c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
102d0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
102e0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
102f0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
10300 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
10310 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
10320 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
10330 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
10360 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65  r has occured, e
10370 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77  lse false */.  w
10380 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
10390 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
103a0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * File handle */
103b0 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
103c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
103d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
103e0 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73  retries */..  as
103f0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
10400 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10410 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
10420 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
10430 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a  E_IOERR_WRITE);.
10440 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
10450 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
10460 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20  QLITE_FULL);..  
10470 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
10480 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
10490 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
104a0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
104b0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
104c0 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46  .  rc = seekWinF
104d0 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
104e0 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  t);.  if( rc==0 
104f0 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e  ){.#else.  {.#en
10500 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
10510 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45  OS_WINCE.    OVE
10520 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
10530 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed;        /* Th
10540 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69  e offset for Wri
10550 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  teFile. */.#endi
10560 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  f.    u8 *aRem =
10570 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
10580 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
10590 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
105a0 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
105b0 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
105c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
105d0 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
105e0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
105f0 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10610 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
10620 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
10630 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
10640 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
10650 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
10660 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
10670 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
10680 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
10690 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d  OS_WINCE.    mem
106a0 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
106b0 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
106c0 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65  APPED));.    ove
106d0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
106e0 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
106f0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
10700 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
10710 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
10720 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
10730 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
10740 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  dif..    while( 
10750 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51  nRem>0 ){.#if SQ
10760 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
10770 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
10780 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
10790 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
107a0 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
107b0 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
107c0 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
107d0 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
107e0 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
107f0 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
10800 20 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f       if( retryIo
10810 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
10820 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
10830 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
10840 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10850 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20    if( nWrite<=0 
10860 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
10870 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
10880 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
10890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
108a0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
108b0 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65  INCE.      offse
108c0 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
108d0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
108e0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
108f0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
10900 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  f);.      overla
10910 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
10920 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
10930 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
10940 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ff);.#endif.    
10950 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
10960 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
10970 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
10980 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
10990 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
109a0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
109b0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
109c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
109d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
109e0 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
109f0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
10a00 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
10a10 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
10a20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
10a30 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
10a40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10a50 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
10a60 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  }.    return win
10a70 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
10a80 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
10a90 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
10ab0 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Write", pFile->z
10ac0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
10ad0 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65      logIoerr(nRe
10ae0 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  try);.  }.  retu
10af0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10b00 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
10b10 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
10b20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
10b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10b40 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
10b50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
10b60 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
10b70 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10b80 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
10b90 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
10ba0 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
10bb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10bc0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
10bd0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
10be0 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
10bf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10c00 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41  File );..  OSTRA
10c10 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
10c20 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %lld\n", pFile-
10c30 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53  >h, nByte));.  S
10c40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
10c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
10c60 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20  RR_TRUNCATE);.. 
10c70 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
10c80 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
10c90 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
10ca0 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
10cb0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
10cc0 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
10cd0 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
10ce0 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
10cf0 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
10d00 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
10d10 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
10d20 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
10d30 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
10d40 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
10d50 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
10d60 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
10d70 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
10d80 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
10d90 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
10da0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
10db0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
10dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e  .  }..  /* SetEn
10dd0 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e  dOfFile() return
10de0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
10df0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a  successful, or z
10e00 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c  ero when it fail
10e10 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b  s. */.  if( seek
10e20 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e  WinFile(pFile, n
10e30 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20  Byte) ){.    rc 
10e40 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
10e50 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
10e60 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
10e70 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
10e80 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
10e90 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
10ea0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
10eb0 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
10ec0 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
10ed0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10ee0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
10ef0 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
10f00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10f10 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
10f20 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
10f30 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
10f40 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22    "winTruncate2"
10f50 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
10f60 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
10f70 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
10f80 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  ld %s\n", pFile-
10f90 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20  >h, nByte, rc ? 
10fa0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
10fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10fc0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
10fd0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
10fe0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
10ff0 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
11000 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
11010 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
11020 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
11030 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
11040 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68  e occuring at th
11050 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
11060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
11070 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
11080 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
11090 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
110a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
110b0 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
110c0 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
110d0 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
110e0 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ted to disk..*/.
110f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79  static int winSy
11100 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
11110 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
11120 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11130 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a  NO_SYNC.  /*.  *
11140 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e  * Used only when
11150 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
11160 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a  is not defined..
11170 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b     */.  BOOL rc;
11180 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
11190 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
111a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
111b0 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20  NO_SYNC) || \.  
111c0 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54    (defined(SQLIT
111d0 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
111e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
111f0 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  ).  /*.  ** Used
11200 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
11210 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
11220 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61  ned and by the a
11230 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20  ssert() and/or. 
11240 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61   ** OSTRACE() ma
11250 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69  cros..   */.  wi
11260 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
11270 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c  winFile*)id;.#el
11280 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
11290 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69  METER(id);.#endi
112a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
112b0 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  le );.  /* Check
112c0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
112d0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
112e0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
112f0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
11300 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
11310 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
11320 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
11330 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
11340 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
11350 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25  OSTRACE(("SYNC %
11360 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
11370 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
11380 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
11390 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
113a0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
113b0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
113c0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
113d0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
113e0 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
113f0 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
11400 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
11410 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
11420 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
11430 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11440 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64  E_FULL );..#ifnd
11450 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
11460 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
11470 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a  R(flags);.#else.
11480 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30    if( (flags&0x0
11490 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
114a0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
114b0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
114c0 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
114d0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
114e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
114f0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
11500 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
11510 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
11520 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
11530 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
11540 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
11550 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  YNC.  return SQL
11560 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
11570 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
11580 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
11590 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
115a0 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
115b0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
115c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
115d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
115e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
115f0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11600 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
11610 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11620 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
11630 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11640 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11650 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65  "winSync", pFile
11660 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
11670 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
11680 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
11690 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
116a0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
116b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
116c0 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
116d0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
116e0 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
116f0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
11700 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
11710 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11720 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
11730 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
11740 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
11750 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
11760 46 53 54 41 54 29 3b 0a 23 69 66 20 53 51 4c 49  FSTAT);.#if SQLI
11770 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a  TE_OS_WINRT.  {.
11780 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52      FILE_STANDAR
11790 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20  D_INFO info;.   
117a0 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e   if( osGetFileIn
117b0 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
117c0 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69  eEx(pFile->h, Fi
117d0 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a  leStandardInfo,.
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65       &info, size
11810 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20  of(info)) ){.   
11820 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f     *pSize = info
11830 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50  .EndOfFile.QuadP
11840 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
11850 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11860 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11870 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
11880 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
11890 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
118a0 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
118b0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
118d0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
118e0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
118f0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b   }.  }.#else.  {
11900 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72  .    DWORD upper
11910 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
11920 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44  lowerBits;.    D
11930 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
11940 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  .    lowerBits =
11950 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70   osGetFileSize(p
11960 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42  File->h, &upperB
11970 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  its);.    *pSize
11980 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
11990 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c  t64)upperBits)<<
119a0 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b  32) + lowerBits;
119b0 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65  .    if(   (lowe
119c0 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44  rBits == INVALID
119d0 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20  _FILE_SIZE).    
119e0 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
119f0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11a00 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
11a10 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
11a20 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
11a30 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
11a40 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
11a50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
11a60 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
11a70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
11a80 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
11a90 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11aa0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11ab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11ac0 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
11ad0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
11ae0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
11af0 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
11b00 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
11b10 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
11b20 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
11b30 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
11b40 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
11b50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
11b60 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
11b70 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IVE_LOCK.# defin
11b80 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  e LOCKFILE_EXCLU
11b90 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64  SIVE_LOCK 2.#end
11ba0 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72  if../*.** Histor
11bb0 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68  ically, SQLite h
11bc0 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65  as used both the
11bd0 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f   LockFile and Lo
11be0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
11bf0 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ns..** When the 
11c00 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f  LockFile functio
11c10 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77  n was used, it w
11c20 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  as always expect
11c30 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d  ed to fail.** im
11c40 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
11c50 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
11c60 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c  be obtained.  Al
11c70 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78  so, it always ex
11c80 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74  pected to.** obt
11c90 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
11ca0 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c   lock.  These fl
11cb0 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ags are used wit
11cc0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  h the LockFileEx
11cd0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64   function.** and
11ce0 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65   reflect those e
11cf0 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65  xpectations; the
11d00 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f  refore, they sho
11d10 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  uld not be chang
11d20 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
11d30 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
11d40 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
11d50 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
11d60 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f  AGS   (LOCKFILE_
11d70 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
11d80 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   | \.           
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f         LOCKFILE_
11db0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
11dc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75  #endif../*.** Cu
11dd0 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20  rrently, SQLite 
11de0 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20  never calls the 
11df0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
11e00 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74  ion without want
11e10 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20  ing the.** call 
11e20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74  to fail immediat
11e30 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
11e40 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
11e50 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
11e60 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
11e70 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
11e80 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
11e90 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c  X_FLAGS (LOCKFIL
11ea0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
11eb0 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  LY).#endif../*.*
11ec0 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
11ed0 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66  er lock..** Diff
11ee0 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e  erent API routin
11ef0 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65  es are called de
11f00 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
11f10 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a  er or not this.*
11f20 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69  * is Win9x or Wi
11f30 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nNT..*/.static i
11f40 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77  nt getReadLock(w
11f50 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
11f60 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
11f70 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53   isNT() ){.#if S
11f80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
11f90 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
11fa0 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
11fb0 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
11fc0 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
11fd0 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
11fe0 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  n32.    **      
11ff0 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e   API LockFileEx.
12000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  .    */.    res 
12010 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  = winceLockFile(
12020 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
12030 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30  D_FIRST, 0, 1, 0
12040 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73  );.#else.    res
12050 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
12060 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
12070 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
12080 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
12090 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
120a0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
120b0 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69  _SIZE, 0);.#endi
120c0 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
120d0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
120e0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  SI.  else{.    i
120f0 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
12100 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
12110 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
12120 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
12130 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
12140 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
12150 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
12160 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
12170 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
12180 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
12190 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
121a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
121b0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
121c0 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
121d0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
121e0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
121f0 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20  .  if( res == 0 
12200 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
12210 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
12220 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
12230 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f  /* No need to lo
12240 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c  g a failure to l
12250 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ock */.  }.  ret
12260 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
12270 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
12280 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
12290 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
122a0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
122b0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
122c0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
122d0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
122e0 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
122f0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
12300 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
12310 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
12320 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
12330 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
12340 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
12350 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
12360 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
12370 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
12380 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
12390 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  e, 0, 1, 0);.  }
123a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65  .#endif.  if( re
123b0 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72  s==0 && ((lastEr
123c0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
123d0 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e  rror())!=ERROR_N
123e0 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20  OT_LOCKED) ){.  
123f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12400 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
12410 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
12420 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12430 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  OCK, pFile->last
12440 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
12450 20 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c      "unlockReadL
12460 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ock", pFile->zPa
12470 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
12480 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
12490 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
124a0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
124b0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
124c0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
124d0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
124e0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
124f0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
12500 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
12510 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
12520 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
12530 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
12540 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
12550 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
12560 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
12570 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
12580 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
12590 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
125a0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
125b0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
125c0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
125d0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
125e0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
125f0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
12600 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
12610 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
12620 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
12630 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
12640 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
12650 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
12660 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
12670 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
12680 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
12690 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
126a0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
126b0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
126c0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
126d0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
126e0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
126f0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
12700 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
12710 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
12720 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
12730 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
12740 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
12750 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
12760 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
12770 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
12780 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
12790 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
127a0 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
127b0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
127c0 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
127d0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
127e0 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
127f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12800 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
12810 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
12820 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
12830 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
12840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12850 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
12860 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
12870 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
12880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
12890 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
128a0 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
128b0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
128c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
128d0 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f  esult of a Windo
128e0 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
128f0 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
12900 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
12910 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
12920 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
12930 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
12940 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
12950 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
12960 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
12970 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
12980 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
12990 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
129a0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
129b0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
129c0 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
129d0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
129e0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
129f0 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
12a00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12a10 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
12a20 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
12a30 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
12a40 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
12a50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
12a60 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
12a70 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
12a80 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
12a90 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
12aa0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
12ab0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
12ac0 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
12ad0 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
12ae0 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
12af0 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
12b00 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
12b10 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
12b20 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
12b30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12b40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
12b50 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
12b60 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
12b70 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
12b80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
12b90 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
12ba0 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
12bb0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
12bc0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
12bd0 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
12be0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
12bf0 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
12c00 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
12c10 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
12c20 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
12c30 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
12c40 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
12c50 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
12c60 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
12c70 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
12c80 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
12c90 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
12ca0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
12cb0 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
12cc0 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
12cd0 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
12ce0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
12cf0 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
12d00 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
12d10 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
12d20 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
12d30 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
12d40 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
12d50 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
12d60 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
12d70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
12d80 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
12d90 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
12da0 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
12db0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
12dc0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
12dd0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
12de0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e               PEN
12e10 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
12e20 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
12e30 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20   /* Try 3 times 
12e40 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69  to get the pendi
12e50 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69  ng lock.  This i
12e60 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b  s needed to work
12e70 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64  .      ** around
12e80 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
12e90 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64   by indexing and
12ea0 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73  /or anti-virus s
12eb0 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20  oftware on.     
12ec0 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74   ** Windows syst
12ed0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  ems..      ** If
12ee0 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74   you are using t
12ef0 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f  his code as a mo
12f00 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74  del for alternat
12f10 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f  ive VFSes, do no
12f20 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  t.      ** copy 
12f30 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63  this retry logic
12f40 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20  .  It is a hack 
12f50 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e  intended for Win
12f60 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  dows only..     
12f70 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
12f80 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65  E(("could not ge
12f90 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  t a PENDING lock
12fa0 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74  . cnt=%d\n", cnt
12fb0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  ));.      if( cn
12fc0 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t ) sqlite3_win3
12fd0 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  2_sleep(1);.    
12fe0 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
12ff0 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
13000 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
13010 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
13020 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
13030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13040 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
13050 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
13060 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
13070 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
13080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
13090 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
130a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
130b0 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
130c0 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
130d0 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
130e0 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
130f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
13100 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
13110 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13120 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
13130 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
13140 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
13150 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
13160 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
13170 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
13180 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
13190 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
131a0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
131b0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
131c0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
131d0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
131e0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
131f0 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
13200 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
13210 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
13220 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  VED_LOCK;.    }e
13230 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
13240 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
13250 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
13260 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
13270 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
13280 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
13290 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
132a0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
132b0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
132c0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
132d0 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
132e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
132f0 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
13300 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
13310 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
13320 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
13330 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
13340 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
13350 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
13360 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e   );.    res = un
13370 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
13380 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  le);.    OSTRACE
13390 28 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20  (("unreadlock = 
133a0 25 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20  %d\n", res));.  
133b0 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
133c0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
133d0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
133e0 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
133f0 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
13410 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
13420 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
13430 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
13440 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
13450 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13460 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
13470 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
13480 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
13490 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c  error-code = %d\
134a0 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b  n", lastErrno));
134b0 0a 20 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f  .      getReadLo
134c0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ck(pFile);.    }
134d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
134e0 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
134f0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
13500 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
13510 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
13520 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
13530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
13540 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
13550 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
13560 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
13570 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
13580 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
13590 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
135a0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
135b0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f   state of the lo
135c0 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74  ck has held in t
135d0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
135e0 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74  or then.  ** ret
135f0 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
13600 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  ate result code.
13610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20  .  */.  if( res 
13620 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13630 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
13640 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
13650 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79  CK FAILED %d try
13660 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67  ing for %d but g
13670 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ot %d\n", pFile-
13680 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
13690 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
136a0 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c  type));.    pFil
136b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
136c0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
136d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
136e0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
136f0 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c  ktype = (u8)newL
13700 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
13710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
13720 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
13730 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
13740 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
13750 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
13760 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
13770 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
13780 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
13790 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
137a0 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
137b0 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
137c0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
137d0 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
137e0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
137f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13800 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
13810 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
13820 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
13830 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
13840 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
13850 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
13860 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
13870 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   );..  assert( i
13880 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
13890 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
138a0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
138b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
138c0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
138d0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f  R-LOCK %d %d (lo
138e0 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  cal)\n", pFile->
138f0 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  h, rc));.  }else
13900 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
13910 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
13920 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
13930 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
13940 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
13950 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
13960 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46        winUnlockF
13970 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
13980 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
13990 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
139a0 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20    rc = !rc;.    
139b0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
139c0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65  R-LOCK %d %d (re
139d0 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
139e0 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20  >h, rc));.  }.  
139f0 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
13a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13a10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
13a20 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13a30 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13a40 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
13a50 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
13a60 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
13a70 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
13a80 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13a90 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
13aa0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13ab0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13ac0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13ad0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13ae0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13af0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13b00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13b10 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
13b20 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
13b30 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
13b40 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
13b50 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
13b60 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
13b70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
13b80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
13b90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
13ba0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
13bb0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
13bc0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
13bd0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13be0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
13bf0 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
13c00 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
13c10 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
13c20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13c30 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
13c40 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
13c50 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
13c60 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
13c70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13c80 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73  OCK %d to %d was
13c90 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c   %d(%d)\n", pFil
13ca0 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
13cb0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
13cc0 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
13cd0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
13ce0 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
13cf0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
13d00 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
13d10 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
13d20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
13d30 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
13d40 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
13d50 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
13d60 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
13d70 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74  RED_LOCK && !get
13d80 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20  ReadLock(pFile) 
13d90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
13da0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
13db0 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64  ppen.  We should
13dc0 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20   always be able 
13dd0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63  to.      ** reac
13de0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
13df0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ock */.      rc 
13e00 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
13e10 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13e20 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  K, osGetLastErro
13e30 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
13e40 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
13e50 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
13e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13e70 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
13e80 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
13e90 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
13ea0 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
13eb0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
13ec0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
13ed0 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
13ee0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
13ef0 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c  .    unlockReadL
13f00 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ock(pFile);.  }.
13f10 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
13f20 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
13f30 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
13f40 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
13f50 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
13f60 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
13f70 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
13f80 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
13f90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
13fa0 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
13fb0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
13fc0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
13fd0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
13fe0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
13ff0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
14000 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
14010 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
14020 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
14030 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
14040 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
14050 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
14060 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
14070 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
14080 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
14090 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
140a0 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
140b0 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
140c0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
140d0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
140e0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
140f0 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
14100 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
14110 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
14120 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
14130 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
14140 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
14150 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
14160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
14170 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
14180 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
14190 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
141a0 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
141b0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
141c0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
141d0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
141e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
141f0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  winFile*)id;.  s
14200 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
14210 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
14220 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
14230 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
14240 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
14250 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ype;.      retur
14260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
14270 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
14280 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
14290 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
142a0 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
142b0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
142c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
142d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
142e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
142f0 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
14300 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75      pFile->szChu
14310 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
14320 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
14330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
14340 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14350 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
14360 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
14370 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
14380 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14390 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
143a0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
143b0 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
143c0 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
143d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
143e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
143f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
14400 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
14410 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
14420 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
14430 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
14440 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
14450 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
14460 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
14470 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
14480 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
14490 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
144a0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
144b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
144c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
144d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
144e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
144f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
14500 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
14510 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
14520 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
14530 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
14540 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
14550 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
14560 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14570 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
14580 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
14590 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
145a0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
145b0 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
145c0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
145d0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
145e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
145f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
14600 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
14610 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
14620 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
14630 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
14640 22 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20  "win32");.      
14650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14670 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
14680 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
14690 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
146a0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
146b0 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
146c0 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72         win32Ioer
146d0 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20  rRetry = a[0];. 
146e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
146f0 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32      a[0] = win32
14700 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
14710 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
14720 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
14730 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
14740 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
14750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14760 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f    a[1] = win32Io
14770 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20  errRetryDelay;. 
14780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
14790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
147a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
147b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
147c0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
147d0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
147e0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
147f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
14800 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
14810 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
14820 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
14830 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
14840 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
14850 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
14860 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
14870 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
14880 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
14890 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
148a0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
148b0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
148c0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
148d0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
148e0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
148f0 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
14900 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
14910 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
14920 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
14930 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
14940 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
14950 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
14960 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
14970 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
14980 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20  {.  (void)id;.  
14990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
149a0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
149b0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
149c0 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64  rn a vector of d
149d0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
149e0 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stics..*/.static
149f0 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68   int winDeviceCh
14a00 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
14a10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
14a20 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20  .  winFile *p = 
14a30 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
14a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14a50 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
14a60 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20  WHEN_OPEN |.    
14a70 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c       ((p->ctrlFl
14a80 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53  ags & WINFILE_PS
14a90 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50  OW)?SQLITE_IOCAP
14aa0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
14ab0 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e  RITE:0);.}..#ifn
14ac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ad0 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  WAL../* .** Wind
14ae0 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
14af0 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
14b00 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
14b10 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
14b20 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
14b30 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
14b40 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
14b50 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
14b60 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
14b70 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
14b80 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
14b90 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
14ba0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a   winSysInfo;../*
14bb0 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
14bc0 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
14bd0 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
14be0 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
14bf0 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
14c00 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
14c10 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f  rotect the winLo
14c20 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75  ckInfo objects u
14c30 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  sed by .** this 
14c40 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
14c50 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
14c60 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
14c70 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
14c80 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
14c90 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
14ca0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
14cb0 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
14cc0 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
14cd0 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
14ce0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
14cf0 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
14d00 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
14d10 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
14d20 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
14d30 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
14d40 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
14d50 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
14d60 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
14d70 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
14d80 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
14d90 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
14da0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14db0 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
14dc0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14dd0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14de0 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
14df0 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
14e00 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
14e10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14e20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14e30 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
14e40 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
14e50 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
14e60 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
14e70 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
14e80 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
14e90 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
14ea0 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
14eb0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14ec0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
14ed0 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  R));.}.#endif../
14ee0 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
14ef0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
14f00 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
14f10 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
14f20 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
14f30 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
14f40 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
14f50 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
14f60 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
14f70 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
14f80 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
14f90 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
14fa0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
14fb0 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
14fc0 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
14fd0 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
14fe0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
14ff0 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
15000 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
15010 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
15020 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
15030 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
15040 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
15050 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
15060 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
15070 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
15080 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
15090 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
150a0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
150b0 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
150c0 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  xt .**.** The fo
150d0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
150e0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
150f0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
15100 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
15110 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
15120 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
15130 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
15140 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
15150 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
15160 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
15170 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
15180 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
15190 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
151a0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
151b0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
151c0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
151d0 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
151e0 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
151f0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
15200 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
15210 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
15220 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
15230 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
15240 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
15250 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
15260 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
15270 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
15280 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
15290 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
152a0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
152b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
152c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
152d0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
152e0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
152f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
15300 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
15310 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
15320 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
15330 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
15340 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
15350 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
15360 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
15370 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
15380 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
15390 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
153a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
153b0 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
153c0 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
153d0 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
153e0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
153f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15400 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
15410 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
15420 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
15430 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
15440 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
15450 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
15460 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
15470 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
15480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
15490 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
154a0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
154b0 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ts */.#ifdef SQL
154c0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e  ITE_DEBUG.  u8 n
154d0 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
154e0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
154f0 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
15500 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
15510 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
15520 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
15530 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
15540 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
15550 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
15560 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
15570 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
15580 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
15590 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
155a0 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
155b0 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
155c0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
155d0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
155e0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
155f0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
15600 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
15610 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
15620 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
15630 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
15640 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
15650 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
15660 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
15670 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
15680 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
15690 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
156a0 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
156b0 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
156c0 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
156d0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
156e0 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
156f0 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
15700 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
15710 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
15720 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
15730 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
15740 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
15750 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
15760 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
15770 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
15780 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
15790 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
157a0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
157b0 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
157c0 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
157d0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157f0 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
15800 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
15810 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
15820 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
15830 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
15840 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
15850 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
15860 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
15870 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
15880 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
15890 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
158a0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
158b0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
158c0 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
158d0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
158e0 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
158f0 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
15900 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
15910 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
15920 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
15930 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
15940 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
15950 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
15960 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
15970 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
15980 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
15990 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
159a0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
159b0 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
159c0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
159d0 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
159e0 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
159f0 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
15a00 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
15a10 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
15a20 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
15a30 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
15a40 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
15a50 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
15a60 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
15a70 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
15a80 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
15a90 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
15aa0 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
15ab0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
15ac0 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
15ad0 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
15ae0 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
15af0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
15b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15b10 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
15b20 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
15b30 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
15b40 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
15b50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15b60 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
15b70 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
15b80 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
15b90 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
15ba0 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f   code form Lock/
15bb0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a  UnlockFileEx() *
15bc0 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
15bd0 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  o the winShmNode
15be0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
15bf0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
15c00 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
15c10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15c20 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
15c30 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ) || pFile->nRef
15c40 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  ==0 );..  /* Rel
15c50 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65  ease/Acquire the
15c60 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
15c70 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  ck */.  if( lock
15c80 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
15c90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
15ca0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15cb0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74  e->hFile.h, ofst
15cc0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
15cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
15ce0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
15cf0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
15d00 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64  s */.    DWORD d
15d10 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
15d20 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
15d30 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  LY;.    if( lock
15d40 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c  Type == _SHM_WRL
15d50 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
15d60 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
15d70 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  VE_LOCK;.    rc 
15d80 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
15d90 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
15da0 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c  wFlags, ofst, 0,
15db0 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a   nByte, 0);.  }.
15dc0 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20    .  if( rc!= 0 
15dd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15de0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
15df0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15e00 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73  rrno =  osGetLas
15e10 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
15e20 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15e30 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
15e40 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20  "SHM-LOCK %d %s 
15e50 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a  %s 0x%08lx\n", .
15e60 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
15e70 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
15e80 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
15e90 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
15ea0 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20  iled",.         
15eb0 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d    lockType==_SHM
15ec0 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b  _UNLCK ? "Unlock
15ed0 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46  FileEx" : "LockF
15ee0 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20  ileEx",.        
15ef0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15f00 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rno));..  return
15f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
15f20 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
15f30 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
15f40 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
15f50 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
15f60 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
15f70 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e  te3_file*,int,in
15f80 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
15f90 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65  winDelete(sqlite
15fa0 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68  3_vfs *,const ch
15fb0 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ar*,int);../*.**
15fc0 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68   Purge the winSh
15fd0 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
15fe0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
15ff0 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  th winShmNode.nR
16000 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
16010 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
16020 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
16030 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
16040 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
16050 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
16060 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
16070 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
16080 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65  void winShmPurge
16090 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
160a0 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  fs, int deleteFl
160b0 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ag){.  winShmNod
160c0 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d  e **pp;.  winShm
160d0 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20  Node *p;.  BOOL 
160e0 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77  bRc;.  assert( w
160f0 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
16100 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53   );.  pp = &winS
16110 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68  hmNodeList;.  wh
16120 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d  ile( (p = *pp)!=
16130 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
16140 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
16150 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
16160 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c  ( p->mutex ) sql
16170 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
16180 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  p->mutex);.     
16190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
161a0 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
161b0 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55 6e        bRc = osUn
161c0 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d  mapViewOfFile(p-
161d0 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70  >aRegion[i].pMap
161e0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
161f0 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70  CE(("SHM-PURGE p
16200 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69  id-%d unmap regi
16210 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  on=%d %s\n",.   
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
16230 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
16240 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20  rocessId(), i,. 
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
16270 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
16280 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61   bRc = osCloseHa
16290 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  ndle(p->aRegion[
162a0 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].hMap);.      
162b0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
162c0 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f  PURGE pid-%d clo
162d0 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c  se region=%d %s\
162e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
162f0 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43       (int)osGetC
16300 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
16310 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ), i,.          
16320 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b         bRc ? "ok
16330 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
16340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16350 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20  ( p->hFile.h != 
16360 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
16370 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ALUE ){.        
16380 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16390 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
163a0 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
163b0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
163c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53  File);.        S
163d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
163e0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
163f0 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74  .      if( delet
16400 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
16410 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16420 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
16430 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
16440 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16450 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65         winDelete
16460 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
16470 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
16480 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
16490 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
164a0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
164b0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
164c0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
164d0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
164e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
164f0 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  >aRegion);.     
16500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
16510 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16520 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
16530 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
16540 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
16550 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
16560 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
16570 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
16580 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pDbFd..**.** Whe
16590 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
165a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
165b0 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
165c0 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
165d0 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
165e0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
165f0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
16600 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
16610 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
16620 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
16630 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
16640 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
16650 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
16660 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16670 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
16680 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44  mory(winFile *pD
16690 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77  bFd){.  struct w
166a0 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
166b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
166c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
166d0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
166e0 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
166f0 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20   *pShmNode = 0; 
16700 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
16710 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
16720 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
16750 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72  lt code */.  str
16760 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
16770 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
16780 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
16790 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ed winShmNode */
167a0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
167d0 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
167e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
167f0 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20  bFd->pShm==0 ); 
16800 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f     /* Not previo
16810 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a  usly opened */..
16820 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
16830 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
16840 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
16850 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c  ct.  Also specul
16860 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c  atively.  ** all
16870 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
16880 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65  a new winShmNode
16890 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20   and filename.. 
168a0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
168b0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
168c0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
168d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
168e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
168f0 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  M;.  nName = sql
16900 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
16910 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
16920 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
16930 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
16940 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
16950 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
16960 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
16970 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16980 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16990 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
169a0 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65   }.  pNew->zFile
169b0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
169c0 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
169d0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
169e0 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
169f0 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
16a00 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
16a10 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
16a20 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
16a30 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
16a40 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  e); ..  /* Look 
16a50 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
16a60 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
16a70 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
16a80 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
16a90 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
16aa0 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
16ab0 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
16ac0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
16ad0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
16ae0 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
16af0 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
16b00 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
16b10 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
16b20 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
16b30 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
16b40 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
16b50 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
16b60 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
16b70 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
16b80 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
16b90 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
16ba0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
16bb0 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
16bc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
16bd0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
16be0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
16bf0 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
16c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16c10 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
16c20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
16c30 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
16c40 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
16c50 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
16c60 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
16c70 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
16c80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
16c90 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
16ca0 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
16cb0 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
16cc0 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
16cd0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
16ce0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
16cf0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
16d00 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
16d10 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
16d20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16d30 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
16d40 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
16d50 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
16d60 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
16d70 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20  n(pDbFd->pVfs,. 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
16da0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
16db0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16dc0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
16df0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
16e00 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ,  /* File handl
16e10 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20  e here */.      
16e20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16e30 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c  E_OPEN_WAL | SQL
16e40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16e50 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16e60 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64 65  _CREATE, /* Mode
16e70 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20 20   flags */.      
16e80 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
16e90 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
16ea0 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  !=rc ){.      go
16eb0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
16ec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
16ed0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
16ee0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
16ef0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
16f00 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
16f10 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
16f20 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
16f30 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
16f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16f50 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
16f60 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
16f70 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
16f80 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
16f90 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
16fa0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
16fb0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
16fc0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
16fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ff0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
17000 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
17010 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
17020 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17040 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62  winOpenShm", pDb
17050 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
17060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17080 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53  ){.      winShmS
17090 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
170a0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
170b0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
170c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
170d0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
170e0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
170f0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
17100 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
17110 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
17120 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
17130 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
17140 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
17150 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ild of the winSh
17160 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
17170 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
17180 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
17190 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
171a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
171b0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
171c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
171d0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
171e0 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65   = p;.  winShmLe
171f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
17200 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
17210 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
17220 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
17230 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
17240 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
17250 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ver of the winSh
17260 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  mEnterMutex() mu
17270 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
17280 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
17290 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69  * new (struct wi
172a0 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  nShm) object to 
172b0 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
172c0 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
172d0 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
172e0 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
172f0 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
17300 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
17310 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
17320 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
17330 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
17340 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
17350 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
17360 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
17370 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
17380 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17390 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
173a0 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
173b0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
173c0 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
173d0 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
173e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
173f0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
17400 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
17410 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
17420 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
17430 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
17440 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
17450 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
17460 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
17470 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
17480 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28  ;.  winShmPurge(
17490 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b  pDbFd->pVfs, 0);
174a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
174b0 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
174c0 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
174d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
174e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
174f0 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53  ee(pNew);.  winS
17500 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
17510 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17520 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
17530 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
17540 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
17550 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
17560 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
17570 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
17580 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
17590 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
175a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
175b0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
175c0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
175d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
175e0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
175f0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
17600 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
17610 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
17620 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
17630 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
17640 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
17650 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
17660 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
17670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17680 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
17690 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
176a0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
176b0 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
176c0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
176d0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
176e0 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
176f0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
17700 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
17710 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
17720 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
17730 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
17740 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
17750 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
17760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
17770 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
17780 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
17790 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
177a0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
177b0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
177c0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
177d0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
177e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
177f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
17800 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
17810 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
17820 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
17830 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
17840 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
17850 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
17860 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
17870 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17880 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
17890 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
178a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
178b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
178c0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
178d0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
178e0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
178f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
17900 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
17910 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
17920 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
17930 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
17940 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
17950 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
17960 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
17970 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
17980 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
17990 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
179a0 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
179b0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
179c0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
179d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
179e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
179f0 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
17a00 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
17a10 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
17a20 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
17a30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
17a40 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
17a50 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
17a60 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
17a70 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
17a80 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
17a90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
17aa0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
17ab0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
17ac0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ae0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
17af0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
17b00 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
17b10 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
17b20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
17b30 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
17b40 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
17b50 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
17b60 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
17b70 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
17b80 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
17b90 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
17ba0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
17bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17bc0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
17bd0 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
17be0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
17bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17c10 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
17c20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
17c30 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
17c40 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
17c50 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
17c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c80 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
17c90 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
17cc0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
17cd0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
17ce0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
17cf0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
17d00 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
17d10 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
17d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
17d30 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
17d40 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
17d50 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
17d60 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
17d70 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
17d80 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
17d90 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
17da0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
17db0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
17dc0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
17dd0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
17de0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
17df0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
17e00 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
17e10 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
17e20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
17e30 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
17e40 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
17e50 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
17e60 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
17e70 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
17e80 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
17e90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
17ea0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
17eb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
17ec0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
17ed0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
17ee0 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
17ef0 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
17f00 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
17f10 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
17f20 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
17f30 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
17f40 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
17f50 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
17f60 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
17f70 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
17f80 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
17f90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
17fa0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
17fb0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
17fc0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
17fd0 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
17fe0 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
17ff0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
18000 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
18010 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
18020 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
18030 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
18040 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
18050 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
18060 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
18070 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
18080 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
18090 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
180a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
180b0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
180c0 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
180d0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
180e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
180f0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
18100 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
18110 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
18120 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
18130 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
18140 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
18150 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
18160 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
18170 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
18180 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
18190 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
181a0 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
181b0 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
181c0 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
181d0 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
181e0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
181f0 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
18200 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
18210 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
18220 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
18230 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
18240 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
18250 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
18260 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
18270 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
18280 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
18290 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
182a0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
182b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
182c0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
182d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
182e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
182f0 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
18300 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
18310 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
18320 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
18330 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
18340 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
18350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
18370 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
18380 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
18390 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
183a0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
183b0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73   _SHM_RDLCK, ofs
183c0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
183d0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
183e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
183f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
18400 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
18410 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
18420 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
18430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
18450 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
18460 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
18470 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
18480 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
18490 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
184a0 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
184b0 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
184c0 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
184d0 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
184e0 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
184f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
18500 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
18510 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
18520 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
18530 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
18540 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
18550 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
18560 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
18570 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18580 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
18590 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
185a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
185b0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
185c0 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
185d0 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
185e0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
185f0 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
18600 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
18610 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
18620 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
18630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
18650 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
18660 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
18670 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _WRLCK, ofst+WIN
18680 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
18690 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
186a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
186b0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
186c0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
186d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
186e0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
186f0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
18700 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
18710 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
18720 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
18730 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
18740 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
18750 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
18760 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  x %s\n",.       
18770 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29      p->id, (int)
18780 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
18790 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61 72  essId(), p->shar
187a0 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
187b0 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
187c0 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
187d0 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
187e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
187f0 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
18800 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
18810 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
18820 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
18830 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
18840 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
18850 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
18860 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
18870 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
18880 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
18890 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
188a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
188b0 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
188c0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
188d0 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
188e0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
188f0 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
18900 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
18910 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
18920 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
18930 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
18940 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
18950 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
18960 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
18970 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
18980 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
18990 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
189a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
189b0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
189c0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
189d0 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
189e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
189f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
18a00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18a10 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
18a20 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
18a30 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
18a40 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
18a50 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
18a60 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
18a70 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
18a80 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
18a90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18aa0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
18ab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
18ac0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
18ad0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
18ae0 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
18af0 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
18b00 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
18b10 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
18b20 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
18b30 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
18b40 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
18b50 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
18b60 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
18b70 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
18b80 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
18b90 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
18ba0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
18bb0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
18bc0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
18bd0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
18be0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
18bf0 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
18c00 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
18c10 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
18c20 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
18c30 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
18c40 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
18c50 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
18c60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
18c70 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
18c80 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
18c90 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
18ca0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
18cb0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
18cc0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
18cd0 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
18ce0 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
18cf0 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
18d00 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
18d10 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
18d20 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
18d30 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
18d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18d50 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
18d60 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
18d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
18d80 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
18d90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18da0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
18dd0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
18de0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
18df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18e00 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
18e10 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
18e40 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
18e50 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
18e60 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
18e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18e80 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
18e90 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
18ea0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
18eb0 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
18ec0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
18ed0 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
18ee0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
18ef0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18f00 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
18f10 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
18f20 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
18f30 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
18f40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18f50 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
18f60 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
18f70 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
18f80 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
18f90 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18fa0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
18fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
18fc0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
18fd0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
18fe0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
18ff0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
19000 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
19010 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
19020 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
19030 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
19040 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
19050 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
19060 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
19070 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
19080 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
19090 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
190a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
190b0 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
190c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
190d0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
190e0 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
190f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
19100 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
19110 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
19120 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
19130 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
19140 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
19150 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
19160 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
19170 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
19180 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
19190 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
191a0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
191b0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
191c0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
191d0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
191e0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
191f0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
19200 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
19210 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
19220 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
19230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19240 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
19250 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
19260 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
19270 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
19290 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
192a0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
192b0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
192c0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
192d0 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
192e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
192f0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
19300 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
19310 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
19320 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
19330 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
19340 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
19350 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
19360 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
19370 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
19380 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
19390 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
193a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
193b0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
193c0 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
193d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
193e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
193f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
19400 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
19410 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
19420 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
19430 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
19440 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
19450 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
19460 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19480 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
19490 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
194a0 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
194b0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
194c0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
194d0 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
194e0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
194f0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
19500 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
19510 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
19520 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
19530 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
19540 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
19550 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
19560 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
19570 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
19580 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
19590 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
195a0 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
195b0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
195c0 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
195d0 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
195e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
195f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
19600 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
19610 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
19620 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
19630 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
19640 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
19650 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
19660 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
19670 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
19680 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
19690 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
196a0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
196b0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
196c0 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
196d0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
196e0 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45       .#if SQLITE
196f0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
19700 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
19710 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
19720 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
19730 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
19740 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
19750 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ITE, nByte, NULL
19760 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
19770 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
19780 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
19790 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
197a0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
197b0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
197c0 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
197d0 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
197e0 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
197f0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
19800 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19810 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
19820 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
19830 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
19840 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
19850 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
19860 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
19870 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
19880 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
19890 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
198a0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70  RACE(("SHM-MAP p
198b0 69 64 2d 25 64 20 63 72 65 61 74 65 20 72 65 67  id-%d create reg
198c0 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20  ion=%d nbyte=%d 
198d0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
198e0 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74        (int)osGet
198f0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
19900 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
19910 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
19930 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
19940 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
19950 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
19960 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
19970 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
19980 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
19990 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
199a0 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
199b0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
199c0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
199d0 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
199e0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
199f0 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
19a00 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
19a10 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
19a20 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
19a30 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
19a40 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
19a50 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
19a60 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
19a70 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
19a80 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
19a90 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
19aa0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
19ab0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
19ac0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
19ad0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
19ae0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
19af0 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
19b00 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
19b10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
19b20 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
19b30 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69   pid-%d map regi
19b40 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20  on=%d offset=%d 
19b50 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  size=%d %s\n",. 
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
19b80 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
19b90 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
19ba0 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
19bb0 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
19bc0 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
19bd0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
19be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19bf0 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
19c00 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
19c10 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
19c20 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
19c30 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
19c40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
19c50 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
19c60 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
19c80 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46  inShmMap3", pDbF
19c90 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
19ca0 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73     if( hMap ) os
19cb0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70  CloseHandle(hMap
19cc0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
19cd0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
19ce0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d     }..      pShm
19cf0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
19d00 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
19d10 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  .pMap = pMap;.  
19d20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
19d30 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
19d40 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20  nRegion].hMap = 
19d50 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  hMap;.      pShm
19d60 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
19d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
19d80 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
19d90 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
19da0 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
19db0 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52  int iOffset = iR
19dc0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
19dd0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
19de0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
19df0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
19e00 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
19e10 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ity;.    char *p
19e20 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e   = (char *)pShmN
19e30 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65  ode->aRegion[iRe
19e40 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20  gion].pMap;.    
19e50 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  *pp = (void *)&p
19e60 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a  [iOffsetShift];.
19e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
19e80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
19e90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19ea0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19ec0 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
19ed0 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30   winShmMap     0
19ee0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
19ef0 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
19f00 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  ne winShmBarrier
19f10 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
19f20 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
19f30 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
19f40 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
19f50 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
19f60 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
19f70 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
19f80 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
19f90 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
19fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19fb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
19fc0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
19fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19fe0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a030 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
1a040 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
1a050 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
1a060 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
1a070 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
1a080 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
1a090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1a0a0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1a0b0 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
1a0c0 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20   = {.  2,       
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1a0f0 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
1a100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a110 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1a120 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
1a150 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
1a180 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
1a1b0 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
1a1e0 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
1a210 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1a240 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1a270 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
1a280 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
1a290 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1a2a0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
1a2b0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2d0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
1a2e0 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
1a2f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a300 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1a310 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
1a320 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a330 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
1a340 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a350 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
1a360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a370 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
1a380 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
1a390 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1a3a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
1a3b0 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
1a3c0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
1a3d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1a3e0 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
1a3f0 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20  hmUnmap         
1a400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a410 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a  ShmUnmap */.};..
1a420 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1a430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
1a490 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
1a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1a4c0 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
1a4d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
1a4e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
1a4f0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
1a500 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
1a510 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ect..*/../*.** C
1a520 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
1a530 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
1a540 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
1a550 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
1a560 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
1a570 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
1a580 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1a590 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
1a5a0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1a5b0 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
1a5c0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
1a5d0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
1a5e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1a5f0 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38  oid *convertUtf8
1a600 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
1a610 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1a620 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1a630 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  ted = 0;.  if( i
1a640 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
1a650 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f  nverted = utf8To
1a660 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
1a670 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
1a680 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1a690 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1a6a0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
1a6b0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1a6c0 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61  _to_mbcs(zFilena
1a6d0 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
1a6e0 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
1a6f0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
1a700 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
1a710 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
1a720 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1a730 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
1a740 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
1a750 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
1a760 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
1a770 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68   at pVfs->mxPath
1a780 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e  name characters.
1a790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1a7a0 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
1a7b0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1a7c0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
1a7d0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
1a7e0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
1a7f0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
1a800 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
1a810 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
1a820 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
1a830 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
1a840 69 6e 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20  int nTempPath;. 
1a850 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
1a860 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20  MAX_PATH+2];..  
1a870 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
1a880 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
1a890 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
1a8a0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
1a8b0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
1a8c0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
1a8d0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
1a8e0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
1a8f0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
1a900 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
1a910 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
1a920 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1a930 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
1a940 0a 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70  ..  memset(zTemp
1a950 50 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54  Path, 0, MAX_PAT
1a960 48 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  H+2);..  if( sql
1a970 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
1a980 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
1a990 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1a9a0 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
1a9b0 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
1a9c0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
1a9d0 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49  );.  }.#if !SQLI
1a9e0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c  TE_OS_WINRT.  el
1a9f0 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
1aa00 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
1aa10 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
1aa20 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
1aa30 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
1aa40 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30  athW(MAX_PATH-30
1aa50 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  , zWidePath);.  
1aa60 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f    zMulti = unico
1aa70 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
1aa80 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
1aa90 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
1aaa0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1aab0 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
1aac0 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
1aad0 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
1aae0 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
1aaf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ab00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ab10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1ab20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1ab30 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1ab40 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
1ab50 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
1ab60 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b   char zMbcsPath[
1ab70 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f  MAX_PATH];.    o
1ab80 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41  sGetTempPathA(MA
1ab90 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73  X_PATH-30, zMbcs
1aba0 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38  Path);.    zUtf8
1abb0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
1abc0 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
1abd0 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
1abe0 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
1abf0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1ac00 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
1ac10 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
1ac20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
1ac30 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
1ac40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ac50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ac60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1ac70 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1ac80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
1ac90 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
1aca0 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
1acb0 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
1acc0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
1acd0 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
1ace0 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
1acf0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
1ad00 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50 61 74 68    */.  nTempPath
1ad10 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1ad20 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 0a 0a  30(zTempPath);..
1ad30 20 20 69 66 28 20 28 6e 54 65 6d 70 50 61 74 68    if( (nTempPath
1ad40 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
1ad50 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
1ad60 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38  ILE_PREFIX) + 18
1ad70 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20  ) >= nBuf ){.   
1ad80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1ad90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  RROR;.  }..  for
1ada0 28 69 3d 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e  (i=nTempPath; i>
1adb0 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
1adc0 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
1add0 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
1ade0 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
1adf0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
1ae00 38 2c 20 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50  8, zBuf, (nTempP
1ae10 61 74 68 20 3e 20 30 29 20 3f 0a 20 20 20 20 20  ath > 0) ?.     
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54    "%s\\"SQLITE_T
1ae40 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 20  EMP_FILE_PREFIX 
1ae50 3a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  : SQLITE_TEMP_FI
1ae60 4c 45 5f 50 52 45 46 49 58 2c 0a 20 20 20 20 20  LE_PREFIX,.     
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1ae80 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
1ae90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1aea0 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
1aeb0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
1aec0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
1aed0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
1aee0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
1aef0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
1af00 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
1af10 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
1af20 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
1af30 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
1af40 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
1af50 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1af60 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45  (("TEMP FILENAME
1af70 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  : %s\n", zBuf));
1af80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1af90 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  _OK; .}../*.** R
1afa0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1afb0 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
1afc0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
1afd0 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
1afe0 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
1aff0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1b000 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
1b010 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
1b020 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
1b030 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
1b040 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1b050 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
1b060 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
1b070 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
1b080 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
1b090 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
1b0a0 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69  tErrno;..  if( i
1b0b0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
1b0c0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
1b0d0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
1b0e0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
1b0f0 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
1b100 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
1b110 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
1b120 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
1b130 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1b140 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
1b150 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
1b180 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
1b190 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
1b1c0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1b1d0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
1b1e0 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
1b1f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1b200 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
1b210 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
1b220 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
1b230 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1b240 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1b250 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
1b260 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
1b270 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1b280 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
1b290 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
1b2a0 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
1b2b0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1b2c0 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
1b2d0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
1b2e0 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
1b2f0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1b300 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b310 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
1b320 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1b330 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
1b340 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1b350 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
1b360 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b370 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
1b380 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b390 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
1b3a0 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
1b3b0 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
1b3c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
1b3f0 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
1b400 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
1b410 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
1b420 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
1b430 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
1b440 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
1b450 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
1b460 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
1b470 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
1b480 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
1b490 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
1b4a0 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
1b4b0 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
1b4c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1b4d0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
1b4e0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
1b4f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
1b500 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
1b510 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
1b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b530 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
1b540 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
1b550 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
1b560 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
1b570 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
1b580 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
1b590 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
1b5a0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
1b5b0 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
1b5c0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
1b5d0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
1b5e0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
1b5f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
1b600 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
1b610 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1b620 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
1b630 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
1b640 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20 20 20 20  AX_PATH+2];     
1b650 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
1b660 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69  o create temp fi
1b670 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74  lename */..  int
1b680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b6a0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
1b6b0 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ode */.#if !defi
1b6c0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53  ned(NDEBUG) || S
1b6d0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1b6e0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
1b6f0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
1b700 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
1b710 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  to open */.#endi
1b720 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  f..  int isExclu
1b730 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
1b740 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1b750 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
1b760 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
1b770 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1b780 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1b790 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
1b7a0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1b7b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1b7c0 41 54 45 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ATE);.#ifndef ND
1b7d0 45 42 55 47 0a 20 20 69 6e 74 20 69 73 52 65 61  EBUG.  int isRea
1b7e0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
1b7f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
1b800 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  EADONLY);.#endif
1b810 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
1b820 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
1b830 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1b840 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
1b850 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
1b860 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
1b870 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
1b880 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
1b890 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1b8a0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
1b8b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1b8c0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
1b8d0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1b8e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
1b8f0 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   ));.#endif..  /
1b900 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
1b910 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
1b920 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
1b930 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
1b940 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
1b950 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
1b960 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
1b970 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
1b980 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
1b990 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
1b9a0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
1b9b0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
1b9c0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
1b9d0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
1b9e0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1b9f0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1ba00 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
1ba10 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
1ba20 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
1ba30 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
1ba40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
1ba50 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
1ba60 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
1ba70 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
1ba80 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
1ba90 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
1baa0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
1bab0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
1bac0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
1bad0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
1bae0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
1baf0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1bb00 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
1bb10 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
1bb20 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
1bb30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
1bb40 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
1bb50 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
1bb60 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
1bb70 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
1bb80 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
1bb90 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1bba0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1bbb0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1bbc0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
1bbd0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1bbe0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1bbf0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1bc00 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
1bc10 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1bc20 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1bc30 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1bc40 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1bc50 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
1bc60 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1bc70 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1bc80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1bc90 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1bca0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
1bcb0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
1bcc0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
1bcd0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
1bce0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
1bcf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1bd00 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
1bd10 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1bd20 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
1bd30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1bd40 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1bd50 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1bd60 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1bd70 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1bd80 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1bd90 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
1bda0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1bdb0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1bdc0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1bdd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1bde0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
1bdf0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1be00 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
1be10 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
1be20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1be30 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 23 69 66  ETER(pVfs);..#if
1be40 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1be50 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f  .  if( !sqlite3_
1be60 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
1be70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
1be80 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
1be90 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
1bea0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
1beb0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
1bec0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
1bed0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
1bee0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
1bef0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1bf00 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E;..  /* If the 
1bf10 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1bf20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1bf30 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61   is NULL, genera
1bf40 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  te a .  ** tempo
1bf50 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
1bf60 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66  o use .  */.  if
1bf70 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
1bf80 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
1bf90 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
1bfa0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d  urnal);.    rc =
1bfb0 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58   getTempname(MAX
1bfc0 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d  _PATH+2, zTmpnam
1bfd0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1bfe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bff0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c000 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
1c010 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
1c020 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
1c030 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
1c040 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
1c050 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
1c060 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
1c070 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
1c080 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
1c090 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
1c0a0 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
1c0b0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1c0c0 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
1c0d0 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
1c0e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1c0f0 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
1c100 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
1c110 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e  |.        zUtf8N
1c120 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38  ame[strlen(zUtf8
1c130 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
1c140 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
1c150 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65   filename to the
1c160 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67   system encoding
1c170 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65  . */.  zConverte
1c180 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1c190 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
1c1a0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1c1b0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1c1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c1d0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
1c1e0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
1c1f0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
1c200 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1c210 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
1c220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
1c230 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d  TOPEN_ISDIR;.  }
1c240 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
1c250 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
1c260 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
1c270 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
1c280 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
1c290 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
1c2a0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
1c2b0 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
1c2c0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
1c2d0 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
1c2e0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1c2f0 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  t a new file is 
1c300 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53  .  ** created. S
1c310 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73  QLite doesn't us
1c320 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65  e it to indicate
1c330 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65   "exclusive acce
1c340 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20  ss" .  ** as it 
1c350 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
1c360 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
1c370 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
1c380 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
1c390 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
1c3a0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
1c3b0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
1c3c0 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
1c3d0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
1c3e0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
1c3f0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1c400 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
1c410 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
1c420 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
1c430 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
1c440 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
1c450 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
1c460 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
1c470 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
1c480 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
1c490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1c4a0 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
1c4b0 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
1c4c0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1c4d0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
1c4e0 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
1c4f0 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
1c500 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
1c510 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
1c520 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
1c530 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
1c540 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1c550 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1c560 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1c570 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
1c580 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
1c590 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
1c5a0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1c5b0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1c5c0 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
1c5f0 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
1c600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
1c630 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
1c640 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1c650 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1c660 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
1c670 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
1c680 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
1c690 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
1c6a0 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
1c6b0 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
1c6c0 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
1c6d0 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
1c6e0 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
1c6f0 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
1c700 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
1c710 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
1c720 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
1c730 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1c740 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
1c750 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ..  if( isNT() )
1c760 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1c770 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
1c780 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
1c790 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
1c7a0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
1c7b0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1c7c0 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
1c7d0 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
1c7e0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
1c7f0 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
1c800 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
1c810 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
1c820 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
1c830 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1c840 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
1c850 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
1c860 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1c870 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
1c880 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1c890 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
1c8a0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
1c8b0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
1c8c0 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
1c8d0 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
1c8e0 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
1c8f0 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
1c900 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
1c910 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
1c920 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1c930 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
1c940 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
1c950 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
1c960 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
1c970 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
1c9a0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
1c9d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1ca00 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
1ca30 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
1ca40 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1ca50 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63     retryIoerr(&c
1ca80 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1ca90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1caa0 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
1cab0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
1cac0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
1cad0 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29  eFileW((LPCWSTR)
1cae0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
1cb10 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb30 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
1cb40 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
1cb70 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
1cb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1cba0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1cbb0 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbd0 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
1cbe0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1cbf0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
1cc20 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
1cc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc40 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
1cc50 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
1cc60 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1cc70 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1cc80 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
1cc90 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
1cca0 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
1ccb0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1cce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
1cd10 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1cd40 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
1cd70 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
1cda0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1cdb0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
1cde0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1cdf0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
1ce00 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
1ce10 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  /.    }.  }.#end
1ce20 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  if.  logIoerr(cn
1ce30 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  t);..  OSTRACE((
1ce40 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25 6c  "OPEN %d %s 0x%l
1ce50 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  x %s\n", .      
1ce60 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64       h, zName, d
1ce70 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
1ce80 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d 49  .           h==I
1ce90 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1cea0 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  LUE ? "failed" :
1ceb0 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20   "ok"));..  if( 
1cec0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
1ced0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70  E_VALUE ){.    p
1cee0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1cef0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
1cf00 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1cf10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46  ITE_CANTOPEN, pF
1cf20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
1cf30 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38  "winOpen", zUtf8
1cf40 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1cf50 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1cf60 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  ed);.    if( isR
1cf70 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
1cf80 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
1cf90 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
1cfa0 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
1cfb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1cfc0 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
1cfd0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28  PEN_READONLY)&~(
1cfe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1cff0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
1d000 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74  EADWRITE)), pOut
1d010 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
1d020 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1d030 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1d040 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
1d050 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
1d060 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
1d070 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
1d080 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
1d090 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1d0a0 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
1d0b0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
1d0c0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
1d0d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
1d0e0 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   }..  memset(pFi
1d0f0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
1d100 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
1d110 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
1d120 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
1d130 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65  ->h = h;.  pFile
1d140 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
1d150 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
1d160 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 23 69  >pVfs = pVfs;.#i
1d170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d180 54 5f 57 41 4c 0a 20 20 70 46 69 6c 65 2d 3e 70  T_WAL.  pFile->p
1d190 53 68 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Shm = 0;.#endif.
1d1a0 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
1d1b0 20 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71   zName;.  if( sq
1d1c0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
1d1d0 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
1d1e0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
1d1f0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
1d200 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1d210 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
1d220 50 53 4f 57 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  PSOW;.  }..#if S
1d230 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1d240 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1d250 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
1d260 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
1d270 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65 43        && !winceC
1d280 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
1d290 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20   pFile).  ){.   
1d2a0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1d2b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1d2c0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1d2d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d2e0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1d2f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
1d300 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
1d310 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
1d320 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
1d330 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1d340 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1d350 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1d360 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65   }..  OpenCounte
1d370 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
1d380 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
1d390 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
1d3a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
1d3b0 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
1d3c0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
1d3d0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
1d3e0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
1d3f0 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
1d400 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
1d410 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
1d420 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
1d430 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
1d440 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
1d450 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
1d460 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
1d470 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
1d480 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
1d490 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
1d4a0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
1d4b0 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
1d4c0 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
1d4d0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
1d4e0 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
1d4f0 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
1d500 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
1d510 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
1d520 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
1d530 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
1d540 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
1d550 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
1d560 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
1d570 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
1d580 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
1d590 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
1d5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d5b0 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
1d5c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1d5d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
1d5e0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
1d5f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1d600 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
1d610 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
1d620 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
1d630 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
1d640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
1d650 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
1d660 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
1d670 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
1d680 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
1d690 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
1d6a0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1d6b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1d6c0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
1d6d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73  USED_PARAMETER(s
1d6e0 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75  yncDir);..  Simu
1d6f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
1d700 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d710 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76  DELETE);.  zConv
1d720 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1d730 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
1d740 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
1d750 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1d760 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d770 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1d780 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
1d790 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53  {.    do {.#if S
1d7a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1d7b0 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f       WIN32_FILE_
1d7c0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
1d7d0 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20  AttrData;.      
1d7e0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
1d7f0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
1d800 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  trData));.      
1d810 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74  if ( osGetFileAt
1d820 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e  tributesExW(zCon
1d830 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45  verted, GetFileE
1d840 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a   &sAttrData) ){.
1d880 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
1d890 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
1d8a0 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
1d8b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d8c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1d8d0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
1d8e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1d8f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  k;.      }.#else
1d900 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
1d910 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1d920 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sW(zConverted);.
1d930 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
1d940 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
1d950 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1d960 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d970 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c  SQLITE_OK; /* Al
1d980 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
1d990 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1d9b0 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
1d9c0 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
1d9d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d9e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
1d9f0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
1da00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1da10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1da20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
1da30 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
1da40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1da50 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
1da60 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
1da70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1da80 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72 79       if ( !retry
1da90 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1daa0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
1dab0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1dac0 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
1dad0 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
1dae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1daf0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
1db00 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
1db10 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1db20 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1db30 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
1db40 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1db50 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
1db60 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
1db70 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
1db80 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
1db90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1dba0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65  LITE_OK; /* Alre
1dbb0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
1dbc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dbd0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
1dbe0 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
1dbf0 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
1dc00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dc10 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
1dc20 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
1dc30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dc40 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
1dc50 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
1dc60 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
1dc70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dc80 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
1dc90 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
1dca0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1dcb0 20 20 20 69 66 20 28 20 21 72 65 74 72 79 49 6f     if ( !retryIo
1dcc0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1dcd0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1dce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1dcf0 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
1dd00 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
1dd10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1dd20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
1dd30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
1dd40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20  f( rc ){.    rc 
1dd50 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1dd60 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1dd70 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  E, lastErrno,.  
1dd80 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44             "winD
1dd90 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
1dda0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1ddb0 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
1ddc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1ddd0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1dde0 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
1ddf0 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c  TE \"%s\" %s\n",
1de00 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20   zFilename, (rc 
1de10 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
1de20 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  " )));.  return 
1de30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
1de40 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  ck the existance
1de50 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
1de60 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1de70 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
1de80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1de90 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
1dea0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
1deb0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
1dec0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1ded0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1dee0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
1def0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1df00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
1df10 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
1df20 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
1df30 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
1df40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1df50 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
1df60 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
1df70 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
1df80 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1df90 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
1dfa0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
1dfb0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1dfc0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
1dfd0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1dfe0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1dff0 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ; );.  zConverte
1e000 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1e010 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
1e020 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1e030 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1e040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e050 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1e060 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1e070 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1e080 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1e090 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1e0a0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
1e0b0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
1e0c0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
1e0d0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
1e0e0 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
1e0f0 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
1e100 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1e110 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
1e140 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
1e170 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
1e180 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1e190 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72  o) ){}.    if( r
1e1a0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  c ){.      /* Fo
1e1b0 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45  r an SQLITE_ACCE
1e1c0 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c  SS_EXISTS query,
1e1d0 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65   treat a zero-le
1e1e0 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20  ngth file.      
1e1f0 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73  ** as if it does
1e200 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
1e210 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20    */.      if(  
1e220 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f    flags==SQLITE_
1e230 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20  ACCESS_EXISTS.  
1e240 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
1e250 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69  Data.nFileSizeHi
1e260 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  gh==0 .         
1e270 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
1e280 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
1e290 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
1e2a0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1e2b0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
1e2c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
1e2d0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
1e2e0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1e2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e300 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65  se{.      logIoe
1e310 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69  rr(cnt);.      i
1e320 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  f( lastErrno!=ER
1e330 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
1e340 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21  ND && lastErrno!
1e350 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
1e360 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
1e370 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1e380 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1e390 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
1e3a0 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e  nAccess", zFilen
1e3b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
1e3c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1e3d0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
1e3e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e3f0 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
1e400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e410 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
1e420 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
1e430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e440 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1e450 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1e460 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72    else{.    attr
1e470 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1e480 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
1e490 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
1e4a0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1e4b0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1e4c0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
1e4d0 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
1e4e0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
1e4f0 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  D:.    case SQLI
1e500 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1e510 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
1e520 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
1e530 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
1e540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1e550 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1e560 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
1e570 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
1e580 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1e590 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20  TES &&.         
1e5a0 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45      (attr & FILE
1e5b0 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f  _ATTRIBUTE_READO
1e5c0 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62  NLY)==0;.      b
1e5d0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1e5e0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
1e5f0 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
1e600 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
1e610 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
1e620 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e630 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
1e640 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
1e650 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
1e660 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
1e670 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74  d be used verbat
1e680 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a  im.  If.** non-z
1e690 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1e6a0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
1e6b0 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  on, the calling 
1e6c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69  function must si
1e6d0 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20  mply.** use the 
1e6e0 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61  provided path na
1e6f0 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d  me verbatim -OR-
1e700 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f   resolve it into
1e710 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d   a full path nam
1e720 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47  e.** using the G
1e730 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57  etFullPathName W
1e740 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f  in32 API functio
1e750 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  n (if available)
1e760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
1e770 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61   winIsVerbatimPa
1e780 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20  thname(.  const 
1e790 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
1e7a0 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  ){.  /*.  ** If 
1e7b0 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
1e7c0 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77  arts with a forw
1e7d0 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62  ard slash or a b
1e7e0 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20  ackslash, it is 
1e7f0 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65  either.  ** a le
1e800 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20  gal UNC name, a 
1e810 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20  volume relative 
1e820 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f  path, or an abso
1e830 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69  lute path name i
1e840 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78  n the.  ** "Unix
1e850 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64  " format on Wind
1e860 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ows.  There is n
1e870 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69  o easy way to di
1e880 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77  fferentiate betw
1e890 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  een.  ** the fin
1e8a0 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68  al two cases; th
1e8b0 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75  erefore, we retu
1e8c0 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74  rn the safer ret
1e8d0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55  urn value of TRU
1e8e0 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63  E.  ** so that c
1e8f0 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
1e900 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d  unction will sim
1e910 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61  ply use it verba
1e920 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  tim..  */.  if (
1e930 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27   zPathname[0]=='
1e940 2f 27 20 7c 7c 20 7a 50 61 74 68 6e 61 6d 65 5b  /' || zPathname[
1e950 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20  0]=='\\' ){.    
1e960 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
1e970 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
1e980 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
1e990 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
1e9a0 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
1e9b0 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
1e9c0 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
1e9d0 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
1e9e0 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
1e9f0 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
1ea00 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
1ea10 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
1ea20 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
1ea30 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
1ea40 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
1ea50 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
1ea60 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
1ea70 20 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69    */.  if ( sqli
1ea80 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68  te3Isalpha(zPath
1ea90 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74  name[0]) && zPat
1eaa0 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 7b  hname[1]==':' ){
1eab0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
1eac0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
1ead0 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68   If we get to th
1eae0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61  is point, the pa
1eaf0 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61  th name should a
1eb00 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20  lmost certainly 
1eb10 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a  be a purely.  **
1eb20 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69   relative one (i
1eb30 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61  .e. not a UNC na
1eb40 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65  me, not absolute
1eb50 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65  , and not volume
1eb60 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f   relative)..  */
1eb70 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
1eb80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
1eb90 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
1eba0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
1ebb0 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20  athname.  Write 
1ebc0 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68  the full.** path
1ebd0 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d  name into zOut[]
1ebe0 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62  .  zOut[] will b
1ebf0 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d  e at least pVfs-
1ec00 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62  >mxPathname.** b
1ec10 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
1ec20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
1ec30 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
1ec40 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1ec50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ec60 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
1ec70 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
1ec80 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
1ec90 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  ,        /* Poss
1eca0 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
1ecb0 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
1ecc0 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20  t nFull,        
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ece0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
1ecf0 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
1ed00 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20  .  char *zFull  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
1ed30 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64  r */.){.  .#if d
1ed40 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
1ed50 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
1ed60 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1ed70 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
1ed80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ed90 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74  nFull);.  assert
1eda0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
1edb0 6d 65 3e 3d 4d 41 58 5f 50 41 54 48 20 29 3b 0a  me>=MAX_PATH );.
1edc0 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e    assert( nFull>
1edd0 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  =pVfs->mxPathnam
1ede0 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  e );.  if ( sqli
1edf0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
1ee00 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
1ee10 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
1ee20 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
1ee30 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
1ee40 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
1ee50 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
1ee60 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
1ee70 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
1ee80 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
1ee90 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
1eea0 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
1eeb0 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
1eec0 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
1eed0 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
1eee0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
1eef0 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
1ef00 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
1ef10 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
1ef20 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
1ef30 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a  d a slash..    *
1ef40 2f 0a 20 20 20 20 63 68 61 72 20 7a 4f 75 74 5b  /.    char zOut[
1ef50 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20  MAX_PATH+1];.   
1ef60 20 6d 65 6d 73 65 74 28 7a 4f 75 74 2c 20 30 2c   memset(zOut, 0,
1ef70 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20 20   MAX_PATH+1);.  
1ef80 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f    cygwin_conv_to
1ef90 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c  _win32_path(zRel
1efa0 61 74 69 76 65 2c 20 7a 4f 75 74 29 3b 20 2f 2a  ative, zOut); /*
1efb0 20 50 4f 53 49 58 20 74 6f 20 57 69 6e 33 32 20   POSIX to Win32 
1efc0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
1efd0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
1efe0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
1eff0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
1f000 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  \\%s",.         
1f010 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f020 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
1f030 72 79 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c  ry, zOut);.  }el
1f040 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se{.    /*.    *
1f050 2a 20 4e 4f 54 45 3a 20 54 68 65 20 43 79 67 77  * NOTE: The Cygw
1f060 69 6e 20 64 6f 63 73 20 73 74 61 74 65 20 74 68  in docs state th
1f070 61 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c  at the maximum l
1f080 65 6e 67 74 68 20 6e 65 65 64 65 64 0a 20 20 20  ength needed.   
1f090 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 74 68   **       for th
1f0a0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
1f0b0 74 6f 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74  to cygwin_conv_t
1f0c0 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74  o_full_win32_pat
1f0d0 68 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69  h.    **       i
1f0e0 73 20 4d 41 58 5f 50 41 54 48 2e 0a 20 20 20 20  s MAX_PATH..    
1f0f0 2a 2f 0a 20 20 20 20 63 79 67 77 69 6e 5f 63 6f  */.    cygwin_co
1f100 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32  nv_to_full_win32
1f110 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c  _path(zRelative,
1f120 20 7a 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72   zFull);.  }.  r
1f130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f140 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51  .#endif..#if (SQ
1f150 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1f160 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1f170 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
1f180 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
1f190 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1f1a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1f1b0 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68   );.  /* WinCE h
1f1c0 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
1f1d0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1f1e0 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
1f1f0 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57   told. */.  /* W
1f200 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20  inRT has no way 
1f210 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c  to convert a rel
1f220 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e  ative path to an
1f230 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a   absolute one. *
1f240 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  /.  if ( sqlite3
1f250 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
1f260 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
1f270 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
1f280 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
1f290 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
1f2a0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
1f2b0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
1f2c0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1f2d0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
1f2e0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
1f2f0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
1f300 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
1f310 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
1f320 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
1f330 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
1f340 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
1f350 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
1f360 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
1f370 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
1f380 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
1f390 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
1f3a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
1f3b0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
1f3c0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
1f3d0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
1f3e0 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  \\%s",.         
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f400 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
1f410 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ry, zRelative);.
1f420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1f430 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1f440 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1f450 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1f460 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
1f470 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ve);.  }.  retur
1f480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
1f490 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
1f4a0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
1f4b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
1f4c0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
1f4d0 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42  IN__).  DWORD nB
1f4e0 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  yte;.  void *zCo
1f4f0 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20  nverted;.  char 
1f500 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  *zOut;..  /* If 
1f510 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62  this path name b
1f520 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22  egins with "/X:"
1f530 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61  , where "X" is a
1f540 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20  ny alphabetic.  
1f550 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69  ** character, di
1f560 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61  scard the initia
1f570 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70  l "/" from the p
1f580 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  athname..  */.  
1f590 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d  if( zRelative[0]
1f5a0 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33  =='/' && sqlite3
1f5b0 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76  Isalpha(zRelativ
1f5c0 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69  e[1]) && zRelati
1f5d0 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20  ve[2]==':' ){.  
1f5e0 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
1f5f0 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64   }..  /* It's od
1f600 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
1f610 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
1f620 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
1f630 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
1f640 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
1f650 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
1f660 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
1f670 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
1f680 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
1f690 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
1f6a0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
1f6b0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
1f6c0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
1f6d0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
1f6e0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
1f6f0 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
1f700 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1f710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f720 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  OR );.  if ( sql
1f730 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
1f740 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
1f750 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
1f760 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
1f770 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
1f780 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
1f790 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
1f7a0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
1f7b0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
1f7c0 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
1f7d0 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
1f7e0 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
1f7f0 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
1f800 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
1f810 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
1f820 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
1f830 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
1f840 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
1f850 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
1f860 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
1f870 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
1f880 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1f890 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
1f8a0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
1f8b0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
1f8c0 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20   "%s\\%s",.     
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
1f8f0 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76  ectory, zRelativ
1f900 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1f910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1f920 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1f930 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1f940 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
1f950 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1f960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1f980 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  M;.  }.  if( isN
1f990 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54  T() ){.    LPWST
1f9a0 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79  R zTemp;.    nBy
1f9b0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
1f9c0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
1f9d0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
1f9e0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
1f9f0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1fa00 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1fa10 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
1fa20 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fa40 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
1fa50 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  1", zConverted);
1fa60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1fa70 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1fa80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fa90 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
1faa0 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  LLPATH;.    }.  
1fab0 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
1fac0 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
1fad0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
1fae0 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
1faf0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
1fb00 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
1fb10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1fb20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
1fb30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1fb40 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1fb50 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
1fb60 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
1fb70 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1fb80 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
1fb90 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
1fba0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1fbb0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
1fbc0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65  LITE_ERROR, osGe
1fbd0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
1fc00 57 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  W2", zConverted)
1fc10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1fc20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1fc30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1fc40 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
1fc50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fc60 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
1fc70 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  TH;.    }.    sq
1fc80 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1fc90 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
1fca0 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
1fcb0 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
1fcc0 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
1fcd0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
1fce0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1fcf0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
1fd00 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
1fd10 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
1fd20 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
1fd30 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
1fd40 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
1fd50 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1fd60 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
1fd70 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65  LITE_ERROR, osGe
1fd80 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fda0 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
1fdb0 41 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  A1", zConverted)
1fdc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1fdd0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1fde0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1fdf0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
1fe00 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20  ULLPATH;.    }. 
1fe10 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
1fe20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
1fe30 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
1fe40 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
1fe50 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1fe60 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
1fe70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1fe80 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1fe90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fea0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1feb0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
1fec0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1fed0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
1fee0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
1fef0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
1ff00 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1ff10 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ff20 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
1ff30 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ff50 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
1ff60 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  2", zConverted);
1ff70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ff80 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1ff90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ffa0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
1ffb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ffc0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
1ffd0 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  H;.    }.    sql
1ffe0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1fff0 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
20000 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
20010 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
20020 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
20030 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
20040 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
20050 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
20060 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
20070 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
20080 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
20090 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
200a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
200b0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
200c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
200d0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
200e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
200f0 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  EM;.  }.#endif.}
20100 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20110 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
20120 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
20130 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
20140 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
20150 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
20160 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
20170 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
20180 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
20190 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
201a0 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  brary..*/./*.** 
201b0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
201c0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
201d0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
201e0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
201f0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
20200 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
20210 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
20220 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
20230 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
20240 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
20250 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
20260 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
20270 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
20280 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
20290 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
202a0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
202b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
202c0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66  ETER(pVfs);.  if
202d0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
202e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
202f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
20300 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
20310 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d  OS_WINRT.    h =
20320 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
20330 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29  ibrary((LPCWSTR)
20340 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a  zConverted, 0);.
20350 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73  #else.    h = os
20360 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50  LoadLibraryW((LP
20370 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
20380 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
20390 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
203a0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
203b0 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  e{.    h = osLoa
203c0 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a  dLibraryA((char*
203d0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
203e0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
203f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
20400 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  ed);.  return (v
20410 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63  oid*)h;.}.static
20420 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72   void winDlError
20430 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
20440 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
20450 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
20460 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20470 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73  (pVfs);.  getLas
20480 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
20490 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
204a0 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74  , zBufOut);.}.st
204b0 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44  atic void (*winD
204c0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
204d0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
204e0 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  andle, const cha
204f0 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69  r *zSymbol))(voi
20500 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
20510 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
20520 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
20530 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41  void))osGetProcA
20540 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
20550 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c  pHandle, zSymbol
20560 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
20570 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69   winDlClose(sqli
20580 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
20590 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
205a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
205b0 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65  R(pVfs);.  osFre
205c0 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
205d0 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
205e0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
205f0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
20600 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
20610 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
20620 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
20630 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
20640 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
20650 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
20660 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
20670 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
20680 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
20690 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
206a0 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
206b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
206c0 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
206d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
206e0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
206f0 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
20700 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20710 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64  TER(pVfs);.#if d
20720 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
20730 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a  ST).  n = nBuf;.
20740 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
20750 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  , nBuf);.#else. 
20760 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54   if( sizeof(SYST
20770 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20  EMTIME)<=nBuf-n 
20780 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d  ){.    SYSTEMTIM
20790 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79  E x;.    osGetSy
207a0 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
207b0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
207c0 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  ], &x, sizeof(x)
207d0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
207e0 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  of(x);.  }.  if(
207f0 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
20800 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
20810 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43  ORD pid = osGetC
20820 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20830 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
20840 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69  Buf[n], &pid, si
20850 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
20860 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29  n += sizeof(pid)
20870 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
20880 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
20890 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47  sizeof(ULONGLONG
208a0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
208b0 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d   ULONGLONG cnt =
208c0 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
208d0 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  4();.    memcpy(
208e0 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
208f0 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
20900 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
20910 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  t);.  }.#else.  
20920 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
20930 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
20940 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47   DWORD cnt = osG
20950 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20  etTickCount();. 
20960 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
20970 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
20980 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
20990 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
209a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
209b0 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45  izeof(LARGE_INTE
209c0 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  GER)<=nBuf-n ){.
209d0 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
209e0 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79  R i;.    osQuery
209f0 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
20a00 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63  er(&i);.    memc
20a10 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c  py(&zBuf[n], &i,
20a20 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20   sizeof(i));.   
20a30 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b   n += sizeof(i);
20a40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
20a50 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
20a60 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
20a70 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
20a80 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
20a90 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
20aa0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
20ab0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
20ac0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
20ad0 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33  osec){.  sqlite3
20ae0 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69  _win32_sleep((mi
20af0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
20b00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
20b10 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
20b20 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63  eturn ((microsec
20b30 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30  +999)/1000)*1000
20b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
20b50 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
20b60 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
20b70 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
20b80 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
20b90 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
20ba0 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
20bb0 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
20bc0 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
20bd0 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
20be0 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
20bf0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
20c00 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
20c10 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
20c20 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
20c30 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
20c40 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
20c50 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
20c60 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
20c70 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
20c80 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
20c90 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
20ca0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
20cb0 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
20cc0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
20cd0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
20ce0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
20cf0 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
20d00 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
20d10 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
20d20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
20d30 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
20d40 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
20d50 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
20d60 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
20d70 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
20d80 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
20d90 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
20da0 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
20db0 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
20dc0 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
20dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
20de0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
20df0 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65  RROR if the time
20e00 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61   and date .** ca
20e10 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
20e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20e30 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
20e40 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
20e50 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  fs, sqlite3_int6
20e60 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20  4 *piNow){.  /* 
20e70 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
20e80 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
20e90 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
20ea0 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
20eb0 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
20ec0 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
20ed0 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
20ee0 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
20ef0 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46  13.5). .  */.  F
20f00 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74  ILETIME ft;.  st
20f10 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
20f20 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65  e3_int64 winFile
20f30 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35  timeEpoch = 2305
20f40 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  8135*(sqlite3_in
20f50 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
20f60 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
20f70 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
20f80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
20f90 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
20fa0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
20fb0 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66  )8640000;.#endif
20fc0 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20  .  /* 2^32 - to 
20fd0 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20  avoid use of LL 
20fe0 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20  and warnings in 
20ff0 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  gcc */.  static 
21000 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
21010 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75  t64 max32BitValu
21020 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69  e = .      (sqli
21030 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
21040 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
21050 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
21060 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   + (sqlite3_int6
21070 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69  4)294967296;..#i
21080 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
21090 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
210a0 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74  ime;.  osGetSyst
210b0 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
210c0 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d   /* if SystemTim
210d0 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61  eToFileTime() fa
210e0 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ils, it returns 
210f0 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21  zero. */.  if (!
21100 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
21110 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
21120 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  )){.    return S
21130 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
21140 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
21150 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
21160 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
21170 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69  f..  *piNow = wi
21180 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b  nFiletimeEpoch +
21190 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28  .            (((
211a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
211b0 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
211c0 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29  )*max32BitValue)
211d0 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
211e0 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
211f0 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
21200 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
21210 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
21220 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21230 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
21240 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
21250 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
21260 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
21270 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
21280 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
21290 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
212a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
212b0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
212c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
212d0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
212e0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
212f0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
21300 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
21310 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
21320 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
21330 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
21340 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
21350 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
21360 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
21370 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
21380 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
21390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
213a0 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
213b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
213c0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
213d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
213e0 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
213f0 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
21400 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
21410 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
21420 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
21430 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
21440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21450 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
21460 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
21470 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
21480 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
21490 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
214a0 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
214b0 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
214c0 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
214d0 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
214e0 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
214f0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
21500 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
21510 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
21520 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
21530 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
21540 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
21550 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
21560 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
21570 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
21580 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
21590 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
215a0 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
215b0 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
215c0 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
215d0 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
215e0 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
215f0 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
21600 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
21610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
21620 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
21630 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
21640 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
21650 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
21660 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
21670 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
21680 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
21690 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
216a0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
216b0 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
216c0 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
216d0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
216e0 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
216f0 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
21700 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
21710 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
21720 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
21730 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
21740 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
21750 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
21760 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
21770 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
21780 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
21790 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
217a0 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
217b0 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
217c0 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
217d0 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
217e0 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
217f0 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
21800 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
21810 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
21820 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
21830 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
21840 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
21850 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
21860 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
21870 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
21880 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
21890 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
218a0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
218b0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
218c0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
218d0 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
218e0 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
218f0 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
21900 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
21910 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
21920 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
21930 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
21940 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
21950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
21960 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
21970 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
21980 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
21990 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
219a0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
219b0 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61  ;.  return getLa
219c0 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
219d0 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
219e0 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
219f0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
21a00 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
21a10 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
21a20 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
21a30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
21a40 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
21a50 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
21a60 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
21a70 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
21a80 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
21a90 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
21aa0 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
21ab0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
21ac0 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20   MAX_PATH,      
21ad0 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
21ae0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b00 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
21b10 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20  "win32",        
21b20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
21b30 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
21b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
21b50 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
21b60 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
21b70 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
21b80 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
21b90 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
21ba0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
21bb0 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
21bc0 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
21bd0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
21be0 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
21bf0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
21c00 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
21c10 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
21c20 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
21c30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
21c40 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
21c50 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
21c60 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
21c70 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
21c80 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
21c90 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
21ca0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
21cb0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
21cc0 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
21cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
21ce0 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
21cf0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
21d00 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
21d10 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
21d20 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
21d30 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
21d40 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
21d50 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
21d60 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
21d70 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
21d80 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
21d90 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
21da0 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
21db0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
21dc0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
21dd0 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
21de0 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
21df0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
21e00 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68  ..  /* Double-ch
21e10 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79  eck that the aSy
21e20 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61  scall[] array ha
21e30 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  s been construct
21e40 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  ed.  ** correctl
21e50 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b  y.  See ticket [
21e60 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61  bb3a86e890c8e96a
21e70 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  b] */.  assert( 
21e80 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
21e90 6c 6c 29 3d 3d 37 34 20 29 3b 0a 0a 23 69 66 6e  ll)==74 );..#ifn
21ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21eb0 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d  WAL.  /* get mem
21ec0 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69  ory map allocati
21ed0 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a  on granularity *
21ee0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53  /.  memset(&winS
21ef0 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ysInfo, 0, sizeo
21f00 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b  f(SYSTEM_INFO));
21f10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
21f20 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69  INRT.  osGetNati
21f30 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  veSystemInfo(&wi
21f40 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65  nSysInfo);.#else
21f50 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  .  osGetSystemIn
21f60 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
21f70 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
21f80 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c  (winSysInfo.dwAl
21f90 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
21fa0 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69 66  ity > 0);.#endif
21fb0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
21fc0 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73  register(&winVfs
21fd0 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 1);.  return S
21fe0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e  QLITE_OK; .}..in
21ff0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
22000 28 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c  (void){ .#if SQL
22010 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
22020 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  f( sleepObj!=NUL
22030 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  L ){.    osClose
22040 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29  Handle(sleepObj)
22050 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  ;.    sleepObj =
22060 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69   NULL;.  }.#endi
22070 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
22080 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
22090 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
220a0 20 2a 2f 0a                                       */.