/ Hex Artifact Content
Login

Artifact 3fca1bfdf78338705bf536059a407d0fb04016d5:


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 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f  /*.** Are most o
03e0: 66 20 74 68 65 20 57 69 6e 33 32 20 41 4e 53 49  f the Win32 ANSI
03f0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
0400: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
0410: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
0430: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0450: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
0460: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
0470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
0480: 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 20 20 64 65  2_NO_ANSI).#  de
0490: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
04a0: 32 5f 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69  2_HAS_ANSI.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73  f../*.** Are mos
04c0: 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 55  t of the Win32 U
04d0: 6e 69 63 6f 64 65 20 41 50 49 73 20 61 76 61 69  nicode APIs avai
04e0: 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68  lable (i.e. with
04f0: 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74 69   certain excepti
0500: 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ons.** based on 
0510: 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  the sub-platform
0520: 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  )?.*/.#if (SQLIT
0530: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
0540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
0550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
0560: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
0570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0580: 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 20 64 65 66  _NO_WIDE).#  def
0590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
05a0: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
05c0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  e at least one s
05d0: 65 74 20 6f 66 20 57 69 6e 33 32 20 41 50 49 73  et of Win32 APIs
05e0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
05f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0610: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
0620: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
0630: 41 53 5f 57 49 44 45 29 0a 23 20 20 65 72 72 6f  AS_WIDE).#  erro
0640: 72 20 22 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  r "At least one 
0650: 6f 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  of SQLITE_WIN32_
0660: 48 41 53 5f 41 4e 53 49 20 61 6e 64 20 53 51 4c  HAS_ANSI and SQL
0670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0680: 44 45 5c 0a 20 6d 75 73 74 20 62 65 20 64 65 66  DE\. must be def
0690: 69 6e 65 64 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f  ined.".#endif../
06a0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
06b0: 72 65 71 75 69 72 65 64 20 57 69 6e 64 6f 77 73  required Windows
06c0: 20 53 44 4b 20 76 65 72 73 69 6f 6e 20 63 6f 6e   SDK version con
06d0: 73 74 61 6e 74 73 20 69 66 20 74 68 65 79 20 61  stants if they a
06e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  re not.** alread
06f0: 79 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  y available..*/.
0700: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0710: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
0720: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0740: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f  ..#ifndef NTDDI_
0760: 57 49 4e 42 4c 55 45 0a 23 20 20 64 65 66 69 6e  WINBLUE.#  defin
0770: 65 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 20  e NTDDI_WINBLUE 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 30 78 30 36 30 33 30 30 30 30 0a 23      0x06030000.#
07a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
07b0: 63 6b 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ck if the GetVer
07c0: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
07d0: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 63  ions should be c
07e0: 6f 6e 73 69 64 65 72 65 64 20 64 65 70 72 65 63  onsidered deprec
07f0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 76 6f 69  ated.** and avoi
0800: 64 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  d using them in 
0810: 74 68 61 74 20 63 61 73 65 2e 20 20 49 74 20 73  that case.  It s
0820: 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 68  hould be noted h
0830: 65 72 65 20 74 68 61 74 20 69 66 20 74 68 65 0a  ere that if the.
0840: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
0850: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0860: 56 45 52 53 49 4f 4e 45 58 20 70 72 65 2d 70 72  VERSIONEX pre-pr
0870: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 69 73  ocessor macro is
0880: 20 7a 65 72 6f 0a 2a 2a 20 28 77 68 65 74 68 65   zero.** (whethe
0890: 72 20 76 69 61 20 74 68 69 73 20 62 6c 6f 63 6b  r via this block
08a0: 20 6f 72 20 76 69 61 20 62 65 69 6e 67 20 6d 61   or via being ma
08b0: 6e 75 61 6c 6c 79 20 73 70 65 63 69 66 69 65 64  nually specified
08c0: 29 2c 20 74 68 61 74 20 69 6d 70 6c 69 65 73 0a  ), that implies.
08d0: 2a 2a 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ** the underlyin
08e0: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
08f0: 65 6d 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  em will always b
0900: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 57  e based on the W
0910: 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a 20 4b 65 72  indows NT.** Ker
0920: 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  nel..*/.#ifndef 
0930: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0940: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0950: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0960: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0970: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0980: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
0990: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09a0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09b0: 20 30 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   0.#  else.#    
09c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
09d0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
09e0: 20 20 20 31 0a 23 20 20 65 6e 64 69 66 0a 23 65     1.#  endif.#e
09f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0a00: 20 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64   constant should
0a10: 20 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69   already be defi
0a20: 6e 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e  ned (in the "Win
0a30: 44 65 66 2e 68 22 20 53 44 4b 20 66 69 6c 65 29  Def.h" SDK file)
0a40: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  ..*/.#ifndef MAX
0a50: 5f 50 41 54 48 0a 23 20 20 64 65 66 69 6e 65 20  _PATH.#  define 
0a60: 4d 41 58 5f 50 41 54 48 20 20 20 20 20 20 20 20  MAX_PATH        
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 32                (2
0a80: 36 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  60).#endif../*.*
0a90: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0aa0: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0ab0: 61 72 73 29 20 66 6f 72 20 57 69 6e 33 32 2e 20  ars) for Win32. 
0ac0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0ad0: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f  mally be.** MAX_
0ae0: 50 41 54 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  PATH..*/.#ifndef
0af0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0b00: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0b10: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0b20: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
0b30: 52 53 20 20 20 28 4d 41 58 5f 50 41 54 48 29 0a  RS   (MAX_PATH).
0b40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0b50: 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75  is constant shou
0b60: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 64 65  ld already be de
0b70: 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20 22 57  fined (in the "W
0b80: 69 6e 4e 54 2e 68 22 20 53 44 4b 20 66 69 6c 65  inNT.h" SDK file
0b90: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e  )..*/.#ifndef UN
0ba0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bb0: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0bc0: 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f   UNICODE_STRING_
0bd0: 4d 41 58 5f 43 48 41 52 53 20 20 20 20 20 20 28  MAX_CHARS      (
0be0: 33 32 37 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f  32767).#endif../
0bf0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0c00: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0c10: 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e   chars) for WinN
0c20: 54 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  T.  This should 
0c30: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55  normally be.** U
0c40: 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41  NICODE_STRING_MA
0c50: 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e  X_CHARS..*/.#ifn
0c60: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  def SQLITE_WINNT
0c70: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 0a  _MAX_PATH_CHARS.
0c80: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0c90: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0ca0: 43 48 41 52 53 20 20 20 28 55 4e 49 43 4f 44 45  CHARS   (UNICODE
0cb0: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0cc0: 53 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  S).#endif../*.**
0cd0: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0ce0: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0cf0: 65 73 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20  es) for Win32.  
0d00: 54 68 65 20 4d 41 58 5f 50 41 54 48 20 6d 61 63  The MAX_PATH mac
0d10: 72 6f 20 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72  ro is in.** char
0d20: 61 63 74 65 72 73 2c 20 73 6f 20 77 65 20 61 6c  acters, so we al
0d30: 6c 6f 63 61 74 65 20 34 20 62 79 74 65 73 20 70  locate 4 bytes p
0d40: 65 72 20 63 68 61 72 61 63 74 65 72 20 61 73 73  er character ass
0d50: 75 6d 69 6e 67 20 77 6f 72 73 74 2d 63 61 73 65  uming worst-case
0d60: 20 6f 66 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70   of.** 4-bytes-p
0d70: 65 72 2d 63 68 61 72 61 63 74 65 72 20 66 6f 72  er-character for
0d80: 20 55 54 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65   UTF8..*/.#ifnde
0d90: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
0da0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20  AX_PATH_BYTES.# 
0db0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0dc0: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
0dd0: 54 45 53 20 20 20 28 53 51 4c 49 54 45 5f 57 49  TES   (SQLITE_WI
0de0: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
0df0: 52 53 2a 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RS*4).#endif../*
0e00: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
0e10: 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
0e20: 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 4e 54  bytes) for WinNT
0e30: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
0e40: 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e  ormally be.** UN
0e50: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0e60: 5f 43 48 41 52 53 20 2a 20 73 69 7a 65 6f 66 28  _CHARS * sizeof(
0e70: 57 43 48 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64  WCHAR)..*/.#ifnd
0e80: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ef SQLITE_WINNT_
0e90: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a 23  MAX_PATH_BYTES.#
0ea0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0eb0: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
0ec0: 59 54 45 53 20 20 20 5c 0a 20 20 20 20 20 20 20  YTES   \.       
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 28 73 69 7a 65 6f 66 28 57 43 48       (sizeof(WCH
0ef0: 41 52 29 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e  AR) * SQLITE_WIN
0f00: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  NT_MAX_PATH_CHAR
0f10: 53 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  S).#endif../*.**
0f20: 20 4d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d   Maximum error m
0f30: 65 73 73 61 67 65 20 6c 65 6e 67 74 68 20 28 69  essage length (i
0f40: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0f50: 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  RT..*/.#ifndef S
0f60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0f70: 45 52 52 4d 53 47 5f 43 48 41 52 53 0a 23 20 20  ERRMSG_CHARS.#  
0f80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0f90: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
0fa0: 48 41 52 53 20 28 31 30 32 34 29 0a 23 65 6e 64  HARS (1024).#end
0fb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
0fc0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
0fd0: 65 20 63 68 61 72 61 63 74 65 72 20 73 68 6f 75  e character shou
0fe0: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
0ff0: 20 61 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20   a directory.** 
1000: 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69  separator..*/.#i
1010: 66 6e 64 65 66 20 77 69 6e 49 73 44 69 72 53 65  fndef winIsDirSe
1020: 70 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 49  p.#  define winI
1030: 73 44 69 72 53 65 70 28 61 29 20 20 20 20 20 20  sDirSep(a)      
1040: 20 20 20 20 20 20 20 20 20 20 28 28 28 61 29 20            (((a) 
1050: 3d 3d 20 27 2f 27 29 20 7c 7c 20 28 28 61 29 20  == '/') || ((a) 
1060: 3d 3d 20 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66  == '\\')).#endif
1070: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1080: 72 6f 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ro is used when 
1090: 61 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  a local variable
10a0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 76 61 6c   is set to a val
10b0: 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73  ue that is.** [s
10c0: 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73  ometimes] not us
10d0: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 28  ed by the code (
10e0: 65 2e 67 2e 20 76 69 61 20 63 6f 6e 64 69 74 69  e.g. via conditi
10f0: 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  onal compilation
1100: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e  )..*/.#ifndef UN
1110: 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1120: 4c 55 45 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  LUE.#  define UN
1130: 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1140: 4c 55 45 28 78 29 20 28 76 6f 69 64 29 28 78 29  LUE(x) (void)(x)
1150: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1160: 65 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61  eturns the chara
1170: 63 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  cter that should
1180: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
1190: 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
11a0: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
11b0: 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20  winGetDirSep.#  
11c0: 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72  define winGetDir
11d0: 53 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20  Sep()           
11e0: 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66       '\\'.#endif
11f0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65  ../*.** Do we ne
1200: 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64  ed to manually d
1210: 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20  efine the Win32 
1220: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
1230: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57  s for use with W
1240: 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e  AL.** mode (e.g.
1250: 20 74 68 65 73 65 20 41 50 49 73 20 61 72 65 20   these APIs are 
1260: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
1270: 20 57 69 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b   Windows CE SDK;
1280: 20 68 6f 77 65 76 65 72 2c 20 74 68 65 79 0a 2a   however, they.*
1290: 2a 20 61 72 65 20 6e 6f 74 20 70 72 65 73 65 6e  * are not presen
12a0: 74 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  t in the header 
12b0: 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51  file)?.*/.#if SQ
12c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d  LITE_WIN32_FILEM
12d0: 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64  APPING_API && !d
12e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12f0: 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77  IT_WAL)./*.** Tw
1300: 6f 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61  o of the file ma
1310: 70 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64  pping APIs are d
1320: 69 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57  ifferent under W
1330: 69 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75  inRT.  Figure ou
1340: 74 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77  t which.** set w
1350: 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53  e need..*/.#if S
1360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57  QLITE_OS_WINRT.W
1370: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1380: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1390: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
13a0: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
13b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
13c0: 54 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c  TRIBUTES, ULONG,
13d0: 20 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54   ULONG64, LPCWST
13e0: 52 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20  R);..WINBASEAPI 
13f0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
1400: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1410: 70 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47  pp(HANDLE, ULONG
1420: 2c 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f  , ULONG64, SIZE_
1430: 54 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65  T);.#else.#if de
1440: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1450: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e  32_HAS_ANSI).WIN
1460: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
1470: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
1480: 4d 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c  MappingA(HANDLE,
1490: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
14a0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
14b0: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
14c0: 44 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a  DWORD, LPCSTR);.
14d0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
14e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
14f0: 41 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66  AS_ANSI) */..#if
1500: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1510: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1520: 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c  WINBASEAPI HANDL
1530: 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46  E WINAPI CreateF
1540: 69 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44  ileMappingW(HAND
1550: 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41  LE, LPSECURITY_A
1560: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
1570: 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52       DWORD, DWOR
1580: 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54  D, DWORD, LPCWST
1590: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
15a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
15b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a  32_HAS_WIDE) */.
15c0: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
15d0: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
15e0: 77 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20  wOfFile(HANDLE, 
15f0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
1600: 4f 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65  ORD, SIZE_T);.#e
1610: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1620: 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINRT */../*.*
1630: 2a 20 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70  * This file mapp
1640: 69 6e 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f  ing API is commo
1650: 6e 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20  n to both Win32 
1660: 61 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49  and WinRT..*/.WI
1670: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
1680: 4e 41 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66  NAPI UnmapViewOf
1690: 46 69 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23  File(LPCVOID);.#
16a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16b0: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
16c0: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
16d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
16e0: 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  L) */../*.** Som
16f0: 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
1700: 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
1710: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
1720: 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46  ifndef INVALID_F
1730: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23  ILE_ATTRIBUTES.#
1740: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
1750: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1760: 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
1770: 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45  if..#ifndef FILE
1780: 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66  _FLAG_MASK.# def
1790: 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  ine FILE_FLAG_MA
17a0: 53 4b 20 20 20 20 20 20 20 20 20 20 28 30 78 46  SK          (0xF
17b0: 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a  F3C0000).#endif.
17c0: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54  .#ifndef FILE_AT
17d0: 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64  TRIBUTE_MASK.# d
17e0: 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49  efine FILE_ATTRI
17f0: 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30  BUTE_MASK     (0
1800: 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69  x0003FFF7).#endi
1810: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1820: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f  E_OMIT_WAL./* Fo
1830: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1840: 20 74 6f 20 73 74 72 75 63 74 75 72 65 73 20 75   to structures u
1850: 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74  sed for WAL */.t
1860: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69  ypedef struct wi
1870: 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20  nShm winShm;    
1880: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e         /* A conn
1890: 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
18a0: 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64  -memory */.typed
18b0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
18c0: 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b  Node winShmNode;
18d0: 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f     /* A region o
18e0: 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
18f0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
1900: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
1910: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
1920: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
1930: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
1940: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
1950: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
1960: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
1970: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
1980: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
1990: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
19a0: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
19b0: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
19c0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
19d0: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
19e0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
19f0: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
1a00: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1a10: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
1a20: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
1a30: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
1a40: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
1a50: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
1a60: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
1a70: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
1a80: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a90: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
1aa0: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
1ab0: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
1ac0: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
1ad0: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
1ae0: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
1af0: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
1b00: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
1b10: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
1b20: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
1b40: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
1b50: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
1b60: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1b70: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
1b80: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
1b90: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
1ba0: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
1bb0: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
1bc0: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
1bd0: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
1c00: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
1c10: 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b  /.  u8 locktype;
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c30: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
1c40: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
1c50: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
1c60: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
1c70: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
1c80: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
1c90: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
1ca0: 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46  ck */.  u8 ctrlF
1cb0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1cc0: 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57  /* Flags.  See W
1cd0: 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a  INFILE_* below *
1ce0: 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
1cf0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  rno;        /* T
1d00: 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
1d10: 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
1d20: 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e  /O error */.#ifn
1d30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d40: 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53  WAL.  winShm *pS
1d50: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
1d60: 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61   Instance of sha
1d70: 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68  red memory on th
1d80: 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  is file */.#endi
1d90: 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  f.  const char *
1da0: 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46  zPath;      /* F
1db0: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
1dc0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
1dd0: 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20  nt szChunk;     
1de0: 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20         /* Chunk 
1df0: 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20  size configured 
1e00: 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  by FCNTL_CHUNK_S
1e10: 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  IZE */.#if SQLIT
1e20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57  E_OS_WINCE.  LPW
1e30: 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  STR zDeleteOnClo
1e40: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
1e50: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
1e60: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
1e70: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
1e90: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
1ea0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
1eb0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e  ed lock */.  HAN
1ec0: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
1ed0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1ee0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
1ef0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
1f00: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
1f10: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
1f20: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
1f30: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
1f40: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
1f50: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
1f60: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
1f70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
1f80: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
1f90: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20    */.#endif.#if 
1fa0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1fb0: 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65  SIZE>0.  int nFe
1fc0: 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20  tchOut;         
1fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fe0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1ff0: 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
2000: 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d  s */.  HANDLE hM
2010: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
2020: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2030: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d  or accessing mem
2040: 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ory mapping */. 
2050: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
2060: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2070: 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61  * Area memory ma
2080: 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pped */.  sqlite
2090: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
20a0: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c  ;       /* Usabl
20b0: 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64  e size of mapped
20c0: 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c   region */.  sql
20d0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
20e0: 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63  izeActual; /* Ac
20f0: 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70  tual size of map
2100: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
2110: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
2120: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a  apSizeMax;    /*
2130: 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54   Configured FCNT
2140: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75  L_MMAP_SIZE valu
2150: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
2160: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
2170: 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65  lues for winFile
2180: 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64  .ctrlFlags.*/.#d
2190: 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44  efine WINFILE_RD
21a0: 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78  ONLY          0x
21b0: 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  02   /* Connecti
21c0: 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20  on is read only 
21d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
21e0: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
21f0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
2200: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
2210: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
2220: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
2230: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
2240: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
2250: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
2260: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
2270: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
2280: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
2290: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
22a0: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
22b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
22c0: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
22d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
22e0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
22f0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
2300: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
2310: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
2320: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
2330: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
2340: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
2350: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
2360: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2370: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
2380: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
2390: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
23a0: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
23b0: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
23c0: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
23d0: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
23e0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
23f0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
2400: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
2410: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
2420: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
2430: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
2440: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
2450: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
2460: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2470: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
2480: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
2490: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
24a0: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
24b0: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
24c0: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
24d0: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
24e0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
24f0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
2500: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
2510: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
2520: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
2530: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
2540: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
2550: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
2560: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
2570: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
2580: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
2590: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
25a0: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
25b0: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
25c0: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
25d0: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
25e0: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
25f0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
2600: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
2610: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
2620: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
2630: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
2640: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
2650: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
2660: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2670: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
2680: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
2690: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
26a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
26f0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
2700: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
2710: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
2720: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
2730: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
2740: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
2750: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
2760: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
2770: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
2780: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
2790: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
27a0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
27b0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
27c0: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
27d0: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
27e0: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
27f0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
2800: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
2810: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
2820: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
2830: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
2840: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
2850: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
2860: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
2870: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
2880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
28d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
28e0: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
28f0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2900: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
2910: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
2920: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
2930: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
2940: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2950: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2960: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2980: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
2990: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
29a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
29b0: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
29c0: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
29d0: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a00: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2a10: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
2a20: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
2a30: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
2a40: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
2a50: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2a60: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2a70: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2a80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2a90: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
2aa0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2ac0: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
2ad0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
2ae0: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
2af0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
2b00: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
2b10: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2b20: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
2b30: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
2b40: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
2b50: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2b60: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
2b70: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2b80: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
2b90: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
2ba0: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
2bb0: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
2bc0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
2bd0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
2be0: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
2bf0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
2c00: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
2c10: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
2c20: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
2c30: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
2c40: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
2c50: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2c60: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20    u32 magic1;   
2c70: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
2c80: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
2c90: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
2ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
2cb0: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
2cc0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
2cd0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
2ce0: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
2cf0: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
2d00: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
2d10: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
2d20: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2d30: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f   u32 magic2;   /
2d40: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
2d50: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
2d60: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
2d70: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  /.#endif.};..#if
2d80: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
2d90: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
2da0: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  1     0x42b2830b
2db0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
2dc0: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34  MAGIC2     0xbd4
2dd0: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74  d7cf4.#endif..st
2de0: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
2df0: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
2e00: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
2e10: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
2e20: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20  MAGIC1,.#endif. 
2e30: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66   NULL, FALSE.#if
2e40: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57  ndef NDEBUG.  ,W
2e50: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e  INMEM_MAGIC2.#en
2e60: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  dif.};..#ifndef 
2e70: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
2e80: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2e90: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  1() assert( win_
2ea0: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d  mem_data.magic1=
2eb0: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
2ec0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
2ed0: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73  ssertMagic2() as
2ee0: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
2ef0: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  ta.magic2==WINME
2f00: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69  M_MAGIC2 ).#defi
2f10: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
2f20: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73  agic()  winMemAs
2f30: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69  sertMagic1(); wi
2f40: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
2f50: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ();.#else.#defin
2f60: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2f70: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
2f80: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44  efine winMemGetD
2f90: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d  ataPtr()  &win_m
2fa0: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20  em_data.#define 
2fb0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
2fc0: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
2fd0: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77  .hHeap.#define w
2fe0: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
2ff0: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3000: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76  bOwned..static v
3010: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
3020: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
3030: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3040: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
3050: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
3060: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
3070: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
3080: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
3090: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
30a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
30b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
30c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
30d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
30e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
30f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
3100: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
3110: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
3120: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
3130: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
3140: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
3150: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
3160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
3170: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
3180: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
3190: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
31a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
31b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
31c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
31d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
31e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
31f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
3200: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
3210: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
3220: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
3230: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
3240: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3250: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
3260: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3270: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
3280: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
3290: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
32a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
32b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
32c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
32d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
32e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
32f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
3300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3310: 45 53 54 0a 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c  EST.LONG volatil
3320: 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  e sqlite3_os_typ
3330: 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  e = 0;.#else.sta
3340: 74 69 63 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c  tic LONG volatil
3350: 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  e sqlite3_os_typ
3360: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
3370: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
3380: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
3390: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
33a0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
33b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
33d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
33e0: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
33f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3400: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
3410: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
3420: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
3430: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
3440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
3450: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
3460: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
3470: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
3480: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
3490: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
34a0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
34b0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
34c0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
34d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
34e0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
34f0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
3500: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
3510: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
3520: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
3530: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
3540: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
3550: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
3560: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
3570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3590: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
35a0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
35b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
35c0: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
35d0: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
35e0: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
35f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3600: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3610: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3620: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
3630: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
3640: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
3650: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
3660: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
3670: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3680: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
3690: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
36a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
36b0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
36c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
36d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
36e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
36f0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
3700: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
3710: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
3720: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
3730: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3740: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
3750: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
3760: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3770: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3780: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3790: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
37a0: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
37b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
37c0: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
37d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
37e0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
37f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3800: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3830: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
3840: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
3850: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
3860: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
3870: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3880: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3890: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
38a0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
38b0: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
38c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
38d0: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
38e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
38f0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
3900: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3910: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3940: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
3950: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
3960: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
3970: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
3980: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
3990: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
39a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
39b0: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
39c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
39d0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
39e0: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
39f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
3a00: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3a10: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3a20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a30: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
3a40: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3a50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3a60: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
3a70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3a80: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3a90: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3aa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ad0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3ae0: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
3af0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
3b00: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
3b20: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
3b30: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
3b40: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
3b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3b70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3b80: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3b90: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3ba0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3bb0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3bc0: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
3bd0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3be0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3c00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3c20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3c30: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
3c40: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3c50: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
3c60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3c70: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3c80: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3c90: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3ca0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3cb0: 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f  )..#if (!SQLITE_
3cc0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3cd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3ce0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
3cf0: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
3d00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
3d10: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
3d20: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3d30: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3d40: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20  eFileMappingA,  
3d50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3d60: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3d70: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
3d80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3db0: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
3dc0: 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44  eMappingA ((HAND
3dd0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
3de0: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
3df0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
3e00: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
3e10: 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53  DWORD,LPCSTR))aS
3e20: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
3e30: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3e40: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
3e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3e70: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
3e80: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
3e90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3ea0: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
3eb0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3ec0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3ed0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3ee0: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
3ef0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3f00: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
3f10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3f40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3f50: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
3f60: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3f70: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3f80: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3f90: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3fa0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
3fb0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
3fc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3fd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3fe0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3ff0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4000: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
4010: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4020: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4030: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
4040: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4050: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
4060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4070: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4090: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
40a0: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
40b0: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
40c0: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
40d0: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
40e0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
40f0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
4100: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4110: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4120: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4130: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4150: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
4160: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
4170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
4180: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
4190: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
41a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
41b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
41d0: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
41e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
41f0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
4200: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4230: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4240: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4250: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
4260: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
4270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4280: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
4290: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
42a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
42c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
42d0: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
42e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
42f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4300: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
4310: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4320: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4330: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4340: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
4350: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4360: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
4370: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4380: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
4390: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
43c0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
43d0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
43e0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
43f0: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4400: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
4410: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
4420: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
4430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4440: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
4450: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4460: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
4470: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4480: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
4490: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
44a0: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
44b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
44e0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
44f0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
4500: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4510: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
4520: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
4530: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4540: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
4550: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
4560: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
4570: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
4580: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
4590: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
45a0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
45b0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
45c0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
45d0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
45e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
45f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4600: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
4610: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4620: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4630: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
4640: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4650: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4660: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
4670: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
46a0: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
46b0: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
46c0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
46d0: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
46e0: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
46f0: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
4700: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
4710: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4720: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4730: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4740: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4750: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4760: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
4770: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
4780: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
4790: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
47a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
47b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
47c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
47d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
47e0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
47f0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4800: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
4810: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
4820: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
4830: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
4840: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
4850: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
4860: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
4870: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
4880: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
48a0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
48b0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
48c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
48d0: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
48e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
48f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4910: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4920: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
4930: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
4940: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
4950: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
4960: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
4970: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
4980: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
4990: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
49a0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
49b0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
49c0: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
49d0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
49e0: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
49f0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4a00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
4a10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4a20: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
4a30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4a40: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4a50: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4a60: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
4a70: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4a80: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
4a90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ac0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ad0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
4ae0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4af0: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
4b00: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4b10: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4b20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
4b30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4b40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4b50: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4b60: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4b70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4b80: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
4b90: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4ba0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4bb0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
4bc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4bd0: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
4be0: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
4bf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4c20: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
4c30: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
4c40: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4c50: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
4c60: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
4c70: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
4c80: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
4c90: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4ca0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4cb0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4cc0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4cd0: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4ce0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4cf0: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
4d00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4d10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
4d20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4d40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4d50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4d60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4d70: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4d80: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
4d90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
4da0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4db0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4dc0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4dd0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4de0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4df0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4e00: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4e10: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
4e20: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4e30: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
4e40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4e70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4e80: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4e90: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4ea0: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
4eb0: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
4ec0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4ed0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4ee0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
4ef0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4f00: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
4f10: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4f20: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
4f30: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4f40: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
4f50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4f80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
4f90: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
4fa0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4fb0: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
4fc0: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
4fd0: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
4fe0: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
4ff0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5000: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5010: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5030: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
5040: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
5050: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5060: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
5070: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5080: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5090: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
50a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
50b0: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
50c0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
50d0: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
50e0: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
50f0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5100: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5110: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5120: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5130: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5140: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5150: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
5160: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
5170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5180: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
5190: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
51a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
51b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
51c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
51d0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
51e0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
51f0: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
5200: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
5210: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
5220: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
5230: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5240: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
5250: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5270: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
5280: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5290: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
52a0: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
52b0: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
52c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
52d0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
52e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
52f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5320: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
5330: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5340: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
5350: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
5360: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
5370: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
5380: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
5390: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
53a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
53b0: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
53c0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
53d0: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
53e0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
53f0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5400: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
5410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5420: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5430: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
5440: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5450: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
5460: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
5470: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
5480: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
5490: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
54a0: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
54b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
54c0: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
54d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
54e0: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
54f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
5500: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
5510: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
5520: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
5530: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
5540: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
5550: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
5560: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
5570: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
5580: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
5590: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
55a0: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
55b0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
55c0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
55d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5600: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
5610: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
5620: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
5630: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
5640: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
5650: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5660: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5670: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
5680: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5690: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
56a0: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
56b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
56c0: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
56d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
56e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5700: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5710: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
5720: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
5730: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
5740: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
5750: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5760: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
5770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5780: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
57a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
57b0: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
57c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
57d0: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
57e0: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
57f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5800: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
5810: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5820: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
5830: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5840: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
5850: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5860: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
5870: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
58a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
58b0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
58c0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
58d0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
58e0: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
58f0: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
5900: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5910: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
5920: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
5930: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5940: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
5950: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
5960: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5970: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
5980: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5990: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
59c0: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
59d0: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
59e0: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
59f0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
5a00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5a10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5a20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5a30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5a40: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5a50: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5a60: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
5a70: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
5a80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5a90: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5ab0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5ad0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5ae0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
5af0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5b00: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
5b10: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
5b20: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5b30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5b40: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5b60: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
5b70: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
5b80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5b90: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
5ba0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5bb0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5bc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5bd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5be0: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
5bf0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5c00: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
5c10: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
5c20: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5c30: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5c40: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5c50: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
5c60: 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20 20  IONEX) && \.    
5c70: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
5c80: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
5c90: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5ca0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5cb0: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
5cc0: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
5cd0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5ce0: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
5cf0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5d00: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5d10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5d20: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5d30: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
5d40: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5d50: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
5d60: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
5d70: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
5d80: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5d90: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5db0: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5dc0: 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 64  .        defined
5dd0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
5de0: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
5df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5e00: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
5e10: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5e20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e30: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
5e40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5e50: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
5e60: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
5e70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5ea0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5eb0: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
5ec0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
5ed0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
5ee0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
5ef0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
5f00: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5f20: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
5f30: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5f40: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5f50: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
5f60: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5f70: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5f80: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5f90: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
5fa0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5fb0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
5fc0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
5fd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5fe0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
5ff0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6000: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6010: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6050: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6060: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
6070: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
6080: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
6090: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
60a0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
60b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
60c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
60d0: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
60e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
60f0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6100: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6110: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6120: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6130: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6170: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
6180: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
6190: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
61a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
61b0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
61c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61d0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
61e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
61f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6200: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6210: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6220: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6230: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
6240: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
6250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6260: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
6270: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6280: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6290: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
62a0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
62b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
62c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
62d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
62e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
62f0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6310: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6330: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6340: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
6350: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6360: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6370: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6380: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
6390: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
63a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
63b0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
63c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
63d0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
63e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
63f0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6400: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6410: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6440: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
6450: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
6460: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6470: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6480: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
6490: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
64a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
64b0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
64c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
64d0: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
64e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
64f0: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6500: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6510: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6520: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6530: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6560: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6570: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
6580: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6590: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
65a0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
65b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
65c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
65d0: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
65e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
65f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6600: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6610: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6620: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6640: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6650: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6660: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6680: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6690: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
66a0: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
66b0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
66c0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
66d0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
66e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
66f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6700: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6710: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6720: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6730: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6740: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6750: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6760: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6770: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
6780: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6790: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
67a0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
67b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
67e0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
67f0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6800: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6810: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6820: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6830: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6840: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
6850: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6860: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
6870: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
6880: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6890: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
68b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
68d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
68e0: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
68f0: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6900: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6910: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6920: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6930: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6940: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6950: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6960: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6970: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6990: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
69a0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
69b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
69c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
69d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
69e0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
69f0: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6a00: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6a10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6a20: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6a30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6a40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6a50: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6a60: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6a70: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6a80: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6a90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6aa0: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6ab0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ac0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6ad0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6ae0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6b10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6b20: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6b30: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6b50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6b60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6b70: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6b80: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6b90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6ba0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6bb0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6bc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6bd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6be0: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
6bf0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
6c00: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6c10: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
6c20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
6c30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
6c40: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6c50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6c60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6c70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6c80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6c90: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
6ca0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
6cb0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6cc0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6cd0: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6ce0: 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e  call[49].pCurren
6cf0: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
6d00: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
6d10: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
6d20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
6d30: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6d40: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
6d50: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
6d60: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6d70: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
6d80: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
6d90: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30  int))aSyscall[50
6da0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6db0: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
6dc0: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
6dd0: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
6de0: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
6df0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
6e00: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6e10: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
6e20: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6e30: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
6e40: 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43  )aSyscall[51].pC
6e50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
6e60: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
6e70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6e80: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
6e90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6ea0: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
6eb0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6ec0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
6ed0: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
6ee0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
6ef0: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
6f00: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
6f10: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
6f20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
6f30: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
6f40: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6f50: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6f60: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
6f70: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f80: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
6f90: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
6fa0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6fb0: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
6fc0: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
6fd0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
6fe0: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
6ff0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7000: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7010: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
7020: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7050: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
7060: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
7070: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
7080: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
7090: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
70a0: 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74  all[54].pCurrent
70b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
70c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65  S_WINRT.  { "Sle
70d0: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
70e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
70f0: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
7100: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7110: 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  lse.  { "Sleep",
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65  ..#define osSlee
7170: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
7180: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
7190: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
71a0: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
71b0: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
71c0: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
71d0: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
71e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
71f0: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
7200: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
7210: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
7220: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
7230: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
7240: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
7250: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7260: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
7270: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7280: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7290: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
72a0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
72b0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
72c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
72d0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
72f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7310: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
7320: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
7330: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
7340: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7350: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7360: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7370: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7380: 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75  aSyscall[57].pCu
7390: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
73a0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
73b0: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
73c0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
73d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
73e0: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
73f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7400: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
7410: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
7420: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7450: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
7460: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7470: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7480: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7490: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
74a0: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
74b0: 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  58].pCurrent)..#
74c0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
74d0: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
74e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
74f0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7500: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7510: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7520: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7530: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7540: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7550: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
7560: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7580: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7590: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
75a0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
75b0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
75c0: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
75d0: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
75e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
75f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7600: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7610: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7620: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7630: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
7640: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
7650: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
7660: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
7670: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
7680: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
7690: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
76a0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
76b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
76c0: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
76e0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
76f0: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7700: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7710: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7720: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7730: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7740: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
7750: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7760: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7770: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7780: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7790: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
77a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
77b0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
77c0: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
77d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7800: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7810: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7820: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7830: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
7840: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
7850: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
7860: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7870: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7880: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7890: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
78a0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
78b0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
78c0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
78d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
78e0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
78f0: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7900: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7920: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7930: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7940: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
7950: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7960: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7970: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
7980: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7990: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
79a0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
79b0: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
79c0: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
79d0: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
79e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
79f0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7a00: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
7a10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7a30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7a40: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
7a50: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
7a60: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7a70: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7a80: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
7a90: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
7aa0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7ab0: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
7ac0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7ad0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
7ae0: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
7af0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7b00: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7b10: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
7b20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7b50: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
7b60: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
7b70: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7b80: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
7b90: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
7ba0: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
7bb0: 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72  Syscall[65].pCur
7bc0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7bd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7be0: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
7bf0: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
7c00: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
7c10: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7c20: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
7c30: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
7c40: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
7c50: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7c80: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
7c90: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7ca0: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
7cb0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
7cc0: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
7cd0: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
7ce0: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
7cf0: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
7d00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7d10: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
7d20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7d30: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61  MIT_WAL).  { "Ma
7d40: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7d50: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
7d60: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  )MapViewOfFileFr
7d70: 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23  omApp,    0 },.#
7d80: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
7d90: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7da0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7dd0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
7de0: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7df0: 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  p ((LPVOID(WINAP
7e00: 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47  I*)(HANDLE,ULONG
7e10: 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20  ,ULONG64, \.    
7e20: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
7e30: 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e  call[67].pCurren
7e40: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7e50: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
7e60: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
7e70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7e80: 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20  CreateFile2,    
7e90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7ea0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
7eb0: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
7ec0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7ef0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
7f00: 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45  teFile2 ((HANDLE
7f10: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7f20: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  R,DWORD,DWORD,DW
7f30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7f40: 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  PCREATEFILE2_EXT
7f50: 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
7f60: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
7f70: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7f80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
7f90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7fa0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
7fb0: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50  SION).  { "LoadP
7fc0: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
7fd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
7fe0: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
7ff0: 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  y,     0 },.#els
8000: 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  e.  { "LoadPacka
8010: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
8020: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8050: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61  #define osLoadPa
8060: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28  ckagedLibrary ((
8070: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
8080: 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  (LPCWSTR, \.    
8090: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
80a0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
80b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
80c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
80d0: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
80e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
80f0: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20  etTickCount64,  
8100: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8110: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
8120: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8130: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8160: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
8170: 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e  ckCount64 ((ULON
8180: 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56  GLONG(WINAPI*)(V
8190: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  OID))aSyscall[70
81a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
81b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
81c0: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
81d0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
81e0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69  (SYSCALL)GetNati
81f0: 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  veSystemInfo,   
8200: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8210: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8220: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8230: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8250: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8260: 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  ne osGetNativeSy
8270: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
8280: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
8290: 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46      LPSYSTEM_INF
82a0: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e  O))aSyscall[71].
82b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
82c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
82d0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
82e0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
82f0: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8300: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
8310: 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30  gStringA,      0
8320: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
8330: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8340: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
8350: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8360: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8370: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8380: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
8390: 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41  ingA ((VOID(WINA
83a0: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
83b0: 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65  scall[72].pCurre
83c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
83d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
83e0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74  S_WIDE).  { "Out
83f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8400: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8410: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8420: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
8430: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8440: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
8450: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8480: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
8490: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28  utDebugStringW (
84a0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
84b0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
84c0: 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [73].pCurrent)..
84d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48    { "GetProcessH
84e0: 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28  eap",          (
84f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65  SYSCALL)GetProce
8500: 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20  ssHeap,         
8510: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
8520: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20  sGetProcessHeap 
8530: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
8540: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
8550: 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [74].pCurrent)..
8560: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8570: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
8580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
8590: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
85a0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
85b0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
85c0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
85d0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
85e0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
85f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
8600: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8630: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
8640: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
8650: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
8660: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
8670: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
8680: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
8690: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
86a0: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43  )aSyscall[75].pC
86b0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e  urrent)../*.** N
86c0: 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62  OTE: On some sub
86d0: 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65 20  -platforms, the 
86e0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
86f0: 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e 63  reExchange "func
8700: 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69  tion".**       i
8710: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
8720: 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73 20  macro that uses 
8730: 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69  a compiler intri
8740: 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29 2e  nsic (e.g. x64).
8750: 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f 20  .**       So do 
8760: 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65 20  not try to make 
8770: 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20 72  this is into a r
8780: 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65 72  edefinable inter
8790: 66 61 63 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  face..*/.#define
87a0: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
87b0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e  mpareExchange In
87c0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
87d0: 45 78 63 68 61 6e 67 65 0a 0a 7d 3b 20 2f 2a 20  Exchange..}; /* 
87e0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
87f0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
8800: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
8810: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
8820: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
8830: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
8840: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
8850: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
8860: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
8870: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
8880: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
8890: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
88a0: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
88b0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
88c0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
88d0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
88e0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
88f0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
8900: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
8910: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
8920: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
8930: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
8940: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
8950: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
8960: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
8970: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8980: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
8990: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
89a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
89b0: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
89c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
89d0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
89e0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
89f0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
8a00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
8a10: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
8a20: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
8a30: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
8a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
8a50: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
8a60: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
8a70: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
8a80: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
8a90: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
8aa0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
8ab0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
8ac0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
8ad0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
8ae0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
8af0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
8b00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
8b10: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8b20: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
8b30: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8b40: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
8b50: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
8b60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
8b70: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
8b80: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
8b90: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
8ba0: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
8bb0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
8bc0: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
8bd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8be0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8bf0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8c00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8c10: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
8c20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
8c30: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8c40: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
8c50: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
8c60: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
8c70: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
8c80: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8c90: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
8ca0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
8cb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
8cc0: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
8cd0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
8ce0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8cf0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
8d00: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
8d10: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
8d20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8d30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8d40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8d50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
8d60: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
8d70: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
8d80: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
8d90: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
8da0: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
8db0: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
8dc0: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
8dd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
8de0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
8df0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
8e00: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
8e10: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
8e20: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
8e30: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
8e40: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
8e50: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
8e60: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
8e70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8e80: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
8e90: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8ea0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8eb0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8ec0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
8ed0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
8ee0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
8ef0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
8f00: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
8f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
8f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8f30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8f40: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
8f50: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
8f60: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
8f70: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
8f80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
8f90: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
8fa0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8fb0: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
8fc0: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
8fd0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
8fe0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
8ff0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
9000: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
9010: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
9020: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
9030: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
9040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9050: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
9060: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
9070: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
9080: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
9090: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
90a0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
90b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
90c0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
90d0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
90e0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
90f0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
9100: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
9110: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
9120: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
9130: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
9140: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9150: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
9160: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
9170: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
9180: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49  2_MALLOC./*.** I
9190: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
91a0: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
91b0: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
91c0: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
91d0: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70  tempt to.** comp
91e0: 61 63 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75  act it.  Upon su
91f0: 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccess, SQLITE_OK
9200: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
9210: 64 2e 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65  d.  Upon failure
9220: 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49  , one.** of SQLI
9230: 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45  TE_NOMEM, SQLITE
9240: 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54  _ERROR, or SQLIT
9250: 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20  E_NOTFOUND will 
9260: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  be returned.  Th
9270: 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22  e.** "pnLargest"
9280: 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f   argument, if no
9290: 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20  n-zero, will be 
92a0: 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74  used to return t
92b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
92c0: 2a 20 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74  * largest commit
92d0: 74 65 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  ted free block i
92e0: 6e 20 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62  n the heap, in b
92f0: 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ytes..*/.int sql
9300: 69 74 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61  ite3_win32_compa
9310: 63 74 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70  ct_heap(LPUINT p
9320: 6e 4c 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74  nLargest){.  int
9330: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9340: 0a 20 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74  .  UINT nLargest
9350: 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68   = 0;.  HANDLE h
9360: 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  Heap;..  winMemA
9370: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9380: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
9390: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
93a0: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
93b0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
93c0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
93d0: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
93e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
93f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
9400: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
9410: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
9420: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
9430: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9440: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
9450: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23  ULL) );.#endif.#
9460: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9470: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
9480: 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e  S_WINRT.  if( (n
9490: 4c 61 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f  Largest=osHeapCo
94a0: 6d 70 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c  mpact(hHeap, SQL
94b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
94c0: 4c 41 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20  LAGS))==0 ){.   
94d0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
94e0: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
94f0: 72 28 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73  r();.    if( las
9500: 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52  tErrno==NO_ERROR
9510: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9520: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
9530: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
9540: 65 61 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73  eapCompact (no s
9550: 70 61 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c  pace), heap=%p",
9560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9570: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
9580: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
9590: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
95a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
95b0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
95c0: 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f  RROR, "failed to
95d0: 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c   HeapCompact (%l
95e0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9610: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
9620: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9630: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
9640: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69    }.#else.  sqli
9650: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9660: 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64  OTFOUND, "failed
9670: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c   to HeapCompact,
9680: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9690: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
96a0: 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53  hHeap);.  rc = S
96b0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
96c0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c  #endif.  if( pnL
96d0: 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67  argest ) *pnLarg
96e0: 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a  est = nLargest;.
96f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9700: 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32  /*.** If a Win32
9710: 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73   native heap has
9720: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
9730: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9740: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
9750: 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  ** destroy and r
9760: 65 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20  ecreate it.  If 
9770: 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  the Win32 native
9780: 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f   heap is not iso
9790: 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20  lated and/or.** 
97a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  the sqlite3_memo
97b0: 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69  ry_used() functi
97c0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  on does not retu
97d0: 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f  rn zero, SQLITE_
97e0: 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  BUSY will.** be 
97f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
9800: 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
9810: 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33  made to the Win3
9820: 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a  2 native heap..*
9830: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
9840: 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29  n32_reset_heap()
9850: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55  {.  int rc;.  MU
9860: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
9870: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
9880: 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e  r; ) /* The main
9890: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
98a0: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
98b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
98c0: 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65  Mem; )    /* The
98d0: 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d   memsys static m
98e0: 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  utex */.  MUTEX_
98f0: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
9900: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9910: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9920: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
9930: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
9940: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d   pMem = sqlite3M
9950: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
9960: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
9970: 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  M); ).  sqlite3_
9980: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
9990: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ter);.  sqlite3_
99a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d  mutex_enter(pMem
99b0: 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  );.  winMemAsser
99c0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20  tMagic();.  if( 
99d0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21  winMemGetHeap()!
99e0: 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47  =NULL && winMemG
99f0: 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c  etOwned() && sql
9a00: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9a10: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  ()==0 ){.    /*.
9a20: 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
9a30: 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75  oint, there shou
9a40: 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  ld be no outstan
9a50: 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ding memory allo
9a60: 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a  cations on.    *
9a70: 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73  * the heap.  Als
9a80: 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68  o, since both th
9a90: 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d  e master and mem
9aa0: 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75  sys locks are cu
9ab0: 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62  rrently.    ** b
9ac0: 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c  eing held by us,
9ad0: 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69   no other functi
9ae0: 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e  on (i.e. from an
9af0: 6f 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68  other thread) sh
9b00: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61  ould.    ** be a
9b10: 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65  ble to even acce
9b20: 73 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74  ss the heap.  At
9b30: 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79  tempt to destroy
9b40: 20 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75   and recreate ou
9b50: 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65  r.    ** isolate
9b60: 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  d Win32 native h
9b70: 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  eap now..    */.
9b80: 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d      assert( winM
9b90: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
9ba0: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
9bb0: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
9bc0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9bd0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9be0: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
9bf0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
9c00: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
9c10: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
9c20: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9c30: 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  ==NULL );.    as
9c40: 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74  sert( !winMemGet
9c50: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
9c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9c70: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
9c80: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d  );.    rc = winM
9c90: 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74  emInit(winMemGet
9ca0: 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20  DataPtr());.    
9cb0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9cc0: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
9cd0: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9ce0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
9cf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
9d00: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
9d10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
9d20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
9d30: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9d40: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65  sed()==0 );.  }e
9d50: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
9d60: 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74  ** The Win32 nat
9d70: 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20  ive heap cannot 
9d80: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61  be modified beca
9d90: 75 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e  use it may be in
9da0: 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   use..    */.   
9db0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
9dc0: 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
9dd0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65  _mutex_leave(pMe
9de0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  m);.  sqlite3_mu
9df0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
9e00: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
9e10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
9e20: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
9e30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
9e40: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
9e50: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
9e60: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
9e70: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
9e80: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
9e90: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
9ea0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
9eb0: 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63  te_debug(const c
9ec0: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
9ed0: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
9ee0: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
9ef0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
9f00: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
9f10: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
9f20: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
9f30: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
9f40: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
9f50: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
9f60: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
9f70: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
9f80: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
9f90: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
9fa0: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
9fb0: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
9fc0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
9fd0: 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   );.#if defined(
9fe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
9ff0: 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69  _ANSI).  if( nMi
a000: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
a010: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
a020: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a030: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
a040: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
a050: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f  uf, nMin);.    o
a060: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a070: 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20  ngA(zDbgBuf);.  
a080: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74  }else{.    osOut
a090: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
a0a0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66  zBuf);.  }.#elif
a0b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a0c0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
a0d0: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
a0e0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
a0f0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
a100: 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42  .  if ( osMultiB
a110: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20  yteToWideChar(. 
a120: 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69           osAreFi
a130: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
a140: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
a150: 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  , 0, zBuf,.     
a160: 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53       nMin, (LPWS
a170: 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49  TR)zDbgBuf, SQLI
a180: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a190: 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48  _SIZE/sizeof(WCH
a1a0: 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72  AR))<=0 ){.    r
a1b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f  eturn;.  }.  osO
a1c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a1d0: 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42  W((LPCWSTR)zDbgB
a1e0: 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
a1f0: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
a200: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a210: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a220: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a230: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
a240: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
a250: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a260: 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66  r, "%s", zDbgBuf
a270: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a280: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a290: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
a2a0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a2b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a2c0: 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20  outine suspends 
a2d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
a2e0: 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  ad for at least 
a2f0: 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e  ms.** millisecon
a300: 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75  ds.  This is equ
a310: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57  ivalent to the W
a320: 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74  in32 Sleep() int
a330: 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53  erface..*/.#if S
a340: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73  QLITE_OS_WINRT.s
a350: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65  tatic HANDLE sle
a360: 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65  epObj = NULL;.#e
a370: 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ndif..void sqlit
a380: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44  e3_win32_sleep(D
a390: 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  WORD millisecond
a3a0: 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s){.#if SQLITE_O
a3b0: 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73  S_WINRT.  if ( s
a3c0: 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b  leepObj==NULL ){
a3d0: 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
a3e0: 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  osCreateEventExW
a3f0: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45  (NULL, NULL, CRE
a400: 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c  ATE_EVENT_MANUAL
a410: 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20  _RESET,.        
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e          SYNCHRON
a440: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  IZE);.  }.  asse
a450: 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  rt( sleepObj!=NU
a460: 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f  LL );.  osWaitFo
a470: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
a480: 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73  sleepObj, millis
a490: 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a  econds, FALSE);.
a4a0: 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28  #else.  osSleep(
a4b0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23  milliseconds);.#
a4c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
a4d0: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
a4e0: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
a4f0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
a500: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
a510: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
a520: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
a530: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
a540: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
a550: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
a560: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
a570: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
a580: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
a590: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
a5a0: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
a5b0: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
a5c0: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
a5d0: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
a5e0: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
a5f0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
a600: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
a610: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
a620: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
a630: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a640: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
a650: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
a660: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
a670: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
a680: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
a690: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
a6a0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
a6b0: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
a6c0: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23  eEx() API..*/..#
a6d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a6e0: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
a6f0: 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49 54  IONEX) || !SQLIT
a700: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
a710: 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73  ONEX.# define os
a720: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
a730: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
a740: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
a750: 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64  INRT || !defined
a760: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a770: 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65  S_ANSI).# define
a780: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a790: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
a7a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
a7b0: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  IDE).# define os
a7c0: 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  IsNT()  (0).#els
a7d0: 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  e.# define osIsN
a7e0: 54 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f  T()  ((sqlite3_o
a7f0: 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71  s_type==2) || sq
a800: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e  lite3_win32_is_n
a810: 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t()).#endif../*.
a820: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a830: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74   determines if t
a840: 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75  he machine is ru
a850: 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20  nning a version 
a860: 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61  of Windows.** ba
a870: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
a880: 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnel..*/.int sql
a890: 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74  ite3_win32_is_nt
a8a0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 6f 73  (void){.  if( os
a8b0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
a8c0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
a8d0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20  te3_os_type, 0, 
a8e0: 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  0)==0 ){.#if def
a8f0: 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49  ined(NTDDI_VERSI
a900: 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52  ON) && NTDDI_VER
a910: 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49  SION >= NTDDI_WI
a920: 4e 38 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  N8.    OSVERSION
a930: 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOW sInfo;.   
a940: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
a950: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
a960: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
a970: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28  osGetVersionExW(
a980: 26 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  &sInfo);.#else. 
a990: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
a9a0: 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  A sInfo;.    sIn
a9b0: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
a9c0: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
a9d0: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65  sInfo);.    osGe
a9e0: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
a9f0: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  fo);.#endif.    
aa00: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
aa10: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
aa20: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20  lite3_os_type,. 
aa30: 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77         (sInfo.dw
aa40: 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45  PlatformId == VE
aa50: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
aa60: 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29  _NT) ? 2 : 1, 0)
aa70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
aa80: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
aa90: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
aaa0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c  ite3_os_type, 2,
aab0: 20 32 29 3d 3d 32 3b 0a 7d 0a 0a 23 69 66 64 65   2)==2;.}..#ifde
aac0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
aad0: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ALLOC./*.** Allo
aae0: 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d  cate nBytes of m
aaf0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
ab00: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
ab10: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b  loc(int nBytes){
ab20: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
ab30: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
ab40: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
ab50: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
ab60: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
ab70: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
ab80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
ab90: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
aba0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
abb0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
abc0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
abd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
abe0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
abf0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
ac00: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
ac10: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
ac20: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
ac30: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
ac40: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20  Bytes>=0 );.  p 
ac50: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
ac60: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
ac70: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
ac80: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
ac90: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
aca0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
acb0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
acc0: 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75   to HeapAlloc %u
acd0: 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65   bytes (%lu), he
ace0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
acf0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20          nBytes, 
ad00: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
ad10: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
ad20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
ad30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
ad40: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
ad50: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65   void winMemFree
ad60: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a  (void *pPrior){.
ad70: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
ad80: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
ad90: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
ada0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
adb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
adc0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
add0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
ade0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
adf0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
ae00: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
ae10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
ae20: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
ae30: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
ae40: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
ae50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
ae60: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
ae70: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
ae80: 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72   !pPrior ) retur
ae90: 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55  n; /* Passing NU
aea0: 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69  LL to HeapFree i
aeb0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a  s undefined. */.
aec0: 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65    if( !osHeapFre
aed0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
aee0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
aef0: 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20  , pPrior) ){.   
af00: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
af10: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
af20: 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62  ed to HeapFree b
af30: 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68  lock %p (%lu), h
af40: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
af50: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c           pPrior,
af60: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
af70: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
af80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
af90: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
afa0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65  f an existing me
afb0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
afc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
afd0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
afe0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
aff0: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
b000: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
b010: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
b020: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
b030: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
b040: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
b050: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
b060: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
b070: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
b080: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
b090: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
b0a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b0b0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
b0c0: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
b0d0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
b0e0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b0f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
b100: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
b110: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
b120: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72  =0 );.  if( !pPr
b130: 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f  ior ){.    p = o
b140: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
b150: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
b160: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
b170: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65  _T)nBytes);.  }e
b180: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  lse{.    p = osH
b190: 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70  eapReAlloc(hHeap
b1a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
b1b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
b1c0: 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  r, (SIZE_T)nByte
b1d0: 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  s);.  }.  if( !p
b1e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b1f0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
b200: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20  , "failed to %s 
b210: 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20  %u bytes (%lu), 
b220: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
b230: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
b240: 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   ? "HeapReAlloc"
b250: 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   : "HeapAlloc", 
b260: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
b270: 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
b280: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
b290: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
b2a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
b2b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
b2c0: 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64  e of an outstand
b2d0: 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  ing allocation, 
b2e0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  in bytes..*/.sta
b2f0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
b300: 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48  ze(void *p){.  H
b310: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53  ANDLE hHeap;.  S
b320: 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d  IZE_T n;..  winM
b330: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
b340: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
b350: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
b360: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
b370: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
b380: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
b390: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
b3a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b3b0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b3c0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
b3d0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
b3e0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
b3f0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
b400: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
b410: 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  , p) );.#endif. 
b420: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
b430: 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70   0;.  n = osHeap
b440: 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Size(hHeap, SQLI
b450: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b460: 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e  AGS, p);.  if( n
b470: 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a  ==(SIZE_T)-1 ){.
b480: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b490: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b4a0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a  ailed to HeapSiz
b4b0: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
b4c0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f              p, o
b4e0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
b4f0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
b500: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b510: 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
b520: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e  n;.}../*.** Roun
b530: 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73  d up a request s
b540: 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ize to the next 
b550: 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  valid allocation
b560: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
b570: 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64   int winMemRound
b580: 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74  up(int n){.  ret
b590: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
b5a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
b5b0: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
b5c0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74  c int winMemInit
b5d0: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
b5e0: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
b5f0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
b600: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
b610: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
b620: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
b630: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b640: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
b650: 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d  emData->magic1==
b660: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b  WINMEM_MAGIC1 );
b670: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
b680: 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d  emData->magic2==
b690: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b  WINMEM_MAGIC2 );
b6a0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
b6b0: 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
b6c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41  _WIN32_HEAP_CREA
b6d0: 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  TE.  if( !pWinMe
b6e0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
b6f0: 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74      DWORD dwInit
b700: 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ialSize = SQLITE
b710: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
b720: 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44  _SIZE;.    DWORD
b730: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d   dwMaximumSize =
b740: 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47   (DWORD)sqlite3G
b750: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
b760: 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78  p;.    if( dwMax
b770: 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  imumSize==0 ){. 
b780: 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69       dwMaximumSi
b790: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
b7a0: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b  2_HEAP_MAX_SIZE;
b7b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
b7c0: 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d  wInitialSize>dwM
b7d0: 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20  aximumSize ){.  
b7e0: 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a      dwInitialSiz
b7f0: 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  e = dwMaximumSiz
b800: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  e;.    }.    pWi
b810: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
b820: 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53  = osHeapCreate(S
b830: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b840: 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
b870: 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d  InitialSize, dwM
b880: 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20  aximumSize);.   
b890: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
b8a0: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
b8b0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b8c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20  LITE_NOMEM,.    
b8d0: 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f        "failed to
b8e0: 20 48 65 61 70 43 72 65 61 74 65 20 28 25 6c 75   HeapCreate (%lu
b8f0: 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69  ), flags=%u, ini
b900: 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69  tSize=%lu, maxSi
b910: 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20  ze=%lu",.       
b920: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
b930: 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  r(), SQLITE_WIN3
b940: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77  2_HEAP_FLAGS, dw
b950: 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20  InitialSize,.   
b960: 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d         dwMaximum
b970: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
b980: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
b9a0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
b9b0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
b9c0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
b9d0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
b9e0: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
b9f0: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
ba00: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
ba10: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
ba20: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
ba30: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
ba40: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
ba50: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
ba60: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c  tProcessHeap (%l
ba70: 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  u)", osGetLastEr
ba80: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
ba90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
baa0: 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61  .  }.  pWinMemDa
bab0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
bac0: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  SE;.  assert( !p
bad0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bae0: 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ed );.#endif.  a
baf0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bb00: 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a  ta->hHeap!=0 );.
bb10: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bb20: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
bb30: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
bb40: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
bb50: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
bb60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
bb70: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
bb80: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
bb90: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
bba0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
bbb0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bbc0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
bbd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
bbe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bbf0: 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c  ./*.** Deinitial
bc00: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
bc10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bc20: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
bc30: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
bc40: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
bc50: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
bc60: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
bc70: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
bc80: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
bc90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
bca0: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d  MemData->magic1=
bcb0: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
bcc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
bcd0: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d  MemData->magic2=
bce0: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29  =WINMEM_MAGIC2 )
bcf0: 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  ;..  if( pWinMem
bd00: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
bd10: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
bd20: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
bd30: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
bd40: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
bd50: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
bd60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
bd70: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
bd80: 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28  ATE).    assert(
bd90: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
bda0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bdb0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bdc0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
bdd0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  L) );.#endif.   
bde0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
bdf0: 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20  ->bOwned ){.    
be00: 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73    if( !osHeapDes
be10: 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61  troy(pWinMemData
be20: 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20  ->hHeap) ){.    
be30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
be40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
be50: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73  ailed to HeapDes
be60: 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70  troy (%lu), heap
be70: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
be80: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
be90: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
bea0: 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  d*)pWinMemData->
beb0: 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a  hHeap);.      }.
bec0: 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74        pWinMemDat
bed0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53  a->bOwned = FALS
bee0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  E;.    }.    pWi
bef0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
bf00: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = NULL;.  }.}../
bf10: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
bf20: 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f  e low-level memo
bf30: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75  ry allocation fu
bf40: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  nction pointers 
bf50: 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f  in.** sqlite3Glo
bf60: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68  balConfig.m with
bf70: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
bf80: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
bf90: 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61  s file. The.** a
bfa0: 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79  rguments specify
bfb0: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65   the block of me
bfc0: 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a  mory to manage..
bfd0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
bfe0: 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
bff0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d by sqlite3_con
c000: 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65  fig(), and there
c010: 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72  fore.** is not r
c020: 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68  equired to be th
c030: 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20  readsafe (it is 
c040: 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  not)..*/.const s
c050: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
c060: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
c070: 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20  tWin32(void){.  
c080: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
c090: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
c0a0: 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d   winMemMethods =
c0b0: 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c   {.    winMemMal
c0c0: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46  loc,.    winMemF
c0d0: 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ree,.    winMemR
c0e0: 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  ealloc,.    winM
c0f0: 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d  emSize,.    winM
c100: 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77  emRoundup,.    w
c110: 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77  inMemInit,.    w
c120: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20  inMemShutdown,. 
c130: 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61     &win_mem_data
c140: 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26  .  };.  return &
c150: 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d  winMemMethods;.}
c160: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  ..void sqlite3Me
c170: 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64  mSetDefault(void
c180: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  ){.  sqlite3_con
c190: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
c1a0: 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65  G_MALLOC, sqlite
c1b0: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b  3MemGetWin32());
c1c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c1d0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
c1e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65   */../*.** Conve
c1f0: 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  rt a UTF-8 strin
c200: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
c210: 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29  nicode (UTF-16?)
c220: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
c230: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
c240: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
c250: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
c260: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
c270: 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  STR winUtf8ToUni
c280: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
c290: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
c2a0: 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53  nt nChar;.  LPWS
c2b0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
c2c0: 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d  ;..  nChar = osM
c2d0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
c2e0: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
c2f0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
c300: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
c310: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
c320: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
c330: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  ideFilename = sq
c340: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
c350: 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57   nChar*sizeof(zW
c360: 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  ideFilename[0]) 
c370: 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69  );.  if( zWideFi
c380: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
c390: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c3a0: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
c3b0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
c3c0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
c3d0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46  name, -1, zWideF
c3e0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b           nChar);
c410: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
c420: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c430: 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  ree(zWideFilenam
c440: 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c  e);.    zWideFil
c450: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
c460: 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c   return zWideFil
c470: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
c480: 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66  Convert Microsof
c490: 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46  t Unicode to UTF
c4a0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
c4b0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
c4c0: 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74  string is.** obt
c4d0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
c4e0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
c4f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
c500: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50  UnicodeToUtf8(LP
c510: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
c520: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
c530: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
c540: 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  name;..  nByte =
c550: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
c560: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
c570: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
c580: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
c590: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
c5a0: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
c5b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
c5c0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
c5d0: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
c5e0: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
c5f0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
c600: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
c610: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
c620: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
c630: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
c640: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
c650: 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ame, nByte,.    
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
c680: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
c690: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
c6a0: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
c6b0: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
c6c0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
c6d0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
c6e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
c6f0: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74  an ANSI string t
c700: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
c710: 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ode, based on th
c720: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64  e.** current cod
c730: 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66  epage settings f
c740: 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a  or file apis..**
c750: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c760: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c770: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c780: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
c790: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  3_malloc..*/.sta
c7a0: 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62  tic LPWSTR winMb
c7b0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
c7c0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
c7d0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
c7e0: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46  .  LPWSTR zMbcsF
c7f0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
c800: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
c810: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
c820: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
c830: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
c840: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c850: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
c860: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
c870: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28        0)*sizeof(
c8a0: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42  WCHAR);.  if( nB
c8b0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  yte==0 ){.    re
c8c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  turn 0;.  }.  zM
c8d0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  bcsFilename = sq
c8e0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
c8f0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
c900: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
c910: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
c920: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
c930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c940: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
c950: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
c960: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
c970: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
c980: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
c9b0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
c9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c9d0: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
c9e0: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
c9f0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
ca00: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
ca10: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
ca20: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
ca30: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
ca40: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
ca50: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
ca60: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
ca70: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
ca80: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
ca90: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
caa0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cab0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
cac0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
cad0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
cae0: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
caf0: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
cb00: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
cb10: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
cb20: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
cb30: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
cb40: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
cb50: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
cb60: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
cb70: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
cb80: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
cb90: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
cba0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
cbb0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
cbc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cbd0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
cbe0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
cbf0: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
cc00: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
cc10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cc20: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
cc30: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
cc40: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
cc50: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
cc60: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
cc70: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
cca0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
ccb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
ccc0: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
ccd0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
cce0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
ccf0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
cd00: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
cd10: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
cd20: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
cd30: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
cd40: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
cd50: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cd60: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cd70: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
cd80: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
cd90: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
cda0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
cdb0: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
cdc0: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
cdd0: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
cde0: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
cdf0: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
ce00: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
ce10: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
ce20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ce30: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55    }.  zFilenameU
ce40: 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  tf8 = winUnicode
ce50: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
ce60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
ce70: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
ce80: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
ce90: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
cea0: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
ceb0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
cec0: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
ced0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
cee0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
cef0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
cf00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cf10: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  )..*/.char *sqli
cf20: 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
cf30: 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61  o_mbcs(const cha
cf40: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
cf50: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cf60: 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Mbcs;.  LPWSTR z
cf70: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
cf80: 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f  Wide = winUtf8To
cf90: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
cfa0: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
cfb0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
cfc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
cfd0: 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e  lenameMbcs = win
cfe0: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  UnicodeToMbcs(zT
cff0: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
d000: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
d010: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
d020: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a  enameMbcs;.}../*
d030: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d040: 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20  n sets the data 
d050: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65  directory or the
d060: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
d070: 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  tory based on.**
d080: 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72   the provided ar
d090: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79  guments.  The ty
d0a0: 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  pe argument must
d0b0: 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74   be 1 in order t
d0c0: 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o set the.** dat
d0d0: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32  a directory or 2
d0e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74   in order to set
d0f0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
d100: 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a  irectory.  The z
d110: 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  Value.** argumen
d120: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
d130: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
d140: 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75  o use.  The retu
d150: 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  rn value will be
d160: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
d170: 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
d180: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
d190: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
d1a0: 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57  DWORD type, LPCW
d1b0: 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63  STR zValue){.  c
d1c0: 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72  har **ppDirector
d1d0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
d1e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
d1f0: 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  NIT.  int rc = s
d200: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
d210: 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
d220: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
d230: 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51  f.  if( type==SQ
d240: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
d250: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
d260: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
d270: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74  y = &sqlite3_dat
d280: 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  a_directory;.  }
d290: 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53  else if( type==S
d2a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
d2b0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
d2c0: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
d2d0: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65  ry = &sqlite3_te
d2e0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
d2f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  }.  assert( !ppD
d300: 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65  irectory || type
d310: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  ==SQLITE_WIN32_D
d320: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
d330: 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  PE.          || 
d340: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
d350: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
d360: 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73  Y_TYPE.  );.  as
d370: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
d380: 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d  ry || sqlite3Mem
d390: 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70  debugHasType(*pp
d3a0: 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59  Directory, MEMTY
d3b0: 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66  PE_HEAP) );.  if
d3c0: 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b  ( ppDirectory ){
d3d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75  .    char *zValu
d3e0: 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69  eUtf8 = 0;.    i
d3f0: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61  f( zValue && zVa
d400: 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lue[0] ){.      
d410: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e  zValueUtf8 = win
d420: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56  UnicodeToUtf8(zV
d430: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20  alue);.      if 
d440: 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20  ( zValueUtf8==0 
d450: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d460: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d480: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
d490: 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  ppDirectory);.  
d4a0: 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d    *ppDirectory =
d4b0: 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20   zValueUtf8;.   
d4c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d4d0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
d4e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
d4f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ./*.** The retur
d500: 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65  n value of winGe
d510: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
d520: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
d530: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
d540: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
d550: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
d560: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
d570: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
d580: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
d590: 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
d5a0: 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52  astErrorMsg(DWOR
d5b0: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74  D lastErrno, int
d5c0: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
d5d0: 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
d5e0: 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
d5f0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
d600: 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
d610: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
d620: 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
d630: 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
d640: 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
d650: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
d660: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
d670: 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
d680: 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
d690: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
d6a0: 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
d6b0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
d6c0: 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20  WINRT.    WCHAR 
d6d0: 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45  zTempWide[SQLITE
d6e0: 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53  _WIN32_MAX_ERRMS
d6f0: 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20  G_CHARS+1];.    
d700: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
d710: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
d720: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
d730: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
d760: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
d770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
d790: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57            zTempW
d800: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
d830: 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c  AX_ERRMSG_CHARS,
d840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
d860: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53  ;.#else.    LPWS
d870: 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e  TR zTempWide = N
d880: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
d890: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
d8a0: 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  W(FORMAT_MESSAGE
d8b0: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
d8c0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
d8f0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
d920: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
d930: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
d980: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70   (LPWSTR) &zTemp
d9d0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20     0);.#endif.  
da20: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
da30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
da40: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
da50: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
da60: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
da70: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
da80: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
da90: 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  t = winUnicodeTo
daa0: 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
dab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
dac0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
dad0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
dae0: 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66  WINRT.      /* f
daf0: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
db00: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
db10: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
db20: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
db30: 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29  lFree(zTempWide)
db40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
db50: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
db60: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
db70: 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
db80: 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a   *zTemp = NULL;.
db90: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
dba0: 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52  rmatMessageA(FOR
dbb0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
dbc0: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
dbf0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
dc00: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
dc30: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
dc40: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53              (LPS
dcd0: 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20  TR) &zTemp,.    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
dd20: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
dd30: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
dd40: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
dd50: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
dd60: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
dd70: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
dd80: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
dd90: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
dda0: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
ddb0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
ddc0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
ddd0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
dde0: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
ddf0: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
de00: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
de10: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
de20: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
de30: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
de40: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
de50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
de60: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
de70: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
de80: 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45  lx (%lu)", lastE
de90: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
dea0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
deb0: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
dec0: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
ded0: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
dee0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
def0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
df00: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
df10: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
df20: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
df30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
df40: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
df50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
df60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
df70: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
df80: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
df90: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
dfa0: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
dfb0: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
dfc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dfd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
dfe0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
dff0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
e000: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
e010: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
e020: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
e030: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
e040: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
e050: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
e060: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
e070: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
e080: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
e090: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
e0a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
e0b0: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
e0c0: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
e0d0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
e0e0: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
e0f0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e100: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
e110: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
e120: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
e130: 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20  NTOPEN)..** The 
e140: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
e150: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
e160: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
e170: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
e180: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
e190: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
e1a0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
e1b0: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
e1c0: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
e1d0: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
e1e0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
e1f0: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
e200: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
e210: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
e220: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
e250: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
e260: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
e270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
e280: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
e290: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e2a0: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
e2b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
e2c0: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
e2d0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
e2e0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e300: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
e310: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
e320: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
e350: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
e360: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
e370: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
e380: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
e390: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
e3a0: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
e3b0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e3e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
e3f0: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69  Msg[0] = 0;.  wi
e400: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
e410: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
e420: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
e430: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
e440: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
e450: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
e460: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
e470: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
e480: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
e490: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
e4a0: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
e4b0: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
e4c0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
e4d0: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
e4e0: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
e4f0: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
e500: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
e510: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
e520: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
e530: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
e540: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
e550: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
e560: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
e570: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
e580: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
e590: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
e5a0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
e5b0: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
e5c0: 79 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61  y caused by.** a
e5d0: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
e5e0: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
e5f0: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
e600: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
e610: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
e620: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
e630: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
e640: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
e650: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e660: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
e670: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e680: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
e690: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e6a0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e6b0: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
e6c0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
e6d0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
e6e0: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
e6f0: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
e700: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
e710: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e720: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
e730: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
e740: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
e750: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
e760: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69  ;../*.** The "wi
e770: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
e780: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
e790: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
e7a0: 20 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a   particular I/O.
e7b0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62  ** error code ob
e7c0: 74 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61  tained via GetLa
e7d0: 73 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69  stError() is eli
e7e0: 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72  gible to be retr
e7f0: 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74  ied.  It.** must
e800: 20 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f   accept the erro
e810: 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20  r code DWORD as 
e820: 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  its only argumen
e830: 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74  t and should ret
e840: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  urn.** non-zero 
e850: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
e860: 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69  e is transient i
e870: 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65  n nature and the
e880: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65   operation.** re
e890: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65  sponsible for ge
e8a0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69  nerating the ori
e8b0: 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68  ginal error migh
e8c0: 74 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62  t succeed upon b
e8d0: 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e  eing.** retried.
e8e0: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74    The argument t
e8f0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f  o this macro sho
e900: 75 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c  uld be a variabl
e910: 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f  e..**.** Additio
e920: 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e  nally, a macro n
e930: 61 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61  amed "winIoerrCa
e940: 6e 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20  nRetry2" may be 
e950: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a  defined.  If it.
e960: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69  ** is defined, i
e970: 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c  t will be consul
e980: 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ted only when th
e990: 65 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72  e macro "winIoer
e9a0: 72 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72  rCanRetry1".** r
e9b0: 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68  eturns zero.  Th
e9c0: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
e9d0: 74 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63  try2" macro is c
e9e0: 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e  ompletely option
e9f0: 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65  al and.** may be
ea00: 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   used to include
ea10: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f   additional erro
ea20: 72 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  r codes in the s
ea30: 65 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  et that should.*
ea40: 2a 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  * result in the 
ea50: 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72  failing I/O oper
ea60: 61 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72  ation being retr
ea70: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
ea80: 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65  r.  If.** define
ea90: 64 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72  d, the "winIoerr
eaa0: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
eab0: 20 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78   must exhibit ex
eac0: 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73  ternal semantics
ead0: 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f  .** identical to
eae0: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77   those of the "w
eaf0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
eb00: 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  " macro..*/.#if 
eb10: 21 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72  !defined(winIoer
eb20: 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66  rCanRetry1).#def
eb30: 69 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  ine winIoerrCanR
eb40: 65 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d  etry1(a) (((a)==
eb50: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
eb60: 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c  IED)        || \
eb70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
eb90: 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49  (a)==ERROR_SHARI
eba0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20  NG_VIOLATION)   
ebb0: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
ebe0: 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20  LOCK_VIOLATION) 
ebf0: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
ec20: 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49  RROR_DEV_NOT_EXI
ec30: 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ST)        || \.
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
ec60: 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d  a)==ERROR_NETNAM
ec70: 45 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20  E_DELETED)      
ec80: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
ecb0: 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20  EM_TIMEOUT)     
ecc0: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
ecf0: 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45  ROR_NETWORK_UNRE
ed00: 41 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66  ACHABLE)).#endif
ed10: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
ed20: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
ed30: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
ed40: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
ed50: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
ed60: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
ed70: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
ed80: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
ed90: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
eda0: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
edb0: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
edc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
edd0: 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70  etryIoerr(int *p
ede0: 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70  nRetry, DWORD *p
edf0: 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20  Error){.  DWORD 
ee00: 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  e = osGetLastErr
ee10: 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52  or();.  if( *pnR
ee20: 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65  etry>=winIoerrRe
ee30: 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
ee40: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
ee50: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
ee60: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
ee70: 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65    }.  if( winIoe
ee80: 72 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29  rrCanRetry1(e) )
ee90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
eea0: 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65  n32_sleep(winIoe
eeb0: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
eec0: 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
eed0: 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
eee0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69  return 1;.  }.#i
eef0: 66 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65  f defined(winIoe
ef00: 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65  rrCanRetry2).  e
ef10: 6c 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72  lse if( winIoerr
ef20: 43 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a  CanRetry2(e) ){.
ef30: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
ef40: 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
ef50: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
ef60: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
ef70: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
ef80: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
ef90: 69 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20  if.  if( pError 
efa0: 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  ){.    *pError =
efb0: 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   e;.  }.  return
efc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67   0;.}../*.** Log
efd0: 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74   a I/O error ret
efe0: 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73  ry episode..*/.s
eff0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f  tatic void winLo
f000: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
f010: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
f020: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f030: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
f040: 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64  ,.      "delayed
f050: 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73   %dms for lock/s
f060: 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22  haring conflict"
f070: 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72  ,.      winIoerr
f080: 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72  RetryDelay*nRetr
f090: 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20  y*(nRetry+1)/2. 
f0a0: 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66     );.  }.}..#if
f0b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
f0c0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
f110: 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
f120: 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
f130: 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  nCE only..*/.#if
f140: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f150: 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f  _MSVC_LOCALTIME_
f160: 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  API) || !SQLITE_
f170: 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41  MSVC_LOCALTIME_A
f180: 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56  PI./*.** The MSV
f190: 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73  C CRT on Windows
f1a0: 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   CE may not have
f1b0: 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66   a localtime() f
f1c0: 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  unction.  So.** 
f1d0: 63 72 65 61 74 65 20 61 20 73 75 62 73 74 69 74  create a substit
f1e0: 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ute..*/.#include
f1f0: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74   <time.h>.struct
f200: 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63   tm *__cdecl loc
f210: 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d  altime(const tim
f220: 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74  e_t *t).{.  stat
f230: 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a  ic struct tm y;.
f240: 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20    FILETIME uTm, 
f250: 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d  lTm;.  SYSTEMTIM
f260: 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33  E pTm;.  sqlite3
f270: 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36  _int64 t64;.  t6
f280: 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20  4 = *t;.  t64 = 
f290: 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36  (t64 + 116444736
f2a0: 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20  00)*10000000;.  
f2b0: 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  uTm.dwLowDateTim
f2c0: 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  e = (DWORD)(t64 
f2d0: 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20  & 0xFFFFFFFF);. 
f2e0: 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54   uTm.dwHighDateT
f2f0: 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34  ime= (DWORD)(t64
f300: 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c   >> 32);.  osFil
f310: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
f320: 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b  Time(&uTm,&lTm);
f330: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  .  osFileTimeToS
f340: 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26  ystemTime(&lTm,&
f350: 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61  pTm);.  y.tm_yea
f360: 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20  r = pTm.wYear - 
f370: 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e  1900;.  y.tm_mon
f380: 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20   = pTm.wMonth - 
f390: 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d  1;.  y.tm_wday =
f3a0: 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b   pTm.wDayOfWeek;
f3b0: 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70  .  y.tm_mday = p
f3c0: 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f  Tm.wDay;.  y.tm_
f3d0: 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72  hour = pTm.wHour
f3e0: 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70  ;.  y.tm_min = p
f3f0: 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e  Tm.wMinute;.  y.
f400: 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65  tm_sec = pTm.wSe
f410: 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26  cond;.  return &
f420: 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  y;.}.#endif..#de
f430: 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  fine HANDLE_TO_W
f440: 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69  INFILE(a) (winFi
f450: 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b  le*)&((char*)a)[
f460: 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77  -(int)offsetof(w
f470: 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a  inFile,h)]../*.*
f480: 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b  * Acquire a lock
f490: 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68   on the handle h
f4a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f4b0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
f4c0: 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20  e(HANDLE h){.   
f4d0: 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20  DWORD dwErr;.   
f4e0: 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20  do {.     dwErr 
f4f0: 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
f500: 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e  eObject(h, INFIN
f510: 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65  ITE);.   } while
f520: 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f   (dwErr != WAIT_
f530: 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72  OBJECT_0 && dwEr
f540: 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f  r != WAIT_ABANDO
f550: 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  NED);.}./*.** Re
f560: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71  lease a lock acq
f570: 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75  uired by winceMu
f580: 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a  texAcquire().*/.
f590: 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74  #define winceMut
f5a0: 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c  exRelease(h) Rel
f5b0: 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a  easeMutex(h)../*
f5c0: 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d  .** Create the m
f5d0: 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20  utex and shared 
f5e0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20  memory used for 
f5f0: 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66  locking in the f
f600: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
f610: 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  r pFile.*/.stati
f620: 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74  c int winceCreat
f630: 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
f640: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
f650: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
f660: 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
f670: 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44  PWSTR zName;.  D
f680: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
f690: 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d    BOOL bLogged =
f6a0: 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62   FALSE;.  BOOL b
f6b0: 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20  Init = TRUE;..  
f6c0: 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54  zName = winUtf8T
f6d0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
f6e0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
f6f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
f700: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
f710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f720: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
f730: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
f740: 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
f750: 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
f760: 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
f770: 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
f780: 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
f790: 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
f7a0: 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
f7b0: 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
f7c0: 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
f7d0: 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
f7e0: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
f7f0: 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
f800: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
f810: 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
f820: 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
f830: 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
f840: 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
f850: 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
f860: 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
f870: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
f880: 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
f890: 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
f8a0: 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
f8b0: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
f8c0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f8d0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
f8e0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
f8f0: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
f900: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
f910: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f920: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f930: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f940: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
f950: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
f960: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  Filename);.  }..
f970: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
f980: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
f990: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
f9a0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
f9b0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
f9c0: 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
f9d0: 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
f9e0: 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
f9f0: 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
fa00: 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20 63  s etc are.  ** c
fa10: 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
fa20: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
fa30: 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
fa40: 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
fa50: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
fa60: 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
fa70: 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
fa80: 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
fa90: 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
faa0: 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
fab0: 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
fac0: 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
fad0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
fae0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb10: 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
fb20: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
fb30: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
fb60: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ame);..  /* Set 
fb70: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
fb80: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
fb90: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
fba0: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
fbb0: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
fbc0: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
fbd0: 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  /.  lastErrno = 
fbe0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
fbf0: 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e  ;.  if (lastErrn
fc00: 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  o == ERROR_ALREA
fc10: 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
fc20: 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
fc30: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
fc40: 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  ee(zName);..  /*
fc50: 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64   If we succeeded
fc60: 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73   in making the s
fc70: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
fc80: 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a  dle, map it. */.
fc90: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
fca0: 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c  ared ){.    pFil
fcb0: 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
fcc0: 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65  ceLock*)osMapVie
fcd0: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
fce0: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
fcf0: 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45       FILE_MAP_RE
fd00: 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  AD|FILE_MAP_WRIT
fd10: 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  E, 0, 0, sizeof(
fd20: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20  winceLock));.   
fd30: 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66   /* If mapping f
fd40: 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65  ailed, close the
fd50: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
fd60: 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20  andle and erase 
fd70: 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  it */.    if( !p
fd80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a  File->shared ){.
fd90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
fda0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
fdb0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
fdc0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fdd0: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
fde0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fe00: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32  winceCreateLock2
fe10: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
fe20: 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
fe30: 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  RUE;.      osClo
fe40: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
fe50: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
fe60: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
fe70: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
fe80: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
fe90: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
fea0: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
feb0: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
fec0: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
fed0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
fee0: 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  red==NULL ){.   
fef0: 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b   if( !bLogged ){
ff00: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
ff10: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
ff20: 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  rno;.      winLo
ff30: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
ff40: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
ff50: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
ff60: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
ff70: 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69  reateLock3", zFi
ff80: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
ff90: 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
ffa0: 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75     }.    winceMu
ffb0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
ffc0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
ffd0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
ffe0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
fff0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
10000 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
10010 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
10020 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
10030 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
10040 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
10050 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
10060 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20   if( bInit ){.  
10070 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
10080 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
10090 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
100a0 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
100b0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
100c0 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
100d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
100e0 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
100f0 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
10100 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
10110 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
10120 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
10130 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
10140 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
10150 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
10160 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
10170 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
10180 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
10190 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
101a0 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
101b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
101c0 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
101d0 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
101e0 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
101f0 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
10200 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
10210 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
10220 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
10230 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
10240 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
10250 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10260 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
10270 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
10280 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10290 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
102a0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
102b0 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
102c0 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
102d0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
102e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
102f0 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
10300 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
10310 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10320 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
10330 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
10340 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
10350 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
10360 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
10370 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
10380 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
10390 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
103a0 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
103b0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
103c0 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
103d0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
103e0 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
103f0 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
10400 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
10410 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
10420 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
10430 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
10440 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
10450 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
10460 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
10470 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
10480 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10490 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
104a0 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
104b0 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
104c0 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
104d0 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
104e0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
104f0 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
10500 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
10510 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
10520 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
10530 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
10540 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10550 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
10560 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
10570 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
10580 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
10590 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
105a0 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
105b0 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
105c0 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
105d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
105e0 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
105f0 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
10600 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
10610 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
10620 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
10630 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
10640 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
10650 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
10660 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
10670 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
10680 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
10690 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
106a0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
106b0 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
106c0 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
106d0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
106e0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
106f0 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
10700 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
10710 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
10720 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
10730 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
10740 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
10750 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
10760 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
10770 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
10780 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
10790 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
107a0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
107b0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
107c0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
107d0 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
107e0 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
107f0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10800 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
10810 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10820 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
10830 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10840 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
10850 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
10860 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10870 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
10880 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
10890 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
108a0 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
108b0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
108c0 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
108d0 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
108e0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
108f0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
10900 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
10910 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
10920 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
10930 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
10940 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
10950 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
10960 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
10970 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
10980 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
10990 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
109a0 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
109b0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
109c0 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
109d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
109e0 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
109f0 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
10a00 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10a10 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
10a20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
10a30 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
10a40 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
10a50 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
10a60 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
10a70 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
10a80 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
10a90 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
10aa0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
10ab0 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
10ac0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10ad0 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
10ae0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10af0 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
10b00 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
10b10 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10b20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
10b30 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
10b40 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
10b50 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
10b60 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
10b70 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
10b80 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
10b90 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
10ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
10bb0 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
10bc0 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
10bd0 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
10be0 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
10bf0 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
10c00 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
10c10 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
10c20 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
10c30 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10c40 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
10c50 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
10c60 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
10c70 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
10c80 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
10c90 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
10ca0 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
10cb0 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
10cc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10cd0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10ce0 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
10cf0 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
10d00 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
10d10 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
10d20 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
10d30 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
10d40 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
10d50 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
10d60 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
10d70 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
10d80 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
10d90 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
10da0 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
10db0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
10dc0 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
10dd0 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
10de0 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
10df0 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
10e00 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
10e10 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
10e20 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
10e30 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10e40 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
10e50 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10e60 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
10e70 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
10e80 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
10e90 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
10ea0 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
10eb0 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
10ec0 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
10ed0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
10ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
10ef0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10f00 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
10f10 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20  )SHARED_SIZE.   
10f20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75            || nNu
10f30 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10f40 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
10f50 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
10f60 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
10f70 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10f80 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
10f90 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
10fa0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10fb0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
10fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
10fd0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10fe0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
10ff0 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
11000 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
11010 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
11020 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
11030 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20  ENDING_BYTE.    
11040 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
11050 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11060 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
11070 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11080 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
11090 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
110a0 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
110b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
110c0 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
110d0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
110e0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
110f0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
11100 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
11110 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
11120 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
11130 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
11140 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20  SERVED_BYTE.    
11150 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
11160 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11170 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
11180 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11190 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20  bReserved) {.   
111a0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
111b0 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
111c0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
111d0 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
111e0 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
111f0 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
11200 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
11210 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
11220 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11230 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
11240 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
11250 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
11260 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
11270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
112c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
112d0 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  INCE */../*.** L
112e0 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
112f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  n..*/.static BOO
11300 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20  L winLockFile(. 
11310 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
11320 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c  ,.  DWORD flags,
11330 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
11340 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
11350 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
11360 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
11370 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
11380 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
11390 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
113a0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
113b0 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
113c0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
113d0 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
113e0 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
113f0 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c       API LockFil
11400 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
11410 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70   winceLockFile(p
11420 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
11430 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
11460 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
11470 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
11480 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
11490 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
114a0 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
114b0 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
114c0 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
114d0 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
114e0 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
114f0 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
11500 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
11510 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a  n osLockFileEx(*
11520 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30  phFile, flags, 0
11530 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e  , numBytesLow, n
11540 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76  umBytesHigh, &ov
11550 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
11560 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
11570 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
11580 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
11590 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
115a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
115b0 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
115c0 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
115d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
115e0 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
115f0 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20   */.static BOOL 
11600 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  winUnlockFile(. 
11610 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
11620 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
11630 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
11640 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
11650 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
11660 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
11670 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
11680 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
11690 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
116a0 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
116b0 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
116c0 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
116d0 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
116e0 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b        API Unlock
116f0 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11700 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  urn winceUnlockF
11710 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
11720 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
11730 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
11740 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
11750 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
11760 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
11770 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
11780 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
11790 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
117a0 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
117b0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
117c0 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
117d0 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
117e0 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
117f0 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
11800 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63    return osUnloc
11810 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
11820 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
11830 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
11840 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
11850 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c      return osUnl
11860 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
11870 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
11880 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
11890 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
118b0 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
118c0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  #endif.}../*****
118d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11910 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
11920 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
11930 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
11940 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
11950 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
11960 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
11970 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
11980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
119d0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72  ./*.** Some Micr
119e0 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20  osoft compilers 
119f0 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69  lack this defini
11a00 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
11a10 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
11a20 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69  E_POINTER.# defi
11a30 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ne INVALID_SET_F
11a40 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57  ILE_POINTER ((DW
11a50 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
11a60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
11a70 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
11a80 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
11a90 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
11aa0 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
11ab0 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
11ac0 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
11ad0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
11ae0 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ful, return 0..*
11af0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
11b00 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11b10 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
11b20 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
11b30 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65   int winSeekFile
11b40 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
11b50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11b60 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51  Offset){.#if !SQ
11b70 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
11b80 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
11bb0 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
11bc0 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
11bd0 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
11be0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
11bf0 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
11c00 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
11c10 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
11c40 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
11c50 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52  nter() */.  DWOR
11c60 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
11c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
11c80 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
11c90 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
11ca0 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  */..  OSTRACE(("
11cb0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66  SEEK file=%p, of
11cc0 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46  fset=%lld\n", pF
11cd0 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29  ile->h, iOffset)
11ce0 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20  );..  upperBits 
11cf0 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65  = (LONG)((iOffse
11d00 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
11d10 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  fff);.  lowerBit
11d20 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73  s = (LONG)(iOffs
11d30 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
11d40 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69  ;..  /* API oddi
11d50 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75  ty: If successfu
11d60 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  l, SetFilePointe
11d70 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77  r() returns a dw
11d80 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ord.  ** contain
11d90 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
11da0 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
11db0 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
11dc0 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
11dd0 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
11de0 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
11df0 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
11e00 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
11e10 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44  DN,.  ** INVALID
11e20 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
11e30 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20  R may also be a 
11e40 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74  valid new offset
11e50 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e  . So to determin
11e60 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61  e.  ** whether a
11e70 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
11e80 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69  ally occurred, i
11e90 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
11ea0 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  ary to call.  **
11eb0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e   GetLastError().
11ec0 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20  .  */.  dwRet = 
11ed0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
11ee0 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72  (pFile->h, lower
11ef0 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
11f00 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
11f10 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e    if( (dwRet==IN
11f20 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
11f30 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20  OINTER.      && 
11f40 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
11f50 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
11f60 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20  =NO_ERROR)) ){. 
11f70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11f80 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
11f90 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
11fa0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
11fb0 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
11fc0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11fd0 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
11fe0 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
11ff0 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
12000 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
12010 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
12020 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
12030 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
12040 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
12050 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12060 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12070 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12080 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
12090 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20  .  /*.  ** Same 
120a0 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  as above, except
120b0 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65   that this imple
120c0 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20  mentation works 
120d0 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a  for WinRT..  */.
120e0 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  .  LARGE_INTEGER
120f0 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
12100 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66     /* The new of
12110 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  fset */.  BOOL b
12120 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
12130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12140 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
12150 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
12160 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61  ) */..  x.QuadPa
12170 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20  rt = iOffset;.  
12180 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  bRet = osSetFile
12190 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d  PointerEx(pFile-
121a0 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42  >h, x, 0, FILE_B
121b0 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52  EGIN);..  if(!bR
121c0 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  et){.    pFile->
121d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
121e0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
121f0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
12200 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
12210 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12220 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12230 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22     "winSeekFile"
12240 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
12250 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
12260 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
12270 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
12280 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12290 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
122a0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
122b0 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
122c0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
122d0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
122e0 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
122f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12300 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20  _MMAP_SIZE>0./* 
12310 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
12320 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
12330 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
12340 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  r memory mapped 
12350 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
12360 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
12370 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  inFile*, sqlite3
12380 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20  _int64);.static 
12390 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
123a0 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64  (winFile*);.#end
123b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
123c0 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
123d0 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
123e0 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
123f0 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
12400 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
12410 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
12420 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
12430 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
12440 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
12450 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
12460 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
12470 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
12480 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
12490 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
124a0 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
124b0 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
124c0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
124d0 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
124e0 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
124f0 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
12500 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
12510 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
12520 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
12530 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
12540 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
12550 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
12560 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
12570 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
12580 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12590 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
125a0 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
125b0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
125c0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
125d0 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
125e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
125f0 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
12600 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
12610 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
12620 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20   pFile->h!=NULL 
12630 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56  && pFile->h!=INV
12640 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
12650 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  E );.  OSTRACE((
12660 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 5c 6e  "CLOSE file=%p\n
12670 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a  ", pFile->h));..
12680 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
12690 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
126a0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
126b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a  ;.#endif..  do{.
126c0 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65      rc = osClose
126d0 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29  Handle(pFile->h)
126e0 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74  ;.    /* Simulat
126f0 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20  eIOError( rc=0; 
12700 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  cnt=MX_CLOSE_ATT
12710 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77  EMPT; ); */.  }w
12720 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b  hile( rc==0 && +
12730 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f  +cnt < MX_CLOSE_
12740 41 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69  ATTEMPT && (sqli
12750 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
12760 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20  100), 1) );.#if 
12770 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
12780 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45  #define WINCE_DE
12790 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20  LETION_ATTEMPTS 
127a0 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79  3.  winceDestroy
127b0 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69  Lock(pFile);.  i
127c0 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  f( pFile->zDelet
127d0 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20  eOnClose ){.    
127e0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
127f0 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20   while(.        
12800 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57     osDeleteFileW
12810 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
12820 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20  nClose)==0.     
12830 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41     && osGetFileA
12840 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65  ttributesW(pFile
12850 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
12860 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20  )!=0xffffffff.  
12870 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
12880 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
12890 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
128a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
128b0 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
128c0 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
128d0 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
128e0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
128f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12900 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
12910 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
12920 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
12930 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
12940 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
12950 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53  ounter(-1);.  OS
12960 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69  TRACE(("CLOSE fi
12970 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
12980 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20   pFile->h, rc ? 
12990 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
129a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
129b0 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
129c0 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
129d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
129e0 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
129f0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
12a20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12a30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
12a40 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
12a50 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
12a60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
12a70 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
12a80 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
12a90 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
12aa0 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
12ab0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
12ac0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
12ad0 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
12ae0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
12af0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
12b00 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
12b10 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
12b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
12b30 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
12b40 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
12b50 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b70 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
12b80 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
12b90 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
12ba0 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
12bb0 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
12bc0 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
12bd0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
12be0 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
12bf0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
12c00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
12c10 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
12c20 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
12c30 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12c40 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
12c50 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
12c60 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
12c90 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
12ca0 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
12cb0 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
12cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12cd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
12ce0 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
12cf0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
12d00 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
12d10 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
12d20 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
12d30 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
12d50 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
12d60 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75  READ file=%p, bu
12d70 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
12d80 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
12d90 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
12da0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
12db0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
12dc0 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
12dd0 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
12de0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
12df0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
12e00 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
12e10 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
12e20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
12e30 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
12e40 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
12e50 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
12e60 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
12e70 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
12e80 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
12e90 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
12ea0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
12eb0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
12ec0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
12ed0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
12ee0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
12ef0 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  ], amt);.      O
12f00 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d  STRACE(("READ-MM
12f10 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
12f20 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
12f30 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
12f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12f50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12f60 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
12f70 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
12f80 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
12f90 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
12fa0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
12fb0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
12fc0 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
12fd0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
12fe0 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
12ff0 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
13000 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
13010 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
13020 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13030 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13040 4e 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65  NCE.  if( winSee
13050 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
13060 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52  set) ){.    OSTR
13070 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
13080 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
13090 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  LL\n", pFile->h)
130a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
130b0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
130c0 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
130d0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
130e0 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
130f0 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
13100 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
13110 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
13120 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
13130 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
13140 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
13150 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
13160 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13170 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
13180 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
13190 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
131a0 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
131b0 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
131c0 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
131d0 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
131e0 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
131f0 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
13200 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
13210 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
13220 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
13230 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
13240 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
13250 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
13260 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13270 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
13280 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
13290 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
132a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
132b0 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
132c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
132d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
132e0 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
132f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
13320 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
13330 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72   }.  winLogIoerr
13340 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20  (nRetry);.  if( 
13350 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74  nRead<(DWORD)amt
13360 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   ){.    /* Unrea
13370 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
13380 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
13390 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
133a0 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
133b0 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30  )pBuf)[nRead], 0
133c0 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20  , amt-nRead);.  
133d0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
133e0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
133f0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
13400 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  READ\n", pFile->
13410 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13420 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
13430 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
13440 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
13450 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13460 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13470 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
13480 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13490 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
134a0 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
134b0 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
134c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
134d0 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
134e0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
134f0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
13500 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
13510 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
13520 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
13530 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
13540 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
13550 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
13560 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
13570 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
13580 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
13590 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
135c0 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
135d0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
135e0 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
135f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
13600 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
13610 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
13620 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
13630 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13640 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
13650 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
13660 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65  rred, else false
13670 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
13680 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
13690 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
136a0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ndle */.  int nR
136b0 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
136c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
136d0 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a  ber of retries *
136e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  /..  assert( amt
136f0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
13700 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
13710 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
13720 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
13730 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74  RITE);.  Simulat
13740 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72  eDiskfullError(r
13750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
13760 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  L);..  OSTRACE((
13770 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20  "WRITE file=%p, 
13780 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e  buffer=%p, amoun
13790 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  t=%d, offset=%ll
137a0 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  d, lock=%d\n",. 
137b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
137c0 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
137d0 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
137e0 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
137f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
13800 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
13810 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
13820 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
13830 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
13840 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
13850 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
13860 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
13870 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
13880 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
13890 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
138a0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
138b0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
138c0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
138d0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
138e0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
138f0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
13900 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
13910 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
13920 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20  E-MMAP file=%p, 
13930 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
13940 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
13950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13960 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
13970 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
13980 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
13990 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
139a0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
139b0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
139c0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
139d0 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
139e0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
139f0 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
13a00 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
13a10 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
13a20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
13a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13a40 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
13a50 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77  S_WINCE.  rc = w
13a60 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65  inSeekFile(pFile
13a70 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
13a80 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a   rc==0 ){.#else.
13a90 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21    {.#endif.#if !
13aa0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
13ab0 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
13ac0 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
13ad0 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
13ae0 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a  for WriteFile. *
13af0 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  /.#endif.    u8 
13b00 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42  *aRem = (u8 *)pB
13b10 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  uf;        /* Da
13b20 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  ta yet to be wri
13b30 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
13b40 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20  nRem = amt;     
13b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13b60 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74  ber of bytes yet
13b70 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
13b80 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69  /.    DWORD nWri
13b90 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
13ba0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69      /* Bytes wri
13bb0 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69  tten by each Wri
13bc0 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f  teFile() call */
13bd0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
13be0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
13bf0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
13c00 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
13c10 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21  rror() */..#if !
13c20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
13c30 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72      memset(&over
13c40 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f  lapped, 0, sizeo
13c50 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
13c60 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
13c70 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
13c80 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
13c90 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  ff);.    overlap
13ca0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
13cb0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
13cc0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
13cd0 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  f);.#endif..    
13ce0 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b  while( nRem>0 ){
13cf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
13d00 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20 21  INCE.      if( !
13d10 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
13d20 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
13d30 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
13d40 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
13d50 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
13d60 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
13d70 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76  em, &nWrite, &ov
13d80 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e  erlapped) ){.#en
13d90 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
13da0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
13db0 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
13dc0 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
13dd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13de0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13df0 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  rt( nWrite==0 ||
13e00 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29   nWrite<=(DWORD)
13e10 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  nRem );.      if
13e20 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
13e30 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65  Write>(DWORD)nRe
13e40 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  m ){.        las
13e50 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13e60 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
13e70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13e80 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  }.#if !SQLITE_OS
13e90 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66  _WINCE.      off
13ea0 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  set += nWrite;. 
13eb0 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
13ec0 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
13ed0 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
13ee0 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72  fff);.      over
13ef0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
13f00 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
13f10 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
13f20 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ffff);.#endif.  
13f30 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69      aRem += nWri
13f40 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d  te;.      nRem -
13f50 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a  = nWrite;.    }.
13f60 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29      if( nRem>0 )
13f70 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13f80 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
13f90 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
13fa0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
13fb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
13fc0 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61  f(   ( pFile->la
13fd0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48  stErrno==ERROR_H
13fe0 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20  ANDLE_DISK_FULL 
13ff0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46  ).       || ( pF
14000 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
14010 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20  ERROR_DISK_FULL 
14020 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  )){.      OSTRAC
14030 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
14040 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
14050 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  L\n", pFile->h))
14060 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
14070 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
14080 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c  E_FULL, pFile->l
14090 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20     "winWrite1", 
140c0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
140d0 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
140e0 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
140f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14100 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c  R_WRITE\n", pFil
14110 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
14120 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
14130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
14140 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
14150 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14160 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14170 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  Write2", pFile->
14180 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
14190 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
141a0 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20  (nRetry);.  }.  
141b0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
141c0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
141d0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
141e0 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
141f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14200 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
14210 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
14220 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
14230 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
14240 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
14250 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
14260 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
14270 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
14280 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
14290 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
142a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
142b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
142c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
142d0 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74  eturn code for t
142e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
142f0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
14300 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  o;..  assert( pF
14310 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
14320 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
14330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
14340 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43  NCATE);.  OSTRAC
14350 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c  E(("TRUNCATE fil
14360 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c  e=%p, size=%lld,
14370 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
14380 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14390 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e  , nByte, pFile->
143a0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
143b0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
143c0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
143d0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
143e0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
143f0 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
14400 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
14410 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
14420 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
14430 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
14440 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
14450 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
14460 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
14470 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
14480 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
14490 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
144a0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
144b0 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
144c0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
144d0 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
144e0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
144f0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
14500 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f   }..  /* SetEndO
14510 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20  fFile() returns 
14520 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75  non-zero when su
14530 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72  ccessful, or zer
14540 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e  o when it fails.
14550 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65   */.  if( winSee
14560 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79  kFile(pFile, nBy
14570 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  te) ){.    rc = 
14580 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14590 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
145a0 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
145b0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
145c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
145d0 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d  uncate1", pFile-
145e0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
145f0 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64   if( 0==osSetEnd
14600 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
14610 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
14620 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
14630 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
14640 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50  =ERROR_USER_MAPP
14650 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20  ED_FILE) ){.    
14660 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14670 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
14680 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
14690 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
146a0 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
146b0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
146e0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
146f0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
14700 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
14710 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
14720 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
14730 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
14740 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
14750 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20  tly.  ** mapped 
14760 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74  region, reduce t
14770 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70  he effective map
14780 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c  ping size as wel
14790 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20  l. SQLite will. 
147a0 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
147b0 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
147c0 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
147d0 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
147e0 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20   now on..  */.  
147f0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
14800 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70  egion && nByte<p
14810 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
14820 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  {.    pFile->mma
14830 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  pSize = nByte;. 
14840 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54   }.#endif..  OST
14850 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
14860 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
14870 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
14880 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
14890 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
148a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
148b0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
148c0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
148d0 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
148e0 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
148f0 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
14900 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
14910 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
14920 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68  e occuring at th
14930 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
14940 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
14950 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
14960 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
14970 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
14980 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
14990 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
149a0 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
149b0 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
149c0 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ted to disk..*/.
149d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79  static int winSy
149e0 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
149f0 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
14a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14a10 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a  NO_SYNC.  /*.  *
14a20 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e  * Used only when
14a30 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
14a40 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a  is not defined..
14a50 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b     */.  BOOL rc;
14a60 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
14a70 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
14a80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14a90 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20  NO_SYNC) || \.  
14aa0 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54    (defined(SQLIT
14ab0 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
14ac0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14ad0 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  ).  /*.  ** Used
14ae0 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
14af0 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
14b00 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61  ned and by the a
14b10 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20  ssert() and/or. 
14b20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61   ** OSTRACE() ma
14b30 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69  cros..   */.  wi
14b40 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14b50 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c  winFile*)id;.#el
14b60 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
14b70 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69  METER(id);.#endi
14b80 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
14b90 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  le );.  /* Check
14ba0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
14bb0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
14bc0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
14bd0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
14be0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
14bf0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
14c00 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
14c10 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
14c20 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
14c30 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
14c40 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
14c50 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
14c60 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
14c70 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
14c80 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
14c90 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
14ca0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
14cb0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
14cc0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
14cd0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14ce0 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f  ITE_FULL );..  O
14cf0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
14d00 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
14d10 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
14d20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14d30 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e  , flags, pFile->
14d40 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
14d50 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  ndef SQLITE_TEST
14d60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14d70 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73  TER(flags);.#els
14d80 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30  e.  if( (flags&0
14d90 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
14da0 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  C_FULL ){.    sq
14db0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
14dc0 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  ount++;.  }.  sq
14dd0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
14de0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
14df0 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
14e00 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
14e10 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
14e20 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
14e30 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
14e40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
14e50 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28  _SYNC.  OSTRACE(
14e60 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d  ("SYNC-NOP file=
14e70 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14e80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14e90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14ea0 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  _OK;.#else.  rc 
14eb0 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  = osFlushFileBuf
14ec0 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
14ed0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14ee0 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
14ef0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f   if( rc ){.    O
14f00 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
14f10 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
14f20 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
14f30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
14f40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
14f50 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
14f60 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14f70 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14f80 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66  OSTRACE(("SYNC f
14f90 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
14fa0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22  E_IOERR_FSYNC\n"
14fb0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14fc0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
14fd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
14fe0 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  R_FSYNC, pFile->
14ff0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69    "winSync", pFi
15020 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
15030 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15040 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
15050 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
15060 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
15070 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
15080 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
15090 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
150a0 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
150b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
150c0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
150d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
150e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
150f0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
15100 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
15110 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
15120 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
15130 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
15140 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
15150 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
15160 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
15170 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
15180 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
15190 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
151a0 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
151b0 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
151c0 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
151d0 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
151e0 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
151f0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
15220 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
15230 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
15240 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
15250 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
15260 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
15270 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15280 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
15290 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
152a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
152b0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
152c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
152f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
15300 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
15310 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
15320 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
15330 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
15340 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
15350 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
15360 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
15370 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
15380 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
15390 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
153a0 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
153b0 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
153c0 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
153d0 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
153e0 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
153f0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
15400 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
15410 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
15420 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
15430 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15440 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
15450 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
15460 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
15470 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
15480 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
154a0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
154b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
154c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
154d0 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
154e0 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
154f0 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
15500 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
15510 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
15520 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
15530 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
15540 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15550 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
15560 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
15570 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
15580 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
15590 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
155a0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
155b0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
155c0 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
155d0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
155e0 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
155f0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
15600 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
15610 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
15620 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
15630 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
15640 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
15650 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
15660 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
15670 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
15680 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
15690 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
156a0 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
156b0 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
156c0 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
156d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
156e0 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
156f0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
15700 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
15710 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
15720 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
15730 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
15740 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
15750 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
15760 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
15770 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
15780 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
15790 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
157a0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
157b0 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
157c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
157d0 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
157e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
157f0 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
15800 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
15810 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
15840 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
15850 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15860 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
15870 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
15880 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
15890 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
158a0 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
158b0 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
158c0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
158d0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
158e0 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
158f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
15900 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
15910 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
15920 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
15930 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
15940 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
15950 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
15960 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
15970 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
15980 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
15990 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
159a0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
159b0 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
159c0 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
159d0 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c   int winGetReadL
159e0 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
159f0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
15a00 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
15a10 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
15a20 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
15a30 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
15a40 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
15a50 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
15a60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
15a70 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
15a80 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
15a90 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
15aa0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
15ab0 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
15ac0 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
15ad0 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
15ae0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
15af0 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
15b00 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
15b10 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
15b20 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
15b30 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
15b40 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
15b50 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
15b60 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
15b70 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15b80 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
15b90 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
15ba0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
15bb0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
15bc0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
15bd0 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
15be0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
15bf0 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
15c00 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
15c10 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
15c20 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
15c30 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
15c40 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
15c50 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
15c60 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
15c70 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
15c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c90 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
15ca0 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
15cb0 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
15cc0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
15cd0 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
15ce0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
15cf0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
15d00 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
15d10 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
15d20 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
15d30 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
15d40 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
15d50 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
15d60 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
15d70 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e   res));.  return
15d80 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
15d90 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
15da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15db0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
15dc0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
15dd0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
15de0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
15df0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
15e00 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
15e10 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
15e20 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
15e30 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
15e40 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
15e50 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
15e60 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
15e70 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
15e80 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
15e90 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
15ea0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
15eb0 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
15ec0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
15ed0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
15ee0 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
15ef0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
15f00 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
15f10 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
15f20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
15f30 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15f40 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
15f50 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
15f60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15f70 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
15f80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15f90 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
15fa0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15fb0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15fc0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61     "winUnlockRea
15fd0 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
15fe0 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  Path);.  }.  OST
15ff0 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
16000 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
16010 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
16020 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
16030 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
16040 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
16050 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
16060 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
16070 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
16080 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
16090 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
160a0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
160b0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
160c0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
160d0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
160e0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
160f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
16100 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
16110 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
16120 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
16130 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
16140 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
16150 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
16160 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
16170 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
16180 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
16190 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
161a0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
161b0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
161c0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
161d0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
161e0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
161f0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
16200 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
16210 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
16220 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
16230 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
16240 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
16250 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
16260 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
16270 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
16280 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16290 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
162a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
162b0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
162c0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
162d0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
162e0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
162f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16300 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
16310 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
16320 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
16330 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
16340 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
16350 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
16360 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
16370 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
16380 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
16390 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
163a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
163b0 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
163c0 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
163d0 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
163e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
163f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16400 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
16410 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
16420 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
16430 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
16440 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16450 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
16460 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
16470 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
16480 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e   Result of a Win
16490 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
164a0 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
164b0 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
164c0 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
164d0 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
164e0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
164f0 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
16500 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
16510 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
16520 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
16530 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
16540 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
16550 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
16560 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
16570 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20   = NO_ERROR;..  
16580 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
16590 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
165a0 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
165b0 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
165c0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
165d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
165e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
165f0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
16600 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
16610 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
16620 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
16630 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
16640 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
16650 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
16660 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
16670 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
16680 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
16690 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
166a0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
166b0 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
166c0 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
166d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
166e0 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
166f0 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
16700 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69  E(("LOCK-HELD fi
16710 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
16720 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
16730 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
16740 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
16750 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16760 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
16770 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
16780 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
16790 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
167a0 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
167b0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
167c0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
167d0 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
167e0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
167f0 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
16800 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
16810 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
16820 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
16830 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e   Lock the PENDIN
16840 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77  G_LOCK byte if w
16850 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72  e need to acquir
16860 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
16870 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45   or.  ** a SHARE
16880 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61  D lock.  If we a
16890 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
168a0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
168b0 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20  acquisition of. 
168c0 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   ** the PENDING_
168d0 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d  LOCK byte is tem
168e0 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e  porary..  */.  n
168f0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69  ewLocktype = pFi
16900 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
16910 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f  if(   (pFile->lo
16920 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29  cktype==NO_LOCK)
16930 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f  .     || (   (lo
16940 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
16950 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  E_LOCK).        
16960 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   && (pFile->lock
16970 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
16980 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69  OCK)).  ){.    i
16990 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20  nt cnt = 3;.    
169a0 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
169b0 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b  & (res = winLock
169c0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
169d0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
169e0 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
16a20 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
16a30 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
16a40 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
16a50 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69  nding lock.  Thi
16a60 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77  s is needed to w
16a70 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f  ork.      ** aro
16a80 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
16a90 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20  sed by indexing 
16aa0 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75  and/or anti-viru
16ab0 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20  s software on.  
16ac0 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73      ** Windows s
16ad0 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a  ystems..      **
16ae0 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e   If you are usin
16af0 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61  g this code as a
16b00 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72   model for alter
16b10 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f  native VFSes, do
16b20 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   not.      ** co
16b30 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f  py this retry lo
16b40 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61  gic.  It is a ha
16b50 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  ck intended for 
16b60 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20  Windows only..  
16b70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73      */.      las
16b80 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16b90 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
16ba0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
16bb0 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c  PENDING-FAIL fil
16bc0 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
16bd0 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20  result=%d\n",.  
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
16bf0 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29  le->h, cnt, res)
16c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
16c10 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e  tErrno==ERROR_IN
16c20 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a  VALID_HANDLE ){.
16c30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
16c40 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
16c50 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
16c60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
16c70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53  LOCK;.        OS
16c80 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49  TRACE(("LOCK-FAI
16c90 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
16ca0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73  pFile->h, cnt, s
16cd0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
16ce0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
16cf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16d00 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20        if( cnt ) 
16d10 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
16d20 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
16d30 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
16d40 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20   = res;.    if( 
16d50 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61  !res ){.      la
16d60 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
16d70 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
16d80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
16d90 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ire a shared loc
16da0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
16db0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
16dc0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
16dd0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16de0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
16df0 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
16e00 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
16e10 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
16e20 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
16e30 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
16e40 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
16e50 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
16e60 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16e70 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
16e80 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
16e90 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
16ea0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
16eb0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
16ec0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
16ed0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
16ee0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
16ef0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
16f00 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
16f10 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
16f20 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
16f30 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
16f40 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
16f50 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
16f60 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
16f70 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
16f80 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
16f90 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
16fa0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
16fb0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
16fc0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
16fd0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16fe0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
16ff0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
17000 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
17010 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
17020 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
17030 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
17040 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
17050 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
17060 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
17070 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
17080 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
17090 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
170a0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
170b0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
170c0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
170d0 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d  File);.    res =
170e0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
170f0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
17100 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53  OCKFILE_FLAGS, S
17110 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
17140 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
17150 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
17160 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
17170 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
17180 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
17190 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
171a0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
171b0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
171c0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
171d0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
171e0 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
171f0 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
17200 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
17210 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
17220 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
17230 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
17240 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
17250 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
17260 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
17270 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
17280 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
17290 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
172a0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
172b0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
172c0 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
172d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
172e0 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
172f0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
17300 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
17310 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
17320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17340 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17350 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
17360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17370 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  Y;.    OSTRACE((
17380 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
17390 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67  %p, wanted=%d, g
173a0 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot=%d\n",.      
173b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
173c0 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
173d0 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20  cktype));.  }.  
173e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
173f0 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
17400 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
17410 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
17420 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
17430 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17440 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17450 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
17460 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
17470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17480 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17490 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
174a0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
174b0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
174c0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
174d0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
174e0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
174f0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
17500 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
17510 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
17520 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
17530 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
17540 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
17550 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17560 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
17570 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69  int res;.  winFi
17580 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
17590 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
175a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
175b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
175c0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
175d0 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  OCK; );.  OSTRAC
175e0 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
175f0 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
17600 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%p\n", pFile->
17610 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  h, pResOut));.. 
17620 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
17630 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
17640 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
17650 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
17660 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  s = 1;.    OSTRA
17670 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
17680 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
17690 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  t=%d (local)\n",
176a0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
176b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
176c0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
176d0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
176e0 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
176f0 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54  AGS,RESERVED_BYT
17700 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
17710 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
17720 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
17730 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
17740 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
17750 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
17760 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53  s = !res;.    OS
17770 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
17780 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
17790 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29  sult=%d (remote)
177a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
177b0 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  es));.  }.  *pRe
177c0 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53  sOut = res;.  OS
177d0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
177e0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52  LOCK file=%p, pR
177f0 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
17800 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
17810 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
17820 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65     pFile->h, pRe
17830 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
17840 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17850 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
17860 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17870 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17880 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
17890 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
178a0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
178b0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
178c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
178d0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
178e0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
178f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17900 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
17910 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
17920 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
17930 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
17940 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17950 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
17960 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
17970 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
17980 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
17990 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
179a0 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
179b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
179c0 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
179d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
179e0 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
179f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
17a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17a10 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
17a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
17a30 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
17a40 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
17a50 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
17a60 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
17a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
17a80 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
17a90 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
17aa0 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
17ab0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
17ac0 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
17ad0 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20  oldLock=%d(%d), 
17ae0 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  newLock=%d\n",. 
17af0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17b00 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
17b10 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
17b20 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b  edLockByte, lock
17b30 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d  type));.  type =
17b40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
17b50 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58  ;.  if( type>=EX
17b60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
17b70 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
17b80 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
17b90 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
17ba0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
17bb0 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
17bc0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
17bd0 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28  !winGetReadLock(
17be0 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
17bf0 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
17c00 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
17c10 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
17c20 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
17c30 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
17c40 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
17c50 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
17c60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
17c70 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c  R_UNLOCK, osGetL
17c80 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
17cb0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
17cc0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
17cd0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
17ce0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
17cf0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
17d00 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
17d10 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
17d20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
17d30 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
17d40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
17d50 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61      winUnlockRea
17d60 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
17d70 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
17d80 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
17d90 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
17da0 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
17db0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
17dc0 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
17dd0 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
17de0 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
17df0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
17e00 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
17e10 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
17e20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
17e30 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
17e40 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
17e50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
17e70 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
17e80 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
17e90 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
17ea0 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
17eb0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
17ec0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
17ed0 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
17ee0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
17ef0 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
17f00 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
17f10 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
17f20 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
17f30 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
17f40 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
17f50 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
17f60 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
17f70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
17f80 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
17f90 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
17fa0 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
17fb0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17fc0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
17fd0 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
17fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
17ff0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
18000 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
18010 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
18020 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
18030 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
18040 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53  eferences to VFS
18050 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20   helper methods 
18060 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  used for tempora
18070 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ry files */.stat
18080 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
18090 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
180a0 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73  s *, char **);.s
180b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
180c0 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  ir(const void *)
180d0 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  ;.static BOOL wi
180e0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
180f0 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  dColon(const cha
18100 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  r *);../*.** Con
18110 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
18120 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
18130 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
18140 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
18150 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
18160 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
18170 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
18180 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
18190 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
181a0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
181b0 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70  ile=%p, op=%d, p
181c0 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Arg=%p\n", pFile
181d0 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b  ->h, op, pArg));
181e0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
181f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18200 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
18210 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
18220 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
18230 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f  ocktype;.      O
18240 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18250 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
18260 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
18270 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
18280 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18290 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
182a0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
182b0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
182c0 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
182d0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
182e0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
182f0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
18300 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18310 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
18320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18330 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
18340 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
18350 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
18360 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
18370 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
18380 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18390 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
183a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
183b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
183c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
183d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
183e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
183f0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
18400 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
18410 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
18420 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
18430 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
18440 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
18450 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
18460 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
18490 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
184a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
184b0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
184c0 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
184d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
184e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
184f0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
18500 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
18510 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
18520 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
18530 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18540 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
18550 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18560 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18570 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18580 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
18590 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
185a0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
185b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
185c0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
185d0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
185e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
185f0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
18600 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18610 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18620 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18630 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
18640 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
18650 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
18660 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
18670 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
18680 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18690 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
186a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
186b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
186c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
186d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
186e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
186f0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
18700 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
18710 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
18720 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
18730 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
18740 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18750 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18760 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18770 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18790 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
187a0 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
187b0 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
187c0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
187d0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
187e0 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
187f0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18800 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18810 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18820 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18840 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18850 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18860 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
18870 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
18880 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
18890 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
188a0 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f  ){.        winIo
188b0 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b  errRetry = a[0];
188c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
188d0 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e        a[0] = win
188e0 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
188f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
18900 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
18910 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
18920 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  ay = a[1];.     
18930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18940 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52  a[1] = winIoerrR
18950 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20  etryDelay;.     
18960 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
18970 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18980 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18990 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
189a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
189b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
189c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
189d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
189e0 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f  FCNTL_WIN32_SET_
189f0 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20  HANDLE: {.      
18a00 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20  LPHANDLE phFile 
18a10 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67  = (LPHANDLE)pArg
18a20 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  ;.      HANDLE h
18a30 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d  OldFile = pFile-
18a40 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  >h;.      pFile-
18a50 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20  >h = *phFile;.  
18a60 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f      *phFile = hO
18a70 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53  ldFile;.      OS
18a80 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c  TRACE(("FCNTL ol
18a90 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c  dFile=%p, newFil
18aa0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18ab0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
18ac0 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20        hOldFile, 
18ad0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
18ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18af0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
18b00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18b10 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
18b20 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  AME: {.      cha
18b30 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20  r *zTFile = 0;. 
18b40 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
18b50 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  nGetTempname(pFi
18b60 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c  le->pVfs, &zTFil
18b70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
18b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b90 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
18ba0 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
18bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
18bc0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18bd0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
18be0 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
18bf0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
18c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18c10 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
18c20 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
18c30 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
18c40 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
18c50 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
18c60 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
18c70 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74  )pArg;.      int
18c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18c90 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
18ca0 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
18cb0 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
18cc0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
18cd0 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
18ce0 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
18cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18d00 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
18d10 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
18d20 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
18d30 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d  mit>=0 && newLim
18d40 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  it!=pFile->mmapS
18d50 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d  izeMax && pFile-
18d60 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b  >nFetchOut==0 ){
18d70 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
18d80 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65  mmapSizeMax = ne
18d90 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  wLimit;.        
18da0 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
18db0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
18dc0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
18dd0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
18de0 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c    rc = winMapfil
18df0 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
18e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18e10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18e20 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18e30 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
18e40 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
18e50 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
18e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18e70 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54  #endif.  }.  OST
18e80 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18e90 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18ea0 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69  NOTFOUND\n", pFi
18eb0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
18ec0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
18ed0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
18ee0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
18ef0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
18f00 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
18f10 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
18f20 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
18f30 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
18f40 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
18f50 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
18f60 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
18f70 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
18f80 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
18f90 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
18fa0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
18fb0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
18fc0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
18fd0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
18fe0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
18ff0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
19000 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
19010 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
19020 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
19030 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
19040 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
19050 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
19060 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
19070 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
19080 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
19090 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20  {.  (void)id;.  
190a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
190b0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
190c0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
190d0 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64  rn a vector of d
190e0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
190f0 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stics..*/.static
19100 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68   int winDeviceCh
19110 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
19120 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
19130 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20  .  winFile *p = 
19140 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
19150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19160 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
19170 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20  WHEN_OPEN |.    
19180 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c       ((p->ctrlFl
19190 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53  ags & WINFILE_PS
191a0 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50  OW)?SQLITE_IOCAP
191b0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
191c0 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  RITE:0);.}../*.*
191d0 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f  * Windows will o
191e0 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61  nly let you crea
191f0 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70  te file view map
19200 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f  pings.** on allo
19210 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e  cation size gran
19220 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69  ularity boundari
19230 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71  es..** During sq
19240 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
19250 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65  we do a GetSyste
19260 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65  mInfo().** to ge
19270 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74  t the granularit
19280 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  y size..*/.stati
19290 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69  c SYSTEM_INFO wi
192a0 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64  nSysInfo;..#ifnd
192b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
192c0 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  AL../*.** Helper
192d0 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
192e0 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
192f0 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
19300 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
19310 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
19320 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
19330 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a   winLockInfo obj
19340 65 63 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20  ects used by.** 
19350 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
19360 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  f which may be s
19370 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
19380 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
19390 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d   Function winShm
193a0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
193b0 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
193c0 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
193d0 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64  mutex.** is held
193e0 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
193f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19400 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
19410 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a  rt of assert().*
19420 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
19430 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
19440 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
19450 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
19460 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
19470 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
19480 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
19490 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
194a0 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
194b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
194c0 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
194d0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
194e0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
194f0 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
19500 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
19510 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
19520 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
19530 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
19540 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
19550 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
19560 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  );.}.#ifndef NDE
19570 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77  BUG.static int w
19580 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76  inShmMutexHeld(v
19590 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
195a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
195b0 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
195c0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
195d0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
195e0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
195f0 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
19600 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69  o represent a si
19610 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  ngle file opened
19620 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20   and mmapped to 
19630 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65  provide.** share
19640 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  d memory.  When 
19650 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
19660 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74   all reference t
19670 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73  he same.** log-s
19680 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72  ummary, each thr
19690 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20  ead has its own 
196a0 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20  winFile object, 
196b0 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20  but they all.** 
196c0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
196d0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
196e0 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  is object.  In o
196f0 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
19700 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20  .** log-summary 
19710 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f  is opened only o
19720 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
19730 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  .**.** winShmMut
19740 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
19750 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74   true when creat
19760 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e  ing or destroyin
19770 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74  g.** this object
19780 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e   or while readin
19790 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
197a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
197b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52  s:.**.**      nR
197c0 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74  ef.**      pNext
197d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
197e0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
197f0 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
19800 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
19810 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
19820 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
19830 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
19840 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  ther winShmNode.
19850 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
19860 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ld or winShmNode
19870 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
19880 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19890 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
198a0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
198b0 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
198c0 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
198d0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  ucture..**.*/.st
198e0 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
198f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
19900 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
19910 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
19920 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
19930 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
19940 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
19950 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
19960 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68  e */.  winFile h
19970 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
19980 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
19990 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f   from winOpen */
199a0 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  ..  int szRegion
199b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
199c0 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
199d0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
199e0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e  */.  int nRegion
199f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a00 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
19a10 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73   apRegion */.  s
19a20 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
19a30 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61  {.    HANDLE hMa
19a40 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
19a50 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
19a60 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  om CreateFileMap
19a70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64  ping */.    void
19a80 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65   *pMap;.  } *aRe
19a90 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61  gion;.  DWORD la
19aa0 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
19ab0 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77     /* The Window
19ac0 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  s errno from the
19ad0 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
19ae0 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20  */..  int nRef; 
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69   /* Number of wi
19b10 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
19b20 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
19b30 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73  .  winShm *pFirs
19b40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
19b50 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65   All winShm obje
19b60 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19b70 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
19b80 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  Node *pNext;    
19b90 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
19ba0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53  list of all winS
19bb0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a  hmNode objects *
19bc0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19bd0 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53  DEBUG.  u8 nextS
19be0 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
19bf0 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
19c00 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76  able winShm.id v
19c10 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
19c20 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
19c30 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77  l array of all w
19c40 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19c50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  s..**.** The win
19c60 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
19c70 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
19c80 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
19c90 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
19ca0 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d  */.static winShm
19cb0 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65  Node *winShmNode
19cc0 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
19cd0 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
19ce0 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
19cf0 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
19d00 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
19d10 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
19d20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
19d30 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
19d40 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
19d50 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
19d60 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
19d70 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
19d80 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
19d90 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
19da0 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e      winShm.pShmN
19db0 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  ode.**    winShm
19dc0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
19dd0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
19de0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
19df0 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d  winShm.pShmNode-
19e00 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
19e10 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
19e20 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
19e30 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
19e40 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b  .struct winShm {
19e50 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
19e60 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a  ShmNode;      /*
19e70 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
19e80 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
19e90 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  t */.  winShm *p
19ea0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
19eb0 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d    /* Next winShm
19ec0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77   with the same w
19ed0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  inShmNode */.  u
19ee0 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
19ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19f00 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
19f10 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65   winShmNode mute
19f20 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
19f30 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
19f40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
19f50 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
19f60 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
19f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19f80 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
19f90 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
19fa0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19fb0 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
19fe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
19ff0 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20   its winShmNode 
1a000 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1a010 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
1a020 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
1a030 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1a040 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
1a050 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
1a060 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  4)        /* fir
1a070 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
1a080 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
1a090 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f  DMS    (WIN_SHM_
1a0a0 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
1a0b0 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
1a0c0 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
1a0d0 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f  .** Apply adviso
1a0e0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1a0f0 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69   n bytes beginni
1a100 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23  ng at ofst..*/.#
1a110 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43  define _SHM_UNLC
1a120 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  1.#define _SH
1a130 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69  M_RDLCK  2.#defi
1a140 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33  ne _SHM_WRLCK  3
1a150 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1a160 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
1a170 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
1a180 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  e,    /* Apply l
1a190 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1a1a0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1a1b0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1a1c0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1a1d0 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b     /* _SHM_UNLCK
1a1e0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72  , _SHM_RDLCK, or
1a1f0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20   _SHM_WRLCK */. 
1a200 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1a210 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1a220 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
1a230 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f  o be locked/unlo
1a240 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  cked */.  int nB
1a250 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
1a260 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a270 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
1a280 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lock */.){.  int
1a290 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1a2a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a2b0 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
1a2c0 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
1a2d0 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1a2e0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
1a2f0 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
1a300 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a310 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1a320 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a330 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  pFile->mutex) ||
1a340 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
1a350 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
1a360 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1a370 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65  , lock=%d, offse
1a380 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22  t=%d, size=%d\n"
1a390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1a3a0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63  le->hFile.h, loc
1a3b0 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79  kType, ofst, nBy
1a3c0 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  te));..  /* Rele
1a3d0 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
1a3e0 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1a3f0 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
1a400 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
1a410 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
1a420 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1a430 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
1a440 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1a450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1a460 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
1a470 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
1a480 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
1a490 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
1a4a0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
1a4b0 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
1a4c0 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
1a4d0 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
1a4e0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
1a4f0 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  E_LOCK;.    rc =
1a500 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
1a510 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
1a520 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20  Flags, ofst, 0, 
1a530 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  nByte, 0);.  }..
1a540 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
1a550 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a560 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1a570 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1a580 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
1a590 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
1a5a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1a5b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
1a5c0 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
1a5d0 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25  func=%s, errno=%
1a5e0 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  lu, rc=%s\n",.  
1a5f0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1a600 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79  hFile.h, (lockTy
1a610 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b  pe == _SHM_UNLCK
1a620 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69  ) ? "winUnlockFi
1a630 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20  le" :.          
1a640 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20   "winLockFile", 
1a650 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a660 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1a670 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  (rc)));..  retur
1a680 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1a690 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
1a6a0 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
1a6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1a6c0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
1a6d0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
1a6e0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
1a6f0 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
1a700 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
1a710 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
1a720 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
1a730 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
1a740 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
1a750 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
1a760 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
1a770 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
1a780 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
1a790 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1a7a0 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
1a7b0 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
1a7c0 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
1a7d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1a7e0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
1a7f0 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
1a800 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
1a810 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
1a820 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
1a830 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
1a840 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65  mNode *p;.  asse
1a850 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
1a860 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41  eld() );.  OSTRA
1a870 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70  CE(("SHM-PURGE p
1a880 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c  id=%lu, deleteFl
1a890 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ag=%d\n",.      
1a8a0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1a8b0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65  tProcessId(), de
1a8c0 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70  leteFlag));.  pp
1a8d0 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69   = &winShmNodeLi
1a8e0 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20  st;.  while( (p 
1a8f0 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20  = *pp)!=0 ){.   
1a900 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
1a910 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1a920 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74        if( p->mut
1a930 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75  ex ){ sqlite3_mu
1a940 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
1a950 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28  x); }.      for(
1a960 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
1a970 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1a980 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e   BOOL bRc = osUn
1a990 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d  mapViewOfFile(p-
1a9a0 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70  >aRegion[i].pMap
1a9b0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1a9c0 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55  CE(("SHM-PURGE-U
1a9d0 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  NMAP pid=%lu, re
1a9e0 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1a9f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1aa00 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1aa10 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1aa20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1aa30 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1aa40 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1aa50 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1aa60 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
1aa70 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
1aa80 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
1aa90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1aaa0 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20  SHM-PURGE-CLOSE 
1aab0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1aac0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1aae0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1aaf0 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
1ab00 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1ab10 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53  ));.        UNUS
1ab20 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55  ED_VARIABLE_VALU
1ab30 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a  E(bRc);.      }.
1ab40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69        if( p->hFi
1ab50 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d  le.h!=NULL && p-
1ab60 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49  >hFile.h!=INVALI
1ab70 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
1ab80 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
1ab90 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1aba0 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43  1);.        winC
1abb0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
1abc0 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b  le *)&p->hFile);
1abd0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1abe0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1abf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ac00 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
1ac10 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1ac20 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ac30 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (1);.        sql
1ac40 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
1ac50 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1ac60 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c   winDelete(pVfs,
1ac70 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   p->zFilename, 0
1ac80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ac90 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
1aca0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  c();.        Sim
1acb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1acc0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1acd0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e       *pp = p->pN
1ace0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1acf0 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69  e3_free(p->aRegi
1ad00 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
1ad10 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1ad20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20  }else{.      pp 
1ad30 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = &p->pNext;.   
1ad40 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ad50 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d  Open the shared-
1ad60 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
1ad70 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ciated with data
1ad80 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
1ad90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
1ada0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
1adb0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
1adc0 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
1add0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
1ade0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
1adf0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
1ae00 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
1ae10 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
1ae20 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
1ae30 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
1ae40 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
1ae50 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
1ae60 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  der cleared..*/.
1ae70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
1ae80 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77  enSharedMemory(w
1ae90 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  inFile *pDbFd){.
1aea0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20    struct winShm 
1aeb0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1aec0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1aed0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
1aee0 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1aef0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1af00 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54  Node = 0;   /* T
1af10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1af20 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1af30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1af60 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  e */.  struct wi
1af70 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20  nShmNode *pNew; 
1af80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1af90 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e  ly allocated win
1afa0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ShmNode */.  int
1afb0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
1afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afd0 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65  /* Size of zName
1afe0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1aff0 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
1b000 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  Shm==0 );    /* 
1b010 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  Not previously o
1b020 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  pened */..  /* A
1b030 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1b040 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  r the new sqlite
1b050 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41  3_shm object.  A
1b060 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c  lso speculativel
1b070 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20  y.  ** allocate 
1b080 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1b090 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66  winShmNode and f
1b0a0 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ilename..  */.  
1b0b0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
1b0c0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1b0d0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
1b0e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b0f0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e  IOERR_NOMEM;.  n
1b100 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1b110 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
1b120 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
1b130 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1b140 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
1b150 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
1b160 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1b170 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b180 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
1b190 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b1a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  R_NOMEM;.  }.  p
1b1b0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
1b1c0 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
1b1d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1b1e0 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70  intf(nName+15, p
1b1f0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  New->zFilename, 
1b200 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1b210 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74  >zPath);.  sqlit
1b220 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
1b230 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77  bFd->zPath, pNew
1b240 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20  ->zFilename);.. 
1b250 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
1b260 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
1b270 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
1b280 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
1b290 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
1b2a0 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
1b2b0 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
1b2c0 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
1b2d0 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
1b2e0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1b2f0 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
1b300 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
1b310 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
1b320 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
1b330 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
1b340 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
1b350 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
1b360 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
1b370 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
1b380 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
1b390 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
1b3a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b3b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1b3c0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1b3d0 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
1b3e0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
1b3f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
1b400 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
1b410 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1b420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
1b430 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
1b440 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
1b450 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
1b460 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
1b470 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
1b480 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
1b490 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
1b4a0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
1b4b0 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
1b4c0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
1b4d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
1b4e0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
1b4f0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1b500 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
1b510 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1b520 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1b530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1b540 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1b550 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1b560 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
1b570 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
1b580 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
1b590 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1b5a0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
1b5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1b5c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
1b5d0 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
1b5e0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1b5f0 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
1b600 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
1b610 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1b620 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1b630 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1b640 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
1b650 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1b660 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1b670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b680 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
1b690 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1b6a0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1b6b0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1b6c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1b6d0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1b6e0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1b6f0 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1b700 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
1b710 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
1b720 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1b730 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20  length..    */. 
1b740 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
1b750 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1b760 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
1b770 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1b780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b790 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1b7a0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1b7b0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1b7c0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1b7d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b7f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1b800 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1b810 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1b820 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1b840 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1b850 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1b860 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b880 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1b890 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1b8a0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1b8b0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1b8c0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1b8d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1b8e0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1b8f0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1b900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b910 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1b920 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
1b930 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1b940 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1b950 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
1b960 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1b970 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1b980 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1b990 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
1b9a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1b9b0 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1b9c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
1b9d0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1b9e0 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
1b9f0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
1ba00 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
1ba10 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
1ba20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ba30 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
1ba40 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
1ba50 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
1ba60 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
1ba70 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
1ba80 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
1ba90 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
1baa0 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
1bab0 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
1bac0 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
1bad0 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
1bae0 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
1baf0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1bb00 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
1bb10 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
1bb20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
1bb30 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
1bb40 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
1bb50 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
1bb60 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a  Node->mutex.  **
1bb70 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
1bb80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1bb90 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1bba0 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
1bbb0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1bbc0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
1bbd0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
1bbe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1bbf0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1bc00 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1bc10 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1bc20 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
1bc30 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
1bc40 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
1bc50 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1bc60 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1bc70 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1bc80 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1bc90 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
1bca0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1bcb0 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1bcc0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1bcd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1bce0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1bcf0 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
1bd00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1bd10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bd20 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1bd30 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1bd40 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1bd50 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1bd60 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1bd70 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1bd80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bd90 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  winShmUnmap(.  s
1bda0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1bdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1bdc0 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1bdd0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1bde0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1be00 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73  elete after clos
1be10 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ing if true */.)
1be20 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1be30 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Fd;       /* Dat
1be40 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1be50 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared-memory */. 
1be60 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1be70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1be80 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
1be90 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  losed */.  winSh
1bea0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1beb0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1bec0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1bed0 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68   file */.  winSh
1bee0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
1bef0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1bf00 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
1bf10 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70  nections */..  p
1bf20 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1bf30 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
1bf40 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
1bf50 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1bf60 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
1bf70 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1bf80 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
1bf90 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
1bfa0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
1bfb0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
1bfc0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
1bfd0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
1bfe0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1bff0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c000 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
1c010 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
1c020 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1c030 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1c040 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1c050 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1c060 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1c070 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1c080 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1c090 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1c0a0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1c0b0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
1c0c0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
1c0d0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
1c0e0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
1c0f0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
1c100 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1c110 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69  ile, too */.  wi
1c120 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1c130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1c140 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
1c150 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1c160 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
1c170 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
1c180 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70     winShmPurge(p
1c190 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65  DbFd->pVfs, dele
1c1a0 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77  teFlag);.  }.  w
1c1b0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1c1c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1c1d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c1e0 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
1c1f0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
1c200 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1c210 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1c220 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20  t winShmLock(.  
1c230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1c240 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1c250 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1c260 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1c270 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
1c280 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1c290 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
1c2a0 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
1c2b0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1c2c0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
1c2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c2e0 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
1c2f0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1c300 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1c310 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1c320 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1c330 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
1c340 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1c350 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1c360 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  *)fd;        /* 
1c370 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
1c380 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1c390 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20   */.  winShm *p 
1c3a0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c3c0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1c3d0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
1c3e0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20  .  winShm *pX;  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1c410 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1c420 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77   siblings */.  w
1c430 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1c440 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1c450 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1c460 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c480 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
1c490 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c4c0 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
1c4d0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
1c4e0 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
1c4f0 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
1c500 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1c510 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1c520 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1c530 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1c540 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1c550 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1c560 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1c570 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1c580 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1c590 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1c5a0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1c5b0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1c5c0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1c5d0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1c5e0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1c5f0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1c600 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1c610 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1c620 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1c630 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1c640 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28  .  mask = (u16)(
1c650 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d  (1U<<(ofst+n)) -
1c660 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20   (1U<<ofst));.  
1c670 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
1c680 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
1c690 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1c6a0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1c6b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1c6c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1c6d0 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
1c6e0 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
1c6f0 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
1c700 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1c710 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
1c720 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
1c730 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
1c740 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
1c750 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1c760 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1c770 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c780 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1c790 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1c7a0 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1c7b0 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1c7c0 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1c7d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
1c7e0 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
1c7f0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1c800 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
1c810 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1c820 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
1c830 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
1c840 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1c850 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1c860 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1c870 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _UNLCK, ofst+WIN
1c880 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1c890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c8a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c8b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1c8c0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
1c8d0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1c8e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c8f0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1c900 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1c910 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
1c920 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
1c930 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c940 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
1c950 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
1c960 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
1c970 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
1c980 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
1c990 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
1c9a0 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
1c9b0 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
1c9c0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
1c9d0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
1c9e0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1c9f0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
1ca00 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
1ca10 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
1ca20 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
1ca30 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
1ca40 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
1ca50 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
1ca60 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1ca70 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1ca80 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1ca90 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1caa0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1cab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cac0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1cad0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cae0 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
1caf0 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
1cb00 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1cb10 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
1cb20 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1cb30 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
1cb40 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
1cb50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cb60 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
1cb70 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
1cb80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1cb90 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1cba0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1cbb0 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
1cbc0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1cbd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cbe0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cbf0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1cc00 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1cc10 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1cc20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1cc30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cc40 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1cc50 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1cc60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1cc70 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1cc80 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1cc90 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1cca0 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1ccb0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1ccc0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1ccd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1cce0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1ccf0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1cd00 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1cd10 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1cd20 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1cd30 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1cd40 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
1cd50 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1cd60 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1cd70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1cd80 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1cd90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cda0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1cdb0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1cdc0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1cdd0 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
1cde0 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
1cdf0 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
1ce00 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
1ce10 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
1ce20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1ce30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ce40 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1ce50 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1ce60 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1ce70 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1ce80 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
1ce90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cea0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1ceb0 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
1cec0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
1ced0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
1cee0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1cef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cf00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cf10 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1cf20 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
1cf30 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64  E(("SHM-LOCK pid
1cf40 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61  =%lu, id=%d, sha
1cf50 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78  redMask=%03x, ex
1cf60 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d  clMask=%03x, rc=
1cf70 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1cf80 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1cf90 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64  ocessId(), p->id
1cfa0 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
1cfb0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
1cfc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cfd0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1cfe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cff0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
1d000 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
1d010 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
1d020 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1d030 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64  ..**.** All load
1d040 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
1d050 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
1d060 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
1d070 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
1d080 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
1d090 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
1d0a0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
1d0b0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
1d0c0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
1d0d0 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
1d0e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1d0f0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1d100 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1d110 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d120 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f  R(fd);.  /* Memo
1d130 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20  ryBarrier(); // 
1d140 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d  does not work --
1d150 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79   do not know why
1d160 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   not */.  winShm
1d170 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1d180 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1d190 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ();.}../*.** Thi
1d1a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d1b0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
1d1c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
1d1d0 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
1d1e0 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e.** shared-memo
1d1f0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
1d200 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1d210 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
1d220 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a  memory regions.*
1d230 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
1d240 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
1d250 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
1d260 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
1d270 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65  szRegion.** byte
1d280 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
1d290 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d2a0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1d2b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1d2c0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
1d2d0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
1d2e0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
1d2f0 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
1d300 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
1d310 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1d320 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
1d330 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1d340 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
1d350 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
1d360 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
1d370 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
1d380 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
1d390 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
1d3a0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1d3b0 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73  turned. If.** is
1d3c0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1d3d0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1d3e0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1d3f0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1d400 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c   yet.** been all
1d410 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
1d420 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
1d430 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1d440 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1d450 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1d460 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
1d470 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
1d480 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
1d490 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
1d4a0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
1d4b0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
1d4c0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1d4d0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
1d4e0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1d4f0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
1d500 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1d510 20 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d   the mapped.** m
1d520 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
1d530 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
1d540 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1d550 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
1d560 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1d570 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
1d580 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
1d590 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1d5a0 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d5c0 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
1d5d0 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
1d5e0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1d5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1d600 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
1d610 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20   int isWrite,   
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
1d640 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
1d650 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
1d660 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
1d670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d680 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
1d690 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1d6a0 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c  *pDbFd = (winFil
1d6b0 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20  e*)fd;.  winShm 
1d6c0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1d6d0 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1d6e0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1d6f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d700 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
1d710 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61   rc = winOpenSha
1d720 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
1d730 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1d740 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1d750 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62   rc;.    p = pDb
1d760 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20  Fd->pShm;.  }.  
1d770 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1d780 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74  hmNode;..  sqlit
1d790 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1d7a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d7b0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
1d7c0 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
1d7d0 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
1d7e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
1d7f0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1d800 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1d810 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75  gion ){.    stru
1d820 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70  ct ShmRegion *ap
1d830 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1d840 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20  * New aRegion[] 
1d850 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
1d860 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
1d870 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
1d880 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
1d890 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d8a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1d8b0 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  64 sz;          
1d8c0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1d8d0 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69  nt size of wal-i
1d8e0 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  ndex file */..  
1d8f0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
1d900 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
1d910 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  ..    /* The req
1d920 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
1d930 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
1d940 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1d950 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
1d960 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
1d970 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
1d980 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
1d990 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
1d9a0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  ex file is.    *
1d9b0 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
1d9c0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
1d9d0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
1d9e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1d9f0 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71   winFileSize((sq
1da00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1da10 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26  hmNode->hFile, &
1da20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sz);.    if( rc!
1da30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1da40 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1da50 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1da60 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1da70 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
1daa0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1dab0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1dac0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
1dad0 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
1dae0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1daf0 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1db00 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
1db10 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
1db20 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
1db30 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
1db40 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
1db50 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
1db60 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1db70 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
1db80 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
1db90 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
1dba0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1dbb0 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
1dbc0 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
1dbd0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
1dbe0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1dbf0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1dc00 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
1dc10 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
1dc20 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
1dc30 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1dc40 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1dc50 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
1dc60 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
1dc70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dc80 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1dc90 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1dca0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1dcb0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dcd0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1dce0 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap2", pDbFd->z
1dcf0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67  Path);.        g
1dd00 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1dd10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1dd20 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1dd30 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1dd40 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1dd50 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1dd60 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1dd70 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74   apNew = (struct
1dd80 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c   ShmRegion *)sql
1dd90 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
1dda0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1ddb0 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
1ddc0 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
1ddd0 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
1dde0 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
1ddf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1de00 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1de10 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1de20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1de30 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1de40 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20  n = apNew;..    
1de50 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
1de60 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1de70 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c  n ){.      HANDL
1de80 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20  E hMap = NULL;  
1de90 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d         /* file-m
1dea0 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f  apping handle */
1deb0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  .      void *pMa
1dec0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1ded0 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d     /* Mapped mem
1dee0 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23  ory region */..#
1def0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1df00 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
1df10 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1df20 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
1df30 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
1df40 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
1df50 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
1df60 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1df70 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1df80 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1df90 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
1dfa0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1dfb0 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
1dfc0 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
1dfd0 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1dfe0 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1dff0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1e000 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1e010 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1e020 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20 20  HAS_ANSI).      
1e030 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1e040 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d  ileMappingA(pShm
1e050 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1e060 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1e070 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1e080 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1e090 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
1e0a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1e0b0 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64  M-MAP-CREATE pid
1e0c0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1e0d0 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1e0e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e0f0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1e100 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
1e110 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e  Node->nRegion, n
1e120 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
1e130 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22       hMap ? "ok"
1e140 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1e150 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b       if( hMap ){
1e160 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1e170 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  fset = pShmNode-
1e180 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
1e190 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  n;.        int i
1e1a0 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1e1b0 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1e1c0 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1e1d0 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20  ranularity;.#if 
1e1e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1e1f0 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
1e200 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1e210 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45  omApp(hMap, FILE
1e220 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
1e230 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
1e240 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20          iOffset 
1e250 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1e260 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1e270 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1e280 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
1e290 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1e2a0 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49  wOfFile(hMap, FI
1e2b0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
1e2c0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
1e2d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
1e2e0 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1e2f0 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1e300 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1e310 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
1e320 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1e330 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64  "SHM-MAP-MAP pid
1e340 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1e350 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65   offset=%d, size
1e360 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e390 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
1e3a0 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66  e->nRegion, iOff
1e3b0 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
1e3c0 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20        szRegion, 
1e3d0 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  pMap ? "ok" : "f
1e3e0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1e3f0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61  }.      if( !pMa
1e400 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  p ){.        pSh
1e410 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1e420 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1e430 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
1e440 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1e450 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
1e460 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73  P, pShmNode->las
1e470 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
1e4a0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1e4b0 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1e4c0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1e4d0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
1e4e0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1e4f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1e500 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1e510 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1e520 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
1e530 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1e540 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1e550 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
1e560 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
1e570 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e580 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
1e590 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
1e5a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1e5b0 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
1e5c0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1e5d0 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
1e5e0 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
1e5f0 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1e600 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1e610 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1e620 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
1e630 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
1e640 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1e650 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
1e660 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
1e670 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
1e680 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
1e690 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
1e6a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e6b0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1e6c0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1e6d0 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
1e6e0 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
1e6f0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1e700 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
1e710 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
1e720 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
1e730 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
1e740 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
1e750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e760 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e   */../*.** Clean
1e770 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64 20  s up the mapped 
1e780 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  region of the sp
1e790 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66  ecified file, if
1e7a0 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   any..*/.#if SQL
1e7b0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e7c0 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77  E>0.static int w
1e7d0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
1e7e0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61  ile *pFile){.  a
1e7f0 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
1e800 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
1e810 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1e820 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
1e830 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  p=%p, pMapRegion
1e840 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
1e850 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64    "mmapSize=%lld
1e860 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  , mmapSizeActual
1e870 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d  =%lld, mmapSizeM
1e880 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20  ax=%lld\n",.    
1e890 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1e8a0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e8b0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
1e8c0 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ap, pFile->pMapR
1e8d0 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  egion,.         
1e8e0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1e8f0 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  e, pFile->mmapSi
1e900 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d  zeActual, pFile-
1e910 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a  >mmapSizeMax));.
1e920 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
1e930 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  pRegion ){.    i
1e940 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f  f( !osUnmapViewO
1e950 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61  fFile(pFile->pMa
1e960 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20  pRegion) ){.    
1e970 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1e980 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1e990 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
1e9a0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1e9b0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1e9c0 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d  =%p, pMapRegion=
1e9d0 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %p, ".          
1e9e0 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f       "rc=SQLITE_
1e9f0 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f  IOERR_MMAP\n", o
1ea00 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1ea10 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
1ea30 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1ea40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ea50 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1ea60 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1ea70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
1ea80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ea90 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
1eaa0 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65  mapfile1", pFile
1eab0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1eac0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1ead0 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
1eae0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1eaf0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1eb00 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1eb10 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  0;.  }.  if( pFi
1eb20 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29  le->hMap!=NULL )
1eb30 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f  {.    if( !osClo
1eb40 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
1eb50 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70  hMap) ){.      p
1eb60 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1eb70 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1eb80 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
1eb90 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1eba0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1ebb0 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51  , hMap=%p, rc=SQ
1ebc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1ebd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ebe0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1ebf0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1ec00 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29  e, pFile->hMap))
1ec10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
1ec20 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1ec30 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1ec40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d           "winUnm
1ec70 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d  apfile2", pFile-
1ec80 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
1ec90 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d     pFile->hMap =
1eca0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54   NULL;.  }.  OST
1ecb0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1ecc0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1ecd0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1ece0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1ecf0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1ed00 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29  cessId(), pFile)
1ed10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1ed20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ed30 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
1ed40 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
1ed50 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
1ed60 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
1ed70 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
1ed80 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
1ed90 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
1eda0 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
1edb0 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
1edc0 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  if.** there alre
1edd0 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
1ede0 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
1edf0 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
1ee00 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74  e still.** outst
1ee10 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
1ee20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
1ee30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1ee40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1ee50 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
1ee60 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
1ee70 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
1ee80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1ee90 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61  ize of.** the ma
1eea0 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
1eeb0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
1eec0 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
1eed0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
1eee0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69  .** requested si
1eef0 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ze is the size o
1ef00 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1ef10 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73  sk. The actual s
1ef20 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72  ize of the.** cr
1ef30 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73  eated mapping is
1ef40 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75   either the requ
1ef50 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68  ested size or th
1ef60 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
1ef70 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  ed.** using SQLI
1ef80 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1ef90 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ZE, whichever is
1efa0 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
1efb0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1efc0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
1efd0 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
1efe0 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
1eff0 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
1f000 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
1f010 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1f020 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
1f030 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1f040 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1f050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1f060 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  Mapfile(winFile 
1f070 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pFd, sqlite3_in
1f080 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71  t64 nByte){.  sq
1f090 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70  lite3_int64 nMap
1f0a0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20   = nByte;.  int 
1f0b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1f0c0 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
1f0d0 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
1f0e0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1f0f0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1f100 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
1f110 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f120 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f130 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42  essId(), pFd, nB
1f140 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46  yte));..  if( pF
1f150 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29  d->nFetchOut>0 )
1f160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f170 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30  K;..  if( nMap<0
1f180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1f190 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
1f1a0 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d  3_file*)pFd, &nM
1f1b0 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ap);.    if( rc 
1f1c0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1f1d0 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
1f1e0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1f1f0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  c=SQLITE_IOERR_F
1f200 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20  STAT\n",.       
1f210 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f220 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f230 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65   pFd));.      re
1f240 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f250 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
1f260 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46   }.  if( nMap>pF
1f270 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
1f280 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64  {.    nMap = pFd
1f290 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1f2a0 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73   }.  nMap &= ~(s
1f2b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69  qlite3_int64)(wi
1f2c0 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
1f2d0 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66 28  ize - 1);..  if(
1f2e0 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d   nMap==0 && pFd-
1f2f0 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1f300 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1f310 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pFd);.  }.  if( 
1f320 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
1f330 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ize ){.    void 
1f340 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44  *pNew = 0;.    D
1f350 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50  WORD protect = P
1f360 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
1f370 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
1f380 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a  FILE_MAP_READ;..
1f390 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1f3a0 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28  (pFd);.    if( (
1f3b0 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
1f3c0 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
1f3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1f3e0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1f3f0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61  WRITE;.      fla
1f400 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57  gs |= FILE_MAP_W
1f410 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RITE;.    }.#if 
1f420 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1f430 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1f440 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1f450 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
1f460 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1f470 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
1f480 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1f490 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1f4a0 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
1f4b0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1f4c0 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
1f4d0 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1f510 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1f520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1f550 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1f560 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
1f570 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1f580 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46  HAS_ANSI).    pF
1f590 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1f5a0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1f5b0 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1f5c0 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
1f5f0 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
1f600 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1f630 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
1f640 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
1f650 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
1f660 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
1f670 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1f680 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1f690 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1f6a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1f6b0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1f6c0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1f6f0 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le1", pFd->zPath
1f700 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1f710 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1f720 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1f730 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1f740 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1f750 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1f760 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
1f770 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1f780 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1f790 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1f7a0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1f7b0 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1f7c0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1f7d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f7e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f7f0 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25   assert( (nMap %
1f800 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
1f810 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20  geSize)==0 );.  
1f820 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1f830 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
1f840 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
1f850 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
1f860 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  fff );.#if SQLIT
1f870 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
1f880 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
1f890 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64  fFileFromApp(pFd
1f8a0 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
1f8b0 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
1f8c0 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
1f8d0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1f8e0 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
1f8f0 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
1f900 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
1f910 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
1f920 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
1f930 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
1f940 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
1f950 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1f960 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
1f970 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1f980 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
1f990 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1f9a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1f9b0 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9d0 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1f9e0 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile2", pFd->zPat
1f9f0 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
1fa00 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
1fa10 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
1fa20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
1fa30 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
1fa40 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1fa50 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64  MAP-FILE-MAP pid
1fa60 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1fa70 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1fa80 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1fa90 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1faa0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1fab0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1fac0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fad0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1fae0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
1faf0 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
1fb00 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
1fb10 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
1fb20 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b  zeActual = nMap;
1fb30 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1fb40 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1fb50 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1fb60 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1fb70 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1fb80 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1fb90 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75  ), pFd));.  retu
1fba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fbb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1fbc0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1fbd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
1fbe0 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
1fbf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
1fc00 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
1fc10 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
1fc20 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
1fc30 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
1fc40 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
1fc50 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
1fc60 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
1fc70 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
1fc80 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
1fc90 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
1fca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1fcb0 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
1fcc0 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
1fcd0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
1fce0 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
1fcf0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1fd00 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
1fd10 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
1fd20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1fd30 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
1fd40 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
1fd50 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
1fd60 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1fd70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1fd80 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
1fd90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
1fda0 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
1fdb0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  eventually.** re
1fdc0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
1fdd0 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
1fde0 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
1fdf0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
1fe00 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1fe10 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
1fe20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
1fe30 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
1fe40 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1fe50 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
1fe60 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1fe70 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1fe80 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1fe90 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
1fea0 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
1feb0 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
1fec0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
1fed0 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
1fee0 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
1fef0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1ff00 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ff10 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
1ff20 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
1ff30 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1ff40 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
1ff50 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
1ff60 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
1ff70 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
1ff80 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
1ff90 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
1ffa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ffb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ffc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ffd0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1ffe0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1fff0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20000 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20010 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
20020 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
20030 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
20040 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20050 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
20060 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
20070 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
20080 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
20090 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
200a0 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
200b0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
200c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
200d0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
200e0 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
200f0 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
20100 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
20110 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
20120 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20130 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
20140 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
20150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
20170 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
20180 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
20190 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
201a0 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65  releases a.** re
201b0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
201c0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
201d0 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
201e0 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
201f0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
20200 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20210 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
20220 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
20230 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
20240 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
20250 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
20260 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
20270 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
20280 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
20290 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
202a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
202b0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a   being called.**
202c0 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
202d0 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
202e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
202f0 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
20300 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e  mapping.** may n
20310 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
20320 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
20330 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
20340 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73  int winUnfetch(s
20350 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
20360 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
20370 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
20380 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
20390 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
203a0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
203b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
203c0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
203d0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
203e0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
203f0 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
20400 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
20410 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a  outstanding.  **
20420 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
20430 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
20440 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
20450 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
20460 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
20470 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
20480 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
20490 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
204a0 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
204b0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
204c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
204d0 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
204e0 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
204f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
20500 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
20510 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
20520 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53  )[iOff] );..  OS
20530 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
20540 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20550 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
20560 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
20570 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20580 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
20590 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20  , iOff, p));..  
205a0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
205b0 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
205c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
205d0 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77  IXME:  If Window
205e0 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70  s truly always p
205f0 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69  revents truncati
20600 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61  ng or deleting a
20610 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69  .    ** file whi
20620 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20  le a mapping is 
20630 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66  held, then the f
20640 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61  ollowing winUnma
20650 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20  pfile() call.   
20660 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61   ** is unnecessa
20670 72 79 20 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d  ry can can be om
20680 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61  itted - potentia
20690 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20  lly improving.  
206a0 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65    ** performance
206b0 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d  .  */.    winUnm
206c0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
206d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
206e0 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
206f0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
20700 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64  CE(("UNFETCH pid
20710 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20720 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
20730 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20740 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20750 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74  d(), fd));.  ret
20760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20770 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
20780 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
20790 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
207a0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
207b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
207c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
207d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
207e0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
207f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20800 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
20810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20850 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
20860 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
20870 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
20880 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
20890 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
208a0 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
208b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
208c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
208d0 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
208e0 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20900 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
20910 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
20920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20930 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
20940 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
20970 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
209a0 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
209d0 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
20a00 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
20a30 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
20a60 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
20a90 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
20aa0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
20ab0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
20ac0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
20ad0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20af0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
20b00 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
20b10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20b20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
20b30 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
20b40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20b50 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
20b60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20b70 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
20b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20b90 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
20ba0 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
20bb0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20bc0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
20bd0 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
20be0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
20bf0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
20c00 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
20c10 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
20c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20c30 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
20c40 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nFetch,         
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c60 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e   xFetch */.  win
20c70 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c90 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a  xUnfetch */.};..
20ca0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
20cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
20cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
20d10 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
20d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
20d40 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
20d50 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
20d60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
20d70 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
20d80 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
20d90 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ect..*/..#if def
20da0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
20db0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
20dc0 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
20dd0 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
20de0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
20df0 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
20e00 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
20e10 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
20e20 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
20e30 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
20e40 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
20e50 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
20e60 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
20e70 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
20e80 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
20e90 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
20ea0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
20eb0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
20ec0 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
20ed0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
20ee0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
20ef0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
20f00 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
20f10 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
20f20 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
20f30 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
20f40 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
20f50 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
20f60 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c  bcs_to_utf8(zFil
20f70 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
20f80 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
20f90 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
20fa0 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
20fb0 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
20fc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20fd0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
20fe0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
20ff0 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
21000 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
21010 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
21020 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
21030 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
21040 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
21050 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
21060 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
21070 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
21080 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
21090 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
210a0 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
210b0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
210c0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
210d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
210e0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
210f0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
21100 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
21110 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
21120 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
21130 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
21140 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
21150 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
21160 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
21170 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
21180 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
21190 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
211a0 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
211b0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
211c0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
211d0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
211e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
211f0 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
21200 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
21210 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
21220 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
21230 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
21240 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
21250 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
21260 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
21270 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
21280 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
21290 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
212a0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
212b0 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
212c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
212d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
212e0 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
212f0 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
21300 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
21310 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
21320 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21330 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
21340 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
21350 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
21360 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
21370 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
21380 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
21390 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
213a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
213b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
213c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
213d0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
213e0 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
213f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
21400 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
21410 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
21420 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
21430 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
21440 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
21450 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
21460 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
21470 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
21480 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
21490 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
214a0 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
214b0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
214c0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
214d0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
214e0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
214f0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
21500 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
21510 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65  i, j;.  int nPre
21520 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21530 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
21540 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ILE_PREFIX);.  i
21550 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e  nt nMax, nBuf, n
21560 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Dir, nLen;.  cha
21570 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
21580 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
21590 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
215a0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
215b0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
215c0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
215d0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
215e0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
215f0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
21600 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
21610 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a  ion failing..  *
21620 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
21630 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
21640 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f  TE_IOERR );..  /
21650 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
21660 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
21670 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79   store the fully
21680 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a   qualified file.
21690 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
216a0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
216b0 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  .  If this fails
216c0 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74  , we cannot cont
216d0 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61  inue..  */.  nMa
216e0 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  x = pVfs->mxPath
216f0 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61  name; nBuf = nMa
21700 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20  x + 2;.  zBuf = 
21710 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21720 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28  o( nBuf );.  if(
21730 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53   !zBuf ){.    OS
21740 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21750 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21760 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
21770 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21780 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
21790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
217a0 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
217b0 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
217c0 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
217d0 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
217e0 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
217f0 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
21800 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
21810 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
21820 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
21830 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
21840 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
21850 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
21860 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
21870 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
21880 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
21890 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
218a0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
218b0 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
218c0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
218d0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
218e0 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
218f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
21900 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
21910 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
21920 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
21930 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
21940 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
21950 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
21960 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
21970 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21980 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
21990 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
219a0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
219b0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
219c0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
219d0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
219e0 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
219f0 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
21a00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
21a10 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
21a20 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
21a30 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21a40 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
21a50 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
21a60 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
21a70 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
21a80 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
21a90 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
21aa0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
21ab0 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
21ac0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
21ad0 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
21ae0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21af0 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
21b00 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
21b10 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
21b20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
21b30 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
21b40 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
21b50 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
21b60 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
21b70 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
21b80 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
21b90 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
21ba0 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
21bb0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
21bc0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
21bd0 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
21be0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
21bf0 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
21c00 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
21c10 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
21c20 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
21c30 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
21c40 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
21c50 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
21c60 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
21c70 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
21c80 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
21c90 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
21ca0 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
21cb0 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
21cc0 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
21cd0 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
21ce0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
21cf0 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
21d00 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
21d10 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
21d20 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
21d30 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
21d40 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
21d50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21d60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
21d70 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
21d80 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
21d90 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
21da0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
21db0 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
21dc0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
21dd0 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
21de0 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
21df0 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
21e00 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
21e10 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
21e20 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
21e30 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
21e40 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
21e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21e60 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
21e70 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
21e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
21e90 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
21ea0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
21eb0 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
21ec0 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
21ed0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
21ee0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21ef0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
21f00 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21f10 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21f20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
21f40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21f50 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
21f60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  }.        if( wi
21f70 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
21f80 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
21f90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21fa0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
21fb0 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
21fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21fd0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
21fe0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22010 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22030 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
22040 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
22050 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20  nMax+1 );.      
22060 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
22070 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
22080 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
220a0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
220b0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
220c0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
220d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
220e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
220f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
22100 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77          if( cygw
22110 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22130 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
22140 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
22150 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
22160 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20  , zDir,.        
22170 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
22180 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b  ed, nMax+1)<0 ){
22190 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
221a0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
221b0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ed);.          s
221c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
221d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
221e0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
221f0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
22200 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22  OERR_CONVPATH\n"
22210 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22220 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
22230 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  (SQLITE_IOERR_CO
22240 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
22250 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
22280 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  me2", zDir);.   
22290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
222a0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
222b0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
222c0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
222d0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
222e0 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72  he candidate dir
222f0 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e  ectory exists an
22300 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20  d should.       
22310 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20     ** be used.  
22320 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20  However, we may 
22330 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  need to convert 
22340 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  the string conta
22350 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ining.          
22360 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f  ** its name into
22370 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20   UTF-8 (i.e. if 
22380 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67  it is UTF-16 rig
22390 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20  ht now)..       
223a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
223b0 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
223c0 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
223d0 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65  lename(zConverte
223e0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
223f0 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
22400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22410 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22430 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  ;.            OS
22450 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22460 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22470 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
22490 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
224a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
224b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
224c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
224d0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
224e0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
224f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22500 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20  (zUtf8);.       
22510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22520 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22530 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22560 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22570 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69  }.    }.  }.#eli
22580 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
22590 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
225a0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
225b0 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29  e if( osIsNT() )
225c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
225d0 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a  ti;.    LPWSTR z
225e0 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74  WidePath = sqlit
225f0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
22600 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ax*sizeof(WCHAR)
22610 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69   );.    if( !zWi
22620 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  dePath ){.      
22630 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22640 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
22650 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22660 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22670 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
22680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22690 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
226a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47     }.    if( osG
226b0 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61 78  etTempPathW(nMax
226c0 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30 20  , zWidePath)==0 
226d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
226e0 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
226f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22700 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22710 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22720 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22730 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
22740 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
22750 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22760 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22770 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
22780 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
22790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227a0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
227b0 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b  tTempname2", 0);
227c0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74  .    }.    zMult
227d0 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  i = winUnicodeTo
227e0 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b  Utf8(zWidePath);
227f0 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20  .    if( zMulti 
22800 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22810 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
22820 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  zBuf, "%s", zMul
22830 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
22840 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
22850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22860 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
22870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
22890 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
228a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
228b0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
228c0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
228d0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
228e0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
228f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22900 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22910 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
22920 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
22930 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
22940 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
22950 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61     char *zMbcsPa
22960 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
22970 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a  ocZero( nMax );.
22980 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61      if( !zMbcsPa
22990 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
229a0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
229b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
229c0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
229d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
229e0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
229f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22a00 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
22a10 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
22a20 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d  mpPathA(nMax, zM
22a30 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
22a40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22a50 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22a60 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22a70 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22a80 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
22a90 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
22aa0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
22ab0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
22ac0 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
22ad0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
22b00 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20  mpname3", 0);.  
22b10 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20    }.    zUtf8 = 
22b20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
22b30 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
22b40 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
22b50 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
22b60 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22b70 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
22b80 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
22b90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
22ba0 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
22bb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22bc0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22bd0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22be0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22bf0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22c00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22c10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22c20 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  EM;.    }.  }.#e
22c30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
22c40 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f  IN32_HAS_ANSI */
22c50 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
22c60 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
22c70 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
22c80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
22c90 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
22ca0 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20 61  tory ends with a
22cb0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
22cc0 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49  ** separator.  I
22cd0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e  f it does not an
22ce0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  d there is not e
22cf0 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
22d00 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65   to add.  ** one
22d10 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69  , fail..  */.  i
22d20 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  f( !winMakeEndIn
22d30 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a  DirSep(nDir+1, z
22d40 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Buf) ){.    sqli
22d50 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22d60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22d70 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22d80 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
22d90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
22da0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
22db0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
22dc0 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b  tTempname4", 0);
22dd0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
22de0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
22df0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
22e00 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
22e10 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
22e20 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e  ile.  ** name in
22e30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
22e40 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ormat:.  **.  **
22e50 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64     "<temporary_d
22e60 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73  irectory>/etilqs
22e70 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  _XXXXXXXXXXXXXXX
22e80 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  \0\0".  **.  ** 
22e90 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  If not, return S
22ea0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68  QLITE_ERROR.  Th
22eb0 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75  e number 17 is u
22ec0 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65  sed here in orde
22ed0 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e  r to.  ** accoun
22ee0 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65 20  t for the space 
22ef0 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20 63  used by the 15 c
22f00 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20  haracter random 
22f10 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20  suffix and the. 
22f20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67   ** two trailing
22f30 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e   NUL characters.
22f40 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65    The final dire
22f50 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
22f60 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68  character.  ** h
22f70 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65 64  as already added
22f80 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
22f90 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a  lready present..
22fa0 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71    */.  nLen = sq
22fb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
22fc0 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e  uf);.  if( (nLen
22fd0 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20   + nPre + 17) > 
22fe0 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  nBuf ){.    sqli
22ff0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23000 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
23010 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
23020 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
23030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
23040 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
23050 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
23060 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b  tTempname5", 0);
23070 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
23080 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36  snprintf(nBuf-16
23090 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e  -nLen, zBuf+nLen
230a0 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  , SQLITE_TEMP_FI
230b0 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a  LE_PREFIX);..  j
230c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
230d0 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
230e0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
230f0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
23100 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
23110 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
23120 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
23130 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
23140 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
23150 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
23160 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
23170 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
23180 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75  +1] = 0;.  *pzBu
23190 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54  f = zBuf;..  OST
231a0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
231b0 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  NAME name=%s, rc
231c0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a  =SQLITE_OK\n", z
231d0 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
231e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
231f0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
23200 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
23210 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
23220 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
23230 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
23240 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
23250 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
23260 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
23270 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
23280 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
23290 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
232a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
232b0 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
232c0 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
232d0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
232e0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
232f0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
23300 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
23310 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
23320 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
23330 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
23340 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
23350 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
23360 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
23370 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
23380 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
23390 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
233a0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
233b0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
233e0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
23410 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
23420 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
23430 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
23440 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
23450 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76  return 0; /* Inv
23460 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20  alid name? */.  
23470 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73    }.    attr = s
23480 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
23490 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53  ttributes;.#if S
234a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
234b0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
234c0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
234d0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
234e0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
234f0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
23500 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49  rn (attr!=INVALI
23510 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
23520 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45  S) && (attr&FILE
23530 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
23540 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TORY);.}../*.** 
23550 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
23560 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
23570 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
23580 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
23590 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d  /* Used to get m
235a0 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65  aximum path name
235b0 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e   length */.  con
235c0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
235d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
235e0 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
235f0 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
23600 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
23610 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
23620 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
23630 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
23640 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
23650 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
23660 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
23670 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
23680 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
23690 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
236a0 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
236b0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
236c0 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  no = 0;.  DWORD 
236d0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
236e0 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
236f0 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
23700 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
23710 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
23720 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
23730 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
23740 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
23750 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
23760 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
23770 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
23780 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
23790 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
237a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
237b0 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
237c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
237d0 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
237e0 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
237f0 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
23800 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  ng */.  int cnt 
23810 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  = 0;..  /* If ar
23820 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
23830 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
23840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23850 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
23860 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
23870 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
23880 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
23890 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
238a0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
238b0 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f  *zTmpname = 0; /
238c0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
238d0 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63  filename, if nec
238e0 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e  essary. */..  in
238f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23900 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23910 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
23920 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66  Code */.#if !def
23930 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
23940 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
23950 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
23960 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
23970 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
23980 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64   to open */.#end
23990 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  if..  int isExcl
239a0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
239b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
239c0 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
239d0 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
239e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
239f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
23a00 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
23a10 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
23a20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
23a30 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
23a40 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
23a50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23a60 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
23a70 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
23a80 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23a90 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
23aa0 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
23ab0 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
23ac0 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
23ad0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
23ae0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23af0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
23b00 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
23b10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
23b20 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
23b30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23b40 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
23b50 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
23b60 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
23b70 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d  pFile=%p, flags=
23b80 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  %x, pOutFlags=%p
23b90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23ba0 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66  zUtf8Name, id, f
23bb0 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
23bc0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
23bd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
23be0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
23bf0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61  :.  **.  **   (a
23c00 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
23c10 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
23c20 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
23c30 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
23c40 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  nd.  **   (b) if
23c50 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
23c60 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
23c70 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
23c80 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
23c90 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
23ca0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
23cb0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
23cc0 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
23cd0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
23ce0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
23cf0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
23d00 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
23d10 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
23d20 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
23d30 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
23d40 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
23d50 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
23d60 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
23d70 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
23d80 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
23d90 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
23da0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
23db0 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
23dc0 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
23dd0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
23de0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
23df0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
23e00 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a  l are never.  **
23e10 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
23e20 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
23e30 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
23e40 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
23e50 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23e60 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
23e70 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23e80 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
23e90 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23ea0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
23eb0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23ec0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
23ee0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
23ef0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
23f00 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
23f10 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
23f20 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23f30 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23f40 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23f50 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
23f60 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
23f70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
23f80 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
23f90 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
23fa0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
23fb0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
23fc0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
23fd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23fe0 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20 20  N_TEMP_DB.      
23ff0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24000 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
24010 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
24020 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
24030 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c  OURNAL.       ||
24040 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24050 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
24060 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24070 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
24080 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  URNAL.       || 
24090 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
240a0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
240b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
240c0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
240d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
240e0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  =0 );.  memset(p
240f0 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
24100 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  winFile));.  pFi
24110 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
24120 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23  HANDLE_VALUE;..#
24130 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24140 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  RT.  if( !zUtf8N
24150 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f  ame && !sqlite3_
24160 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
24170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
24180 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
24190 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
241a0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
241b0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
241c0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
241d0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
241e0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f    /* If the seco
241f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
24200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24210 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61  NULL, generate a
24220 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
24230 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
24240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
24250 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
24260 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
24270 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
24280 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
24290 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
242a0 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
242b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
242c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
242d0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
242e0 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
242f0 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
24300 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
24310 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24320 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
24330 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
24340 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
24350 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
24360 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
24370 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
24380 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
24390 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
243a0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
243b0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
243c0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
243d0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
243e0 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
243f0 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
24400 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
24410 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
24420 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
24430 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
24440 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
24450 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
24460 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
24470 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
24480 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
24490 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
244a0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
244b0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
244c0 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
244d0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
244e0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
244f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
24500 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
24510 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
24520 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
24530 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
24540 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
24550 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24560 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
24570 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
24580 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
24590 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
245a0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
245b0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
245c0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
245d0 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
245e0 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
245f0 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
24600 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
24610 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24620 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
24630 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
24640 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
24650 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
24660 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
24670 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
24680 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
24690 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
246a0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
246b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
246c0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
246d0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
246e0 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20 2a   new file is.  *
246f0 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
24700 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
24710 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
24720 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 0a  clusive access".
24730 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73    ** as it is us
24740 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64  ually understood
24750 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
24760 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
24770 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
24780 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
24790 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
247a0 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
247b0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
247c0 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
247d0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
247e0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
247f0 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
24800 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74  else if( isCreat
24810 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
24820 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20   existing file, 
24830 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20  or create if it 
24840 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f  doesn't exist */
24850 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24860 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
24870 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
24880 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20  e{.    /* Opens 
24890 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  a file, only if 
248a0 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  it exists. */.  
248b0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
248c0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
248d0 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20  XISTING;.  }..  
248e0 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
248f0 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
24900 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
24910 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  ;..  if( isDelet
24920 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  e ){.#if SQLITE_
24930 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
24940 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24950 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
24960 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
24970 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
24980 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
24990 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
249a0 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
249b0 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
249e0 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
24a10 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
24a20 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
24a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
24a40 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
24a50 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
24a60 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
24a70 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
24a80 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
24a90 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
24aa0 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
24ab0 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
24ac0 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
24ad0 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
24ae0 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
24af0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
24b00 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
24b10 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
24b20 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
24b30 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ESS;.#endif..  i
24b40 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
24b50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24b60 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c  RT.    CREATEFIL
24b70 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
24b80 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50  METERS extendedP
24b90 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65  arameters;.    e
24ba0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24bb0 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f  s.dwSize = sizeo
24bc0 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  f(CREATEFILE2_EX
24bd0 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
24be0 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  S);.    extended
24bf0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
24c00 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20  eAttributes =.  
24c10 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
24c20 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
24c30 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
24c40 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
24c50 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
24c60 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61  ileFlags = dwFla
24c70 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
24c80 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  & FILE_FLAG_MASK
24c90 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
24ca0 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72  rameters.dwSecur
24cb0 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45  ityQosFlags = SE
24cc0 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53  CURITY_ANONYMOUS
24cd0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
24ce0 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72  rameters.lpSecur
24cf0 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20  ityAttributes = 
24d00 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64  NULL;.    extend
24d10 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65  edParameters.hTe
24d20 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c  mplateFile = NUL
24d30 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  L;.    while( (h
24d40 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
24d50 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
24d60 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
24d90 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24de0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24df0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
24e20 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49  meters))==INVALI
24e30 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
24e40 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
24e70 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
24e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24e90 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
24ea0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
24eb0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
24ec0 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29  eFileW((LPCWSTR)
24ed0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
24f00 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
24f30 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
24f60 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
24f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24f90 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24fa0 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
24fd0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
24fe0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
25010 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
25020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25030 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
25040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
25050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
25060 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
25070 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
25080 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
25090 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65  A((LPCSTR)zConve
250a0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
250d0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
25100 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
25130 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
25160 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
25190 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
251a0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
251d0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
251e0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25200 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  Noop */.    }.  
25210 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f  }.#endif.  winLo
25220 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20  gIoerr(cnt);..  
25230 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
25240 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
25250 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d   access=%lx, rc=
25260 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
25270 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
25280 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
25290 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e   (h==INVALID_HAN
252a0 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61  DLE_VALUE) ? "fa
252b0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
252c0 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
252d0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
252e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
252f0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
25300 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
25310 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
25320 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
25330 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
25340 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
25350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25360 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
25370 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
25380 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
25390 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
253a0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
253b0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f       return winO
253c0 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  pen(pVfs, zName,
253d0 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28 28   id,.         ((
253e0 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45  flags|SQLITE_OPE
253f0 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20  N_READONLY) &.  
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e     ~(SQLITE_OPEN
25420 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f  _CREATE|SQLITE_O
25430 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c  PEN_READWRITE)),
25440 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c  .         pOutFl
25450 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
25460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25470 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
25480 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
25490 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
254a0 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
254b0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  Write ){.      *
254c0 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
254d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
254e0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
254f0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
25500 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
25510 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
25520 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
25530 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
25540 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
25550 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a   pOutFlags=%p, *
25560 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a  pOutFlags=%d, ".
25570 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25             "rc=%
25580 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61  s\n", h, zUtf8Na
25590 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63  me, dwDesiredAcc
255a0 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20  ess, pOutFlags, 
255b0 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20  pOutFlags ?.    
255c0 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67         *pOutFlag
255d0 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c  s : 0, (h==INVAL
255e0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29  ID_HANDLE_VALUE)
255f0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
25600 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  k"));..#if SQLIT
25610 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
25620 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
25630 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25640 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
25650 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65    && (rc = wince
25660 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
25670 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54  , pFile))!=SQLIT
25680 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73  E_OK.  ){.    os
25690 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a  CloseHandle(h);.
256a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
256b0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
256c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
256d0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
256e0 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d  TRACE(("OPEN-CE-
256f0 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LOCK name=%s, rc
25700 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73  =%s\n", zName, s
25710 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
25720 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
25730 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rc;.  }.  if( is
25740 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
25750 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
25760 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
25770 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
25780 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
25790 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
257a0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
257b0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
257c0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
257d0 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
257e0 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
257f0 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
25800 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
25810 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
25820 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
25830 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
25840 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
25850 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
25860 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
25870 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
25880 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
25890 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
258a0 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
258b0 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
258c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
258d0 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
258e0 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
258f0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
25900 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69  MAP_SIZE>0.  pFi
25910 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
25920 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  .  pFile->pMapRe
25930 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c  gion = 0;.  pFil
25940 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
25950 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
25960 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
25970 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
25980 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
25990 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
259a0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
259b0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
259c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
259d0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
259e0 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
259f0 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
25a00 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
25a10 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
25a20 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
25a30 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
25a40 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
25a50 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
25a60 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
25a70 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
25a80 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
25a90 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
25aa0 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
25ab0 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
25ac0 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
25ad0 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
25ae0 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
25af0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
25b00 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
25b10 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
25b20 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
25b30 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
25b40 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
25b50 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
25b60 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
25b70 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
25b80 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
25b90 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
25ba0 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
25bb0 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
25bc0 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
25bd0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
25be0 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
25bf0 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
25c00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
25c10 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
25c20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
25c30 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
25c40 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
25c50 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
25c60 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
25c70 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25c90 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
25ca0 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
25cb0 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
25cc0 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
25cd0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
25ce0 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
25cf0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
25d00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
25d10 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
25d20 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
25d30 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
25d40 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
25d50 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
25d60 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
25d70 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
25d80 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
25d90 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
25da0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
25db0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
25dc0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
25dd0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
25de0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
25df0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
25e00 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
25e10 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
25e20 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
25e30 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
25e40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
25e50 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
25e60 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64  sIsNT() ){.    d
25e70 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
25e80 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
25e90 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
25ea0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
25eb0 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
25ec0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
25ed0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
25ee0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
25ef0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
25f00 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
25f10 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
25f20 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
25f50 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
25f60 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
25f70 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
25f80 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
25f90 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
25fa0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
25fb0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
25fc0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
25fd0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
25fe0 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
25ff0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
26000 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
26010 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
26030 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
26040 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
26050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26070 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
26090 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
260a0 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
260b0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
260c0 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
260d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
260e0 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
260f0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
26100 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
26110 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
26120 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
26130 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
26140 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
26150 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
26160 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
26170 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
26180 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
26190 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
261a0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
261b0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
261c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
261d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
261e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
261f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26210 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
26220 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
26230 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
26240 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26250 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
26260 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
26270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26280 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
26290 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
262a0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
262b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
262c0 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
262d0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
262e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
262f0 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
26300 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26310 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26330 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
26340 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
26350 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26360 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
26370 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
26380 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
26390 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
263a0 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
263b0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
263c0 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
263d0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
263e0 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
263f0 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
26400 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
26410 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
26420 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
26430 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
26440 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
26450 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
26460 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
26470 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
26480 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26490 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
264a0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
264b0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
264c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
264d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
264e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
264f0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
26500 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26510 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
26520 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
26530 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
26540 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26550 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
26560 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
26570 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26580 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
26590 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
265a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
265b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
265c0 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
265d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
265e0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
265f0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
26600 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
26610 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26620 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
26630 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
26640 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
26650 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26660 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
26670 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
26680 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
26690 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
266a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
266b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
266c0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
266d0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c  stErrno, "winDel
266e0 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
266f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
26700 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
26710 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
26720 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26730 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
26740 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
26750 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
26760 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
26770 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
26780 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
26790 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
267a0 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
267b0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
267c0 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
267d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
267e0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
267f0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
26800 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
26810 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
26820 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
26830 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
26840 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
26850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26860 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
26870 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
26880 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
26890 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
268a0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
268b0 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
268c0 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
268d0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
268e0 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
268f0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
26900 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26910 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
26920 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
26930 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
26940 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
26950 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
26960 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
26970 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
26980 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
26990 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
269a0 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
269b0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
269c0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
269d0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
269e0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
269f0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
26a00 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
26a10 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
26a20 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
26a30 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
26a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26a50 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
26a60 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
26a70 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
26a80 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
26a90 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
26aa0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
26ab0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
26ac0 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
26ad0 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
26ae0 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
26af0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
26b00 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
26b10 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
26b40 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
26b70 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
26b80 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26b90 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
26ba0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
26bb0 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41   For an SQLITE_A
26bc0 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65  CCESS_EXISTS que
26bd0 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f  ry, treat a zero
26be0 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20  -length file.   
26bf0 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64     ** as if it d
26c00 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
26c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
26c20 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49  (    flags==SQLI
26c30 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
26c40 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
26c50 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
26c60 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20  eHigh==0.       
26c70 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
26c80 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
26c90 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
26ca0 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
26cb0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
26cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26cd0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
26ce0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
26cf0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
26d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c  else{.      winL
26d10 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
26d20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
26d30 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o!=ERROR_FILE_NO
26d40 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45  T_FOUND && lastE
26d50 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48  rrno!=ERROR_PATH
26d60 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
26d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26d80 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
26d90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
26da0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
26db0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
26dc0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
26dd0 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20  ccess",.        
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
26e00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26e10 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
26e20 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
26e30 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
26e40 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
26e50 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
26e60 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
26e70 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
26e80 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
26e90 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
26ea0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
26eb0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26ec0 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
26ed0 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
26ee0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
26ef0 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
26f00 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
26f10 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
26f20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
26f30 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
26f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26f50 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
26f60 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
26f70 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
26f80 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
26f90 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
26fa0 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
26fb0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
26fc0 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
26fd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
26fe0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
26ff0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
27000 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
27010 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
27020 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
27030 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
27040 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
27050 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
27060 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
27070 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
27080 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
27090 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
270a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
270b0 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
270c0 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
270d0 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74  ied path name st
270e0 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
270f0 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c  e letter.** foll
27100 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20  owed by a colon 
27110 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
27120 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
27130 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
27140 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
27150 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
27160 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65   return ( sqlite
27170 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
27180 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
27190 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d  ame[1]==':' );.}
271a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
271b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
271c0 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
271d0 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
271e0 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
271f0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
27200 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
27210 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
27220 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
27230 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
27240 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
27250 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
27260 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
27270 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
27280 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
27290 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
272a0 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
272b0 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
272c0 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
272d0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
272e0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
272f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27300 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
27310 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
27320 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
27330 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
27340 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
27350 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
27360 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
27370 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
27380 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
27390 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
273a0 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
273b0 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
273c0 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
273d0 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
273e0 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
273f0 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
27400 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
27410 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
27420 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
27430 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
27440 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
27450 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
27460 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27470 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
27480 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
27490 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
274a0 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b  irSep(zPathname[
274b0 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0]) ){.    retur
274c0 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
274d0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
274e0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
274f0 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
27500 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
27510 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
27520 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
27530 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
27540 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
27550 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27560 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
27570 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
27580 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
27590 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
275a0 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
275b0 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
275c0 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
275d0 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76    if ( winIsDriv
275e0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
275f0 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20  zPathname) ){.  
27600 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
27610 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
27620 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
27630 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
27640 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
27650 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
27660 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
27670 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
27680 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
27690 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
276a0 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
276b0 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
276c0 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
276d0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
276e0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
276f0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
27700 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
27710 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
27720 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
27730 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
27740 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
27750 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
27760 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
27770 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
27780 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
27790 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
277a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
277b0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
277c0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
277d0 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
277e0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
277f0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
27800 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
27810 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
27820 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27830 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
27840 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
27850 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27870 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
27880 2f 0a 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  /.){..#if define
27890 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
278a0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
278b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
278c0 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
278d0 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
278e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75  );.  assert( nFu
278f0 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll>=pVfs->mxPath
27900 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73  name );.  if ( s
27910 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
27920 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
27930 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
27940 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
27950 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
27960 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
27970 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
27980 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
27990 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
279a0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
279b0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
279c0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
279d0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
279e0 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
279f0 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
27a00 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
27a10 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
27a20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
27a30 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
27a40 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
27a50 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20   and a slash..  
27a60 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
27a70 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Out = sqlite3Mal
27a80 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d  locZero( pVfs->m
27a90 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20  xPathname+1 );. 
27aa0 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a     if( !zOut ){.
27ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27ac0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
27ad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
27ae0 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
27af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
27b00 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
27b10 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
27b20 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
27b30 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
27b40 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52  CCP_RELATIVE, zR
27b50 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70  elative, zOut, p
27b60 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
27b70 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1)<0 ){.      sq
27b80 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
27b90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
27ba0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
27bb0 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
27bc0 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
27bd0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
27be0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
27bf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
27c00 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
27c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
27c20 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
27c30 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
27c40 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ame(zOut);.     
27c50 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
27c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27c70 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
27c80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27c90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
27ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
27cb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
27cc0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
27cd0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
27ce0 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
27d10 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
27d20 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38  tDirSep(), zUtf8
27d30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d40 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
27d50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27d60 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
27d70 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
27d80 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
27d90 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
27da0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
27db0 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
27dc0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
27dd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27de0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
27df0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
27e00 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
27e10 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
27e20 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
27e30 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
27e40 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _A),.           
27e50 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
27e60 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27e70 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
27e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
27e90 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
27ea0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
27eb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
27ec0 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
27ed0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27ef0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
27f00 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
27f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
27f30 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
27f40 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
27f50 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
27f60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27f70 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27f90 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
27fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27fb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27fc0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
27fd0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
27fe0 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ull, "%s", zUtf8
27ff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28000 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
28010 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28020 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
28030 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
28040 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
28050 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f (SQLITE_OS_WIN
28060 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
28070 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e  WINRT) && !defin
28080 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
28090 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
280a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
280b0 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69  ERROR );.  /* Wi
280c0 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
280d0 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
280e0 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
280f0 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
28100 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f   /* WinRT has no
28110 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   way to convert 
28120 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
28130 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f  to an absolute o
28140 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ne. */.  if ( sq
28150 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
28160 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
28170 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
28180 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
28190 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
281a0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
281b0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
281c0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
281d0 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
281e0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
281f0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
28200 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
28210 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
28220 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
28230 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
28240 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
28250 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
28260 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
28270 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
28280 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
28290 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
282a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
282b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
282c0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
282d0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
282e0 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
28310 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
28320 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
28330 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ve);.  }else{.  
28340 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
28350 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
28360 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
28370 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
28380 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20  elative);.  }.  
28390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
283a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
283b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
283c0 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
283d0 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
283e0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f  _CYGWIN__).  DWO
283f0 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  RD nByte;.  void
28400 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
28410 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
28420 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
28430 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
28440 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
28450 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
28460 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
28470 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
28480 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
28490 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
284a0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
284b0 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69  ve[0]=='/' && wi
284c0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
284d0 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65  dColon(zRelative
284e0 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  +1) ){.    zRela
284f0 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
28500 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
28510 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
28520 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
28530 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
28540 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
28550 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
28560 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
28570 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
28580 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
28590 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
285a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
285b0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
285c0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
285d0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
285e0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
285f0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
28600 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
28610 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
28620 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
28630 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
28640 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
28650 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
28660 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
28670 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
28680 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
28690 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
286a0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
286b0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
286c0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
286d0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
286e0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
286f0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
28700 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
28710 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
28720 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
28730 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
28740 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
28750 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
28760 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
28770 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
28780 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
28790 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
287a0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
287b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
287c0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
287d0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
287e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
287f0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
28800 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
28810 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
28820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28830 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
28840 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
28850 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
28860 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
28870 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
28880 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28890 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
288a0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
288b0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
288c0 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
288d0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
288e0 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
288f0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
28900 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
28910 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
28920 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28930 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
28940 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28950 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28960 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
28970 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
28980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28990 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
289a0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
289b0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
289c0 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
289d0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
289e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
289f0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
28a00 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
28a10 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
28a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28a30 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28a50 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
28a60 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
28a70 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
28a80 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
28a90 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
28aa0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
28ab0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
28ac0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28ad0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28ae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28af0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
28b00 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
28b10 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
28b20 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
28b30 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
28b60 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
28b70 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
28b80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28b90 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28ba0 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
28bb0 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
28bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28bd0 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
28be0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
28bf0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
28c00 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
28c10 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
28c20 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
28c30 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
28c40 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
28c50 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
28c60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28c70 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28c80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28c90 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
28ca0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
28cb0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28cc0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28cf0 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e3", zRelative);
28d00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
28d10 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
28d20 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
28d30 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
28d40 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
28d50 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
28d60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28d70 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28d80 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
28d90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
28da0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
28db0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
28dc0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
28dd0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
28de0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
28df0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
28e00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28e10 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28e30 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28e40 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
28e50 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
28e60 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
28e70 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
28e80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
28e90 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
28ea0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
28eb0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
28ec0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
28ed0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28ee0 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
28ef0 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
28f00 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
28f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28f20 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
28f30 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
28f40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28f50 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28f60 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28f70 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
28f80 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
28f90 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
28fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28fb0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
28fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28fd0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
28fe0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64  .#endif.}..#ifnd
28ff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
29000 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
29010 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
29020 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
29030 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
29040 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
29050 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
29060 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
29070 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
29080 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
29090 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
290a0 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  winDlOpen(sqlite
290b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
290c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
290d0 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  me){.  HANDLE h;
290e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
290f0 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e  YGWIN__).  int n
29100 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50  Full = pVfs->mxP
29110 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61  athname+1;.  cha
29120 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74  r *zFull = sqlit
29130 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46  e3MallocZero( nF
29140 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a  ull );.  void *z
29150 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
29160 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b   if( zFull==0 ){
29170 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
29180 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
29190 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
291a0 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
291b0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
291c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46  ;.  }.  if( winF
291d0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
291e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
291f0 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49  ll, zFull)!=SQLI
29200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
29210 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29  ite3_free(zFull)
29220 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
29230 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
29240 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
29250 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
29260 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
29270 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  0;.  }.  zConver
29280 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
29290 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
292a0 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  (zFull);.  sqlit
292b0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a  e3_free(zFull);.
292c0 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43  #else.  void *zC
292d0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
292e0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
292f0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
29300 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29310 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64  ETER(pVfs);.#end
29320 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  if.  if( zConver
29330 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
29340 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
29350 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
29360 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
29370 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
29380 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29390 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
293a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
293b0 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c  INRT.    h = osL
293c0 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
293d0 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  ry((LPCWSTR)zCon
293e0 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73  verted, 0);.#els
293f0 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  e.    h = osLoad
29400 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54  LibraryW((LPCWST
29410 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  R)zConverted);.#
29420 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
29430 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
29440 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
29450 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
29460 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
29470 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
29480 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
29490 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
294a0 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
294b0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
294c0 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )h));.  sqlite3_
294d0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
294e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
294f0 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
29500 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
29510 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29520 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29530 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
29540 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29550 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73  fs);.  winGetLas
29560 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
29570 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
29580 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74  , zBufOut);.}.st
29590 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44  atic void (*winD
295a0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
295b0 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c   *pVfs,void *pH,
295c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
295d0 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50  ))(void){.  FARP
295e0 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53  ROC proc;.  UNUS
295f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29600 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47  s);.  proc = osG
29610 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28  etProcAddressA((
29620 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29  HANDLE)pH, zSym)
29630 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
29640 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73  SYM handle=%p, s
29650 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73  ymbol=%s, addres
29660 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%p\n",.       
29670 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a      (void*)pH, z
29680 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63  Sym, (void*)proc
29690 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  ));.  return (vo
296a0 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63  id(*)(void))proc
296b0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
296c0 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
296d0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
296e0 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
296f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29700 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65  (pVfs);.  osFree
29710 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
29720 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52  pHandle);.  OSTR
29730 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61  ACE(("DLCLOSE ha
29740 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69  ndle=%p\n", (voi
29750 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a  d*)pHandle));.}.
29760 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
29770 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
29780 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
29790 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
297a0 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
297b0 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
297c0 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
297d0 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
297e0 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
297f0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
29800 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
29810 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
29820 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
29830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29840 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
29850 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
29860 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
29870 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
29880 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
29890 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
298a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
298b0 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
298c0 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
298d0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
298e0 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
298f0 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
29900 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
29910 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
29920 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
29930 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29940 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
29950 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
29960 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
29970 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
29980 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
29990 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
299a0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
299b0 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
299c0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
299d0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
299e0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
299f0 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  id);.  }.#if SQL
29a00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
29a10 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c  f( sizeof(ULONGL
29a20 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ONG)<=nBuf-n ){.
29a30 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e      ULONGLONG cn
29a40 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
29a50 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63  nt64();.    memc
29a60 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
29a70 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
29a80 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
29a90 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  (cnt);.  }.#else
29aa0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
29ab0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
29ac0 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
29ad0 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
29ae0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
29af0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
29b00 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
29b10 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
29b20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
29b30 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
29b40 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
29b50 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
29b60 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
29b70 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
29b80 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
29b90 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29ba0 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
29bb0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
29bc0 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
29bd0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
29be0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
29bf0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
29c00 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
29c10 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
29c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29c30 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
29c40 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
29c50 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
29c60 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
29c70 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
29c80 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
29c90 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
29ca0 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
29cb0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
29cc0 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
29cd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
29ce0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
29cf0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
29d00 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
29d10 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
29d20 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
29d30 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
29d40 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
29d50 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
29d60 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
29d70 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
29d80 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
29d90 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
29da0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
29db0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
29dc0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
29dd0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
29de0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
29df0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
29e00 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
29e10 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
29e20 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
29e30 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
29e40 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
29e50 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
29e60 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
29e70 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
29e80 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
29e90 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
29ea0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
29eb0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
29ec0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
29ed0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
29ee0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
29ef0 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
29f00 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
29f10 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
29f20 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
29f30 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
29f40 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
29f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29f60 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
29f70 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
29f80 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a 20  ime and date.** 
29f90 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
29fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29fb0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
29fc0 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
29fd0 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
29fe0 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
29ff0 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
2a000 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
2a010 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
2a020 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
2a030 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73  f.     100-nanos
2a040 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
2a050 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
2a060 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
2a070 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20 46  813.5)..  */.  F
2a080 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74  ILETIME ft;.  st
2a090 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a0a0 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65  e3_int64 winFile
2a0b0 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35  timeEpoch = 2305
2a0c0 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  8135*(sqlite3_in
2a0d0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
2a0e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2a0f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2a100 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
2a110 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
2a120 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2a130 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66  )8640000;.#endif
2a140 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20  .  /* 2^32 - to 
2a150 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20  avoid use of LL 
2a160 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20  and warnings in 
2a170 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  gcc */.  static 
2a180 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2a190 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75  t64 max32BitValu
2a1a0 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69 74  e =.      (sqlit
2a1b0 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
2a1c0 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
2a1d0 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
2a1e0 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  +.      (sqlite3
2a1f0 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36  _int64)294967296
2a200 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
2a210 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54  _WINCE.  SYSTEMT
2a220 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65  IME time;.  osGe
2a230 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
2a240 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74  e);.  /* if Syst
2a250 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
2a260 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74  () fails, it ret
2a270 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  urns zero. */.  
2a280 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d  if (!osSystemTim
2a290 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
2a2a0 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
2a2b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2a2c0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73  ;.  }.#else.  os
2a2d0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
2a2e0 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
2a2f0 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77  #endif..  *piNow
2a300 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70   = winFiletimeEp
2a310 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20  och +.          
2a320 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e    ((((sqlite3_in
2a330 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74  t64)ft.dwHighDat
2a340 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56  eTime)*max32BitV
2a350 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20 20  alue) +.        
2a360 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2a370 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
2a380 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
2a390 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
2a3a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2a3b0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
2a3c0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
2a3d0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
2a3e0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2a3f0 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
2a400 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
2a410 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
2a420 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a430 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
2a440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a450 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2a460 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2a470 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2a480 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2a490 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
2a4a0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2a4b0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2a4c0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
2a4d0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
2a4e0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
2a4f0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2a500 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
2a510 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2a520 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2a530 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2a540 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
2a550 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
2a560 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
2a570 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
2a580 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
2a590 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
2a5a0 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
2a5b0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
2a5c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
2a5e0 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
2a5f0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
2a600 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
2a610 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
2a620 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
2a630 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
2a640 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
2a650 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
2a660 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
2a670 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
2a680 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
2a690 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
2a6a0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
2a6b0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
2a6c0 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
2a6d0 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
2a6e0 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
2a6f0 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
2a700 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
2a710 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
2a720 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
2a730 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
2a740 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
2a750 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
2a760 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
2a770 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
2a780 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
2a790 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
2a7a0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2a7b0 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
2a7c0 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
2a7d0 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
2a7e0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
2a7f0 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
2a800 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
2a810 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
2a820 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2a830 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
2a840 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
2a850 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
2a860 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
2a870 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
2a880 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
2a890 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
2a8a0 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
2a8b0 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
2a8c0 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
2a8d0 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
2a8e0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
2a8f0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
2a900 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
2a910 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
2a920 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
2a930 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
2a940 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
2a950 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
2a960 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
2a970 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
2a980 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2a990 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
2a9a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
2a9b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a9c0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2a9d0 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
2a9e0 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
2a9f0 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
2aa00 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
2aa10 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
2aa20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2aa30 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
2aa40 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
2aa50 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
2aa60 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2aa70 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
2aa80 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
2aa90 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
2aaa0 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
2aab0 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
2aac0 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
2aad0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
2aae0 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
2aaf0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2ab00 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2ab10 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2ab20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2ab30 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  Vfs);.  return w
2ab40 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
2ab50 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
2ab60 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b  (), nBuf, zBuf);
2ab70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
2ab80 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
2ab90 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
2aba0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2abb0 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
2abc0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
2abd0 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
2abe0 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
2abf0 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ac10 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2ac20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2ac30 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2ac40 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2ac50 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
2ac60 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2ac70 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac90 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2aca0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
2acb0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2acc0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2acd0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2ace0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2acf0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2ad00 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2ad10 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2ad20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2ad30 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2ad40 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2ad50 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2ad60 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2ad70 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2ad80 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2ad90 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2ada0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2adb0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2adc0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2add0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2ade0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2adf0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2ae00 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2ae10 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2ae20 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2ae30 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2ae40 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2ae50 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2ae60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2ae70 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2ae80 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2ae90 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2aea0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2aeb0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2aec0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2aed0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2aee0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2aef0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2af00 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2af10 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2af20 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2af30 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2af40 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2af50 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2af60 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2af70 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2af80 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2af90 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2afa0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2afb0 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  E).  static sqli
2afc0 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50  te3_vfs winLongP
2afd0 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  athVfs = {.    3
2afe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2aff0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2b000 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2b010 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
2b020 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2b030 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
2b040 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2b050 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2b060 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b070 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2b080 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e  /.    "win32-lon
2b090 67 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e  gpath",    /* zN
2b0a0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0c0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2b0d0 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2b0e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2b0f0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2b100 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2b110 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
2b120 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
2b130 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2b140 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2b150 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
2b160 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2b170 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2b180 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2b190 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2b1a0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2b1b0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2b1c0 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2b1d0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2b1e0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2b1f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2b200 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2b210 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2b220 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2b230 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2b240 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2b250 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
2b260 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
2b270 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2b280 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2b290 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2b2a0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2b2b0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2b2c0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
2b2d0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2b2e0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2b2f0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2b300 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2b310 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2b320 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2b330 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2b340 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2b350 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
2b360 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2b370 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20  /.  };.#endif.. 
2b380 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b   /* Double-check
2b390 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61   that the aSysca
2b3a0 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62  ll[] array has b
2b3b0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  een constructed.
2b3c0 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
2b3d0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33   See ticket [bb3
2b3e0 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20  a86e890c8e96ab] 
2b3f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  */.  assert( Arr
2b400 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
2b410 3d 3d 37 36 20 29 3b 0a 0a 20 20 2f 2a 20 67 65  ==76 );..  /* ge
2b420 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
2b430 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
2b440 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
2b450 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
2b460 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
2b470 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
2b480 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
2b490 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
2b4a0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
2b4b0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
2b4c0 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
2b4d0 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
2b4e0 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
2b4f0 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
2b500 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20  anularity>0 );. 
2b510 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
2b520 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30  nfo.dwPageSize>0
2b530 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   );..  sqlite3_v
2b540 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2b550 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65  Vfs, 1);..#if de
2b560 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2b570 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
2b580 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2b590 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68  ter(&winLongPath
2b5a0 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
2b5b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b5c0 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  _OK;.}..int sqli
2b5d0 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
2b5e0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
2b5f0 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
2b600 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
2b610 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
2b620 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
2b630 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
2b640 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2b650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b660 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2b670 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.