/ Hex Artifact Content
Login

Artifact 9a7fda788394109131677a9fceee8d54820b6c16:


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 20 0a 23 65 6e  ((DWORD)-1) .#en
1770: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c  dif..#ifndef FIL
1780: 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65  E_FLAG_MASK.# de
1790: 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  fine FILE_FLAG_M
17a0: 41 53 4b 20 20 20 20 20 20 20 20 20 20 28 30 78  ASK          (0x
17b0: 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66  FF3C0000).#endif
17c0: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41  ..#ifndef FILE_A
17d0: 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20  TTRIBUTE_MASK.# 
17e0: 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52  define FILE_ATTR
17f0: 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28  IBUTE_MASK     (
1800: 30 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64  0x0003FFF7).#end
1810: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1820: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46  TE_OMIT_WAL./* F
1830: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1840: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73 20  s to structures 
1850: 75 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a  used for WAL */.
1860: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1870: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
1880: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
1890: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
18a0: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
18b0: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
18c0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
18d0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
18e0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
18f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1900: 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61  * WinCE lacks na
1910: 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72  tive support for
1920: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f   file locking so
1930: 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65   we have to fake
1940: 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65   it.** with some
1950: 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e   code of our own
1960: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1970: 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66  OS_WINCE.typedef
1980: 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63   struct winceLoc
1990: 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65  k {.  int nReade
19a0: 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  rs;       /* Num
19b0: 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f  ber of reader lo
19c0: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  cks obtained */.
19d0: 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b    BOOL bPending;
19e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74        /* Indicat
19f0: 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  es a pending loc
1a00: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
1a10: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  ned */.  BOOL bR
1a20: 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20  eserved;     /* 
1a30: 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65  Indicates a rese
1a40: 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65  rved lock has be
1a50: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
1a60: 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65   BOOL bExclusive
1a70: 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65  ;    /* Indicate
1a80: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1a90: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
1aa0: 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65  ained */.} wince
1ab0: 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  Lock;.#endif../*
1ac0: 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20  .** The winFile 
1ad0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73  structure is a s
1ae0: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
1af0: 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69  e3_file* specifi
1b00: 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a  c to the win32.*
1b10: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61  * portability la
1b20: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
1b30: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77  struct winFile w
1b40: 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77  inFile;.struct w
1b50: 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74  inFile {.  const
1b60: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b70: 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a  ods *pMethod; /*
1b80: 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  ** Must be first
1b90: 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   ***/.  sqlite3_
1ba0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1bb0: 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20  /* The VFS used 
1bc0: 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  to open this fil
1bd0: 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  e */.  HANDLE h;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
1c00: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
1c10: 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65  */.  u8 locktype
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c30: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
1c40: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
1c50: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
1c60: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
1c70: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
1c80: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
1c90: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
1ca0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c  ock */.  u8 ctrl
1cb0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1cc0: 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20   /* Flags.  See 
1cd0: 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20  WINFILE_* below 
1ce0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
1cf0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  rrno;        /* 
1d00: 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1d10: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1d20: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66  I/O error */.#if
1d30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d40: 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70  _WAL.  winShm *p
1d50: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
1d60: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
1d70: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
1d80: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  his file */.#end
1d90: 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  if.  const char 
1da0: 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20  *zPath;      /* 
1db0: 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  Full pathname of
1dc0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1dd0: 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  int szChunk;    
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b          /* Chunk
1df0: 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64   size configured
1e00: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1e10: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1e20: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50  TE_OS_WINCE.  LP
1e30: 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c  WSTR zDeleteOnCl
1e40: 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ose;  /* Name of
1e50: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
1e60: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
1e70: 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b    HANDLE hMutex;
1e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
1e90: 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  ex used to contr
1ea0: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61  ol access to sha
1eb0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20  red lock */  .  
1ec0: 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20  HANDLE hShared; 
1ed0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1ee0: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1ef0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1f00: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b  g */.  winceLock
1f10: 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f   local;        /
1f20: 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  * Locks obtained
1f30: 20 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63   by this instanc
1f40: 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a  e of winFile */.
1f50: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61    winceLock *sha
1f60: 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f  red;      /* Glo
1f70: 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  bal shared lock 
1f80: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66  memory for the f
1f90: 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  ile  */.#endif.#
1fa0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1fb0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1fc0: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1fe0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
1ff0: 6e 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ng xFetch refere
2000: 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  nces */.  HANDLE
2010: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
2020: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
2030: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
2040: 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a  memory mapping *
2050: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
2060: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
2070: 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79    /* Area memory
2080: 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c   mapped */.  sql
2090: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
20a0: 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  ize;       /* Us
20b0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70  able size of map
20c0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
20d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
20e0: 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a  apSizeActual; /*
20f0: 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   Actual size of 
2100: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f  mapped region */
2110: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2120: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
2130: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46   /* Configured F
2140: 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76  CNTL_MMAP_SIZE v
2150: 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
2160: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2170: 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46   values for winF
2180: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f  ile.ctrlFlags.*/
2190: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
21a0: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20  _RDONLY         
21b0: 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65   0x02   /* Conne
21c0: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
21d0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ly */.#define WI
21e0: 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
21f0: 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20  L     0x04   /* 
2200: 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d  Persistent WAL m
2210: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ode */.#define W
2220: 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  INFILE_PSOW     
2230: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a         0x10   /*
2240: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2250: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2260: 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  E */../*. * The 
2270: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
2280: 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  er used by sqlit
2290: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
22a0: 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e  ebug().. */.#ifn
22b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
22c0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20  _DBG_BUF_SIZE.# 
22d0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
22e0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
22f0: 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d  E   ((int)(4096-
2300: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a  sizeof(DWORD))).
2310: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2320: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
2330: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
2340: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
2350: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
2360: 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65   * the data dire
2370: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2380: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
23a0: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
23b0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
23c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
23d0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
23e0: 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (1).#endif../*.
23f0: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65   * The value use
2400: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77  d with sqlite3_w
2410: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
2420: 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20  ry() to specify 
2430: 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70  that. * the temp
2440: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
2450: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
2460: 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  d.. */.#ifndef S
2470: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
2480: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
2490: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
24a0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
24b0: 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23  CTORY_TYPE (2).#
24c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
24d0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
24e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
24f0: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
2500: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
2510: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
2520: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
2530: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
2540: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2560: 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74  LLOC../*. * If t
2570: 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  his is non-zero,
2580: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
2590: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
25a0: 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20  d by the native 
25b0: 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74  Win32. * allocat
25c0: 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74  or subsystem; ot
25d0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66  herwise, the def
25e0: 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61  ault process hea
25f0: 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20  p will be used. 
2600: 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67   This. * setting
2610: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77   has no effect w
2620: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  hen compiling fo
2630: 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66  r WinRT.  By def
2640: 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e  ault, this is en
2650: 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20  abled. * and an 
2660: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
2670: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
2680: 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63   store all alloc
2690: 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  ated 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 2a 2a 2a 0a 20 2a  *************. *
26f0: 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20   WARNING: It is 
2700: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
2710: 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2720: 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d   setting is non-
2730: 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20  zero and the. * 
2740: 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53           winMemS
2750: 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
2760: 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e   is called (e.g.
2770: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
2780: 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20  shutdown. *     
2790: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20       function), 
27a0: 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61  all data that wa
27b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
27c0: 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68  g the isolated h
27d0: 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  eap will. *     
27e0: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d       be freed im
27f0: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e  mediately and an
2800: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63  y attempt to acc
2810: 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20  ess any of that 
2820: 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20  freed. *        
2830: 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f    data will almo
2840: 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73  st certainly res
2850: 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69  ult in an immedi
2860: 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61  ate access viola
2870: 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.. *********
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 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  *****. */.#ifnde
28d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
28e0: 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65  EAP_CREATE.#  de
28f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2900: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20  2_HEAP_CREATE   
2910: 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a   (TRUE).#endif..
2920: 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61  /*. * The initia
2930: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  l size of the Wi
2940: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2950: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2960: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2970: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2980: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
2990: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
29a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
29b0: 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49  INIT_SIZE ((SQLI
29c0: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
29d0: 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20  _SIZE) * \.     
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 20                  
2a00: 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c    (SQLITE_DEFAUL
2a10: 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34  T_PAGE_SIZE) + 4
2a20: 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a  194304).#endif..
2a30: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
2a40: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
2a50: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2a60: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2a70: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2a80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2a90: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
2aa0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
2ab0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
2ac0: 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e  AX_SIZE  (0).#en
2ad0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65  dif../*. * The e
2ae0: 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73  xtra flags to us
2af0: 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68  e in calls to th
2b00: 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49  e Win32 heap API
2b10: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  s.  This value m
2b20: 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f  ay be. * zero fo
2b30: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65  r the default be
2b40: 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e  havior.. */.#ifn
2b50: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2b60: 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64  _HEAP_FLAGS.#  d
2b70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2b80: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20  32_HEAP_FLAGS   
2b90: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f    (0).#endif.../
2ba0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44  *.** The winMemD
2bb0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74  ata structure st
2bc0: 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ores information
2bd0: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2be0: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a   Win32-specific.
2bf0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  ** sqlite3_mem_m
2c00: 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74  ethods implement
2c10: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
2c20: 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  f struct winMemD
2c30: 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a  ata winMemData;.
2c40: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
2c50: 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  a {.#ifndef NDEB
2c60: 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b  UG.  u32 magic1;
2c70: 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62     /* Magic numb
2c80: 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72  er to detect str
2c90: 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
2ca0: 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48  n. */.#endif.  H
2cb0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20  ANDLE hHeap; /* 
2cc0: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75  The handle to ou
2cd0: 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f  r heap. */.  BOO
2ce0: 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f  L bOwned;  /* Do
2cf0: 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70   we own the heap
2d00: 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69   (i.e. destroy i
2d10: 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20  t on shutdown)? 
2d20: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2d30: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20  G.  u32 magic2; 
2d40: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2d50: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2d60: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2d70: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  . */.#endif.};..
2d80: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
2d90: 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41  define WINMEM_MA
2da0: 47 49 43 31 20 20 20 20 20 30 78 34 32 62 32 38  GIC1     0x42b28
2db0: 33 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d  30b.#define WINM
2dc0: 45 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78  EM_MAGIC2     0x
2dd0: 62 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a  bd4d7cf4.#endif.
2de0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
2df0: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65  inMemData win_me
2e00: 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64  m_data = {.#ifnd
2e10: 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d  ef NDEBUG.  WINM
2e20: 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69  EM_MAGIC1,.#endi
2e30: 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a  f.  NULL, FALSE.
2e40: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2e50: 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a   ,WINMEM_MAGIC2.
2e60: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64  #endif.};..#ifnd
2e70: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
2e80: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2e90: 67 69 63 31 28 29 20 61 73 73 65 72 74 28 20 77  gic1() assert( w
2ea0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
2eb0: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
2ec0: 31 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  1 ).#define winM
2ed0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29  emAssertMagic2()
2ee0: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2ef0: 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49  _data.magic2==WI
2f00: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64  NMEM_MAGIC2 ).#d
2f10: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2f20: 72 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65  rtMagic()  winMe
2f30: 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b  mAssertMagic1();
2f40: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2f50: 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65  ic2();.#else.#de
2f60: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2f70: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
2f80: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2f90: 65 74 44 61 74 61 50 74 72 28 29 20 20 26 77 69  etDataPtr()  &wi
2fa0: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69  n_mem_data.#defi
2fb0: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  ne winMemGetHeap
2fc0: 28 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64  ()     win_mem_d
2fd0: 61 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e  ata.hHeap.#defin
2fe0: 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  e winMemGetOwned
2ff0: 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61  ()    win_mem_da
3000: 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69  ta.bOwned..stati
3010: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
3020: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
3030: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
3040: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
3050: 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76  Prior);.static v
3060: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
3070: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
3080: 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74   int nBytes);.st
3090: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
30a0: 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74  ize(void *p);.st
30b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52  atic int winMemR
30c0: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73  oundup(int n);.s
30d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
30e0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
30f0: 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ata);.static voi
3100: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
3110: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
3120: 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ;..const sqlite3
3130: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
3140: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
3150: 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f  (void);.#endif /
3160: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
3170: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
3180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
3190: 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61  riable is (norma
31a0: 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e  lly) set once an
31b0: 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a  d never changes.
31c0: 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20  ** thereafter.  
31d0: 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  It records wheth
31e0: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
31f0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78   system is Win9x
3200: 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a  .** or WinNT..**
3210: 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69  .** 0:   Operati
3220: 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77  ng system unknow
3230: 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61  n..** 1:   Opera
3240: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3250: 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70  in9x..** 2:   Op
3260: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
3270: 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49  s WinNT..**.** I
3280: 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c  n order to facil
3290: 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e  itate testing on
32a0: 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c   a WinNT system,
32b0: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
32c0: 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c  e.** can manuall
32d0: 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65  y set this value
32e0: 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65   to 1 to emulate
32f0: 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e   Win98 behavior.
3300: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3310: 45 5f 54 45 53 54 0a 4c 4f 4e 47 20 76 6f 6c 61  E_TEST.LONG vola
3320: 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f  tile sqlite3_os_
3330: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  type = 0;.#else.
3340: 73 74 61 74 69 63 20 4c 4f 4e 47 20 76 6f 6c 61  static LONG vola
3350: 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f  tile sqlite3_os_
3360: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
3370: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
3380: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3390: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
33a0: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
33b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
33c0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
33d0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
33e0: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
33f0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3400: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3410: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3420: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
3430: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
3440: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
3450: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
3460: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
3470: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
3480: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3490: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
34a0: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
34b0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
34c0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
34d0: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
34e0: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
34f0: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
3500: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3510: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3520: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
3530: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
3540: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
3550: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
3560: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
3570: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3590: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
35a0: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
35b0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
35c0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
35d0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
35e0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
35f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3600: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3610: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3620: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3630: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
3640: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3650: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3660: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
3670: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
3680: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3690: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
36a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
36b0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
36c0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
36d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
36f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3700: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3710: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3720: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
3730: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
3740: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
3750: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
3760: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3770: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3780: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3790: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
37a0: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
37b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
37c0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
37d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
37e0: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
37f0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3800: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3830: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
3840: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
3850: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
3860: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3870: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3880: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3890: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
38a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
38b0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
38d0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
38f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3900: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3910: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3920: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3930: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3940: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3950: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
3960: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
3970: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
3980: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3990: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
39b0: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
39c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
39d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
39e0: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
39f0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3a00: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3a10: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3a20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3a30: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3a40: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3a50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3a60: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3a80: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3a90: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3aa0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ab0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3ac0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ad0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ae0: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3af0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3b00: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3b10: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3b20: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3b30: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3b40: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3b50: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3b60: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3b70: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3b80: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3b90: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3ba0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3bb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3bc0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3bd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3be0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3bf0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3c00: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3c30: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3c40: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
3c50: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
3c60: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3c70: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3c80: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3c90: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3ca0: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3cb0: 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49  ent)..#if (!SQLI
3cc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3cd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3ce0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
3cf0: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
3d00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3d10: 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74  WAL)).  { "Creat
3d20: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
3d30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
3d40: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
3d50: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
3d60: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
3d70: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
3d80: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3db0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3dc0: 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48  FileMappingA ((H
3dd0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
3de0: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
3df0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
3e00: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
3e10: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29  RD,DWORD,LPCSTR)
3e20: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
3e30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
3e40: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
3e50: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3e60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3e70: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3e80: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
3e90: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3ea0: 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22  OMIT_WAL)).  { "
3eb0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3ec0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
3ed0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
3ee0: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
3ef0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3f00: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
3f10: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3f20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3f30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3f40: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3f50: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3f60: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3f70: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3f80: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3f90: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3fa0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3fb0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
3fc0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
3fd0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3fe0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3ff0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4000: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
4010: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
4020: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
4030: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
4040: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4050: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
4060: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
4070: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
40a0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
40b0: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
40c0: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
40d0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
40e0: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
40f0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4100: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
4110: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4120: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4130: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
4140: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
4150: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4160: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
4170: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4180: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
4190: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
41a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
41d0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
41e0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
41f0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
4200: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
4210: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4220: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4230: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
4240: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
4250: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
4260: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
4270: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4280: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
4290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
42a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
42d0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
42e0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
42f0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4300: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
4310: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4320: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
4330: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4340: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
4350: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4360: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
4370: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4380: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4390: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
43c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
43d0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
43e0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
43f0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
4400: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
4410: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
4420: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
4430: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
4440: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
4450: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4460: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
4470: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
4480: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
4490: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
44a0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
44b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
44e0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
44f0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
4500: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4510: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
4520: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
4530: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
4540: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
4550: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
4560: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
4570: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
4580: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
4590: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
45a0: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
45b0: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
45c0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
45d0: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
45e0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
45f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4600: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
4610: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
4620: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
4630: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
4640: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4650: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
4660: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
4670: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
46a0: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
46b0: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
46c0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
46d0: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
46e0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
46f0: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
4700: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
4710: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4720: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4730: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4740: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4750: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
4760: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
4770: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
4780: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4790: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
47a0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
47b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
47d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
47e0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
47f0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
4800: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
4810: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4820: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4830: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
4840: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
4850: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4870: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
4880: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
4890: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
48a0: 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62  (SYSCALL)FreeLib
48b0: 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20  rary,           
48c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
48d0: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
48f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4910: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4920: 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  ne osFreeLibrary
4930: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4940: 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61  (HMODULE))aSysca
4950: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
4960: 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e  ..  { "GetCurren
4970: 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20  tProcessId",    
4980: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72   (SYSCALL)GetCur
4990: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20  rentProcessId,  
49a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
49b0: 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
49c0: 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57  cessId ((DWORD(W
49d0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
49e0: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
49f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4a00: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4a10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4a20: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4a30: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
4a40: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
4a50: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
4a60: 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20  SpaceA,       0 
4a70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4a80: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
4a90: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4aa0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4ab0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4ac0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4ad0: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
4ae0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
4af0: 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52  *)(LPCSTR,LPDWOR
4b00: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
4b10: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
4b20: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
4b30: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
4b40: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4b50: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
4b60: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
4b70: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4b80: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4b90: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
4ba0: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4bb0: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
4bc0: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
4bd0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
4be0: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
4bf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4c20: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4c30: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
4c40: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4c50: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
4c60: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4c70: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4c80: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
4c90: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4ca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4cb0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4cc0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4cd0: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
4ce0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4cf0: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
4d00: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4d10: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4d20: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
4d30: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4d40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4d50: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4d60: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4d70: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
4d80: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
4d90: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
4da0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4db0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4dc0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4dd0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4de0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
4df0: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
4e00: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
4e10: 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20  ibutesW,      0 
4e20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4e30: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4e40: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
4e50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4e60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4e70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4e80: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
4e90: 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esW ((DWORD(WINA
4ea0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
4eb0: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
4ec0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4ed0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4ee0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4ef0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4f00: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
4f10: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
4f20: 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23  esExW,    0 },.#
4f30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
4f40: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
4f50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4f80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4f90: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
4fa0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
4fb0: 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49  )(LPCWSTR,GET_FI
4fc0: 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53  LEEX_INFO_LEVELS
4fd0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f  , \.        LPVO
4fe0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  ID))aSyscall[22]
4ff0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5000: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5010: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
5020: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5030: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5040: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5050: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5060: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
5070: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5080: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
50a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
50b0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
50c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
50d0: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
50e0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
50f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5100: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5110: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5120: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5130: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5140: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
5150: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5160: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
5170: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5180: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5190: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
51a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
51c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
51d0: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
51e0: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
51f0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
5200: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
5210: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
5220: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
5230: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5240: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
5250: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5260: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5270: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5280: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
5290: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
52a0: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
52b0: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
52c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
52d0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
52e0: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
52f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5310: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5320: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
5330: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
5340: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
5350: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
5360: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
5370: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
5380: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
5390: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
53a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
53b0: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
53c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
53d0: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
53e0: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
53f0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
5400: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
5410: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
5420: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
5430: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66  D_EXTENSION).#if
5440: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
5450: 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
5460: 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
5470: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
5480: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
5490: 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74   CE. */.  { "Get
54a0: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
54b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
54c0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c  GetProcAddressA,
54d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
54e0: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
54f0: 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  er Windows platf
5500: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
5510: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
5520: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53  take.  ** an ANS
5530: 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  I string regardl
5540: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
5550: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
5560: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
5570: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
5580: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
5590: 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  dress,          
55a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73  0 },.#endif.#els
55b0: 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  e.  { "GetProcAd
55c0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
55d0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5600: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
5610: 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50  cAddressA ((FARP
5620: 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  ROC(WINAPI*)(HMO
5630: 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  DULE, \.        
5640: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5650: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
5660: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5670: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73  INRT.  { "GetSys
5680: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
5690: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
56a0: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
56b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
56c0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
56d0: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
56e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5710: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5720: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
5730: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f  NAPI*)(LPSYSTEM_
5740: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32  INFO))aSyscall[2
5750: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
5760: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5770: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5780: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5790: 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ime,           0
57a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
57b0: 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56  etSystemTime ((V
57c0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
57d0: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
57e0: 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74  all[29].pCurrent
57f0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5800: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74  S_WINCE.  { "Get
5810: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5820: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
5830: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5840: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
5850: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5860: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
5870: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
58a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
58b0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
58c0: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
58d0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
58e0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
58f0: 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74  all[30].pCurrent
5900: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5910: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5920: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65  ANSI).  { "GetTe
5930: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
5940: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5950: 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20  tTempPathA,     
5960: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5970: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
5980: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
5990: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
59c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
59d0: 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57  pPathA ((DWORD(W
59e0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
59f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31  STR))aSyscall[31
5a00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5a10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5a20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
5a30: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5a40: 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  DE).  { "GetTemp
5a50: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
5a60: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5a70: 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20  empPathW,       
5a80: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a90: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5aa0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5ab0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5ae0: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5af0: 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e  athW ((DWORD(WIN
5b00: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53  API*)(DWORD,LPWS
5b10: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  TR))aSyscall[32]
5b20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5b30: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5b40: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
5b50: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
5b60: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
5b70: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
5b80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5b90: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5bb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5bd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5be0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
5bf0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
5c00: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5c10: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
5c20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5c30: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5c40: 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  SI) && defined(S
5c50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5c60: 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20  ERSIONEX) && \. 
5c70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
5c80: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
5c90: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
5ca0: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
5cb0: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
5cc0: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
5cd0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5ce0: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
5cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5d00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5d20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5d30: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
5d40: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
5d50: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
5d60: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
5d70: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
5d80: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5d90: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
5da0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5db0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
5dc0: 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69  & \.        defi
5dd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5de0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26  _GETVERSIONEX) &
5df0: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
5e00: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
5e10: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
5e20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e30: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
5e40: 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  W,           0 }
5e50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5e60: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
5e70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5e80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5e90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ea0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5eb0: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28  GetVersionExW ((
5ec0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5ed0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
5ee0: 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63  SIONINFOW))aSysc
5ef0: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5f00: 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f  )..  { "HeapAllo
5f10: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
5f20: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41    (SYSCALL)HeapA
5f30: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
5f40: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5f50: 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28  e osHeapAlloc ((
5f60: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
5f70: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
5f80: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
5f90: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
5fa0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5fb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5fc0: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5fe0: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6000: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
6010: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
6020: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6030: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6040: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6050: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6060: 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41  sHeapCreate ((HA
6070: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57  NDLE(WINAPI*)(DW
6080: 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20  ORD,SIZE_T, \.  
6090: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
60a0: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
60b0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
60c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
60d0: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
60e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
60f0: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
6100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6110: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6120: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
6130: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6140: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6150: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6160: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6170: 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f  eapDestroy ((BOO
6180: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6190: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e  E))aSyscall[38].
61a0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
61b0: 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20  HeapFree",      
61c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
61d0: 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20  LL)HeapFree,    
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
61f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6200: 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Free ((BOOL(WINA
6210: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6220: 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61  D,LPVOID))aSysca
6230: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
6240: 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c  ..  { "HeapReAll
6250: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
6260: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65   (SYSCALL)HeapRe
6270: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
6280: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6290: 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28   osHeapReAlloc (
62a0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
62b0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
62c0: 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  VOID, \.        
62d0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
62e0: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
62f0: 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20    { "HeapSize", 
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6310: 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65  SYSCALL)HeapSize
6320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6330: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6340: 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45  sHeapSize ((SIZE
6350: 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  _T(WINAPI*)(HAND
6360: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
6370: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6380: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
6390: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
63a0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
63b0: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
63c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
63d0: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
63e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
63f0: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56  #else.  { "HeapV
6400: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
6410: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6440: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6450: 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f  apValidate ((BOO
6460: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6470: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
6480: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
6490: 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e  call[42].pCurren
64a0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
64b0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
64c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
64d0: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
64f0: 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74  CALL)HeapCompact
6500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6510: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
6520: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
6530: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6540: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6550: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6560: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6570: 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55  sHeapCompact ((U
6580: 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  INT(WINAPI*)(HAN
6590: 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63  DLE,DWORD))aSysc
65a0: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
65b0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
65c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
65d0: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
65e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
65f0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6600: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
6610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6620: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
6630: 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yA,            0
6640: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6650: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
6660: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6670: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6680: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6690: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
66a0: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28  osLoadLibraryA (
66b0: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
66c0: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
66d0: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
66e0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
66f0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6700: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6710: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
6720: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
6730: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
6740: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6750: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
6760: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6770: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
6780: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6790: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
67a0: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
67b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
67c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
67e0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
67f0: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
6800: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6810: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
6820: 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [45].pCurrent)..
6830: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6840: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  INRT.  { "LocalF
6850: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
6860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
6870: 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  alFree,         
6880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6890: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
68a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
68b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
68e0: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
68f0: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
6900: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
6910: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
6920: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6930: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6940: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6950: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6970: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20  SCALL)LockFile, 
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6990: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
69a0: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
69b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
69c0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
69d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
69e0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
69f0: 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  osLockFile.#defi
6a00: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
6a10: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6a20: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6a30: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6a40: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6a50: 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[47].pCurrent).
6a60: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
6a70: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
6a80: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6aa0: 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c  CALL)LockFileEx,
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6ac0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6ad0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6ae0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6af0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6b00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6b10: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
6b20: 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66  sLockFileEx.#def
6b30: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  ine osLockFileEx
6b40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6b50: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6b60: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6b70: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6b80: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6b90: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
6ba0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
6bb0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
6bc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6bd0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6be0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
6bf0: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6c00: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6c10: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
6c20: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6c30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6c40: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
6c50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6c60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6c80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6c90: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6ca0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
6cb0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6cc0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6cd0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6ce0: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
6cf0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74  rent)..  { "Mult
6d00: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22  iByteToWideChar"
6d10: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ,     (SYSCALL)M
6d20: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6d30: 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ar,     0 },..#d
6d40: 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74  efine osMultiByt
6d50: 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e  eToWideChar ((in
6d60: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
6d70: 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74  DWORD,LPCSTR,int
6d80: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
6d90: 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c     int))aSyscall
6da0: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
6db0: 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72    { "QueryPerfor
6dc0: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28  manceCounter", (
6dd0: 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72  SYSCALL)QueryPer
6de0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c  formanceCounter,
6df0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6e00: 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
6e10: 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28  eCounter ((BOOL(
6e20: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6e30: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
6e40: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  R*))aSyscall[51]
6e50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6e60: 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20  "ReadFile",     
6e70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6e80: 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20  ALL)ReadFile,   
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6ea0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  ,..#define osRea
6eb0: 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  dFile ((BOOL(WIN
6ec0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56  API*)(HANDLE,LPV
6ed0: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
6ee0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6ef0: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6f00: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
6f10: 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66  )..  { "SetEndOf
6f20: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6f30: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e    (SYSCALL)SetEn
6f40: 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  dOfFile,        
6f50: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6f60: 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  e osSetEndOfFile
6f70: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6f80: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
6f90: 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[53].pCurrent).
6fa0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6fb0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
6fc0: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
6fd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
6fe0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20  tFilePointer,   
6ff0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7000: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
7010: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
7020: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7050: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
7060: 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44  ePointer ((DWORD
7070: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7080: 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20  ,LONG,PLONG, \. 
7090: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
70a0: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
70b0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
70c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
70d0: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
70e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
70f0: 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20  LL)Sleep,       
7100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7110: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65  .#else.  { "Slee
7120: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
7130: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7140: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7150: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7160: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
7170: 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41  leep ((VOID(WINA
7180: 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73  PI*)(DWORD))aSys
7190: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
71a0: 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54  t)..  { "SystemT
71b0: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20  imeToFileTime", 
71c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74     (SYSCALL)Syst
71d0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
71e0: 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ,    0 },..#defi
71f0: 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54  ne osSystemTimeT
7200: 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  oFileTime ((BOOL
7210: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
7220: 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20  SYSTEMTIME*, \. 
7230: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
7240: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  E))aSyscall[56].
7250: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7260: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7270: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
7280: 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NRT.  { "UnlockF
7290: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
72a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
72b0: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
72c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
72d0: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
72e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
72f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
7320: 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69  fndef osUnlockFi
7330: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  le.#define osUnl
7340: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
7350: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7360: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7370: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7380: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
7390: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
73a0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
73b0: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
73c0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
73d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
73e0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  nlockFileEx,    
73f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7400: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7410: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
7420: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7450: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
7460: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
7470: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7480: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7490: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
74a0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
74b0: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
74c0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
74d0: 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65  WINCE || !define
74e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
74f0: 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  L).  { "UnmapVie
7500: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7510: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
7520: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
7530: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7540: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
7550: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
7560: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7590: 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77  fine osUnmapView
75a0: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
75b0: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29  NAPI*)(LPCVOID))
75c0: 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75  aSyscall[59].pCu
75d0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64  rrent)..  { "Wid
75e0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
75f0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
7600: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
7610: 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  yte,     0 },..#
7620: 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61  define osWideCha
7630: 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69  rToMultiByte ((i
7640: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
7650: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69  ,DWORD,LPCWSTR,i
7660: 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a  nt,LPSTR,int, \.
7670: 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c          LPCSTR,L
7680: 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b  PBOOL))aSyscall[
7690: 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  60].pCurrent).. 
76a0: 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20   { "WriteFile", 
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
76c0: 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65  YSCALL)WriteFile
76d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
76e0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
76f0: 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c  WriteFile ((BOOL
7700: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7710: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  ,LPCVOID,DWORD,L
7720: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
7730: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
7740: 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75  aSyscall[61].pCu
7750: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7760: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7770: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
7780: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7790: 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45  ALL)CreateEventE
77a0: 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  xW,          0 }
77b0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
77c0: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
77d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
77e0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
77f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7800: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7810: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28  CreateEventExW (
7820: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7830: 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  (LPSECURITY_ATTR
7840: 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20  IBUTES,LPCWSTR, 
7850: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
7860: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7870: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
7880: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7890: 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NRT.  { "WaitFor
78a0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
78b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
78c0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c  ForSingleObject,
78d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
78e0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
78f0: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7900: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7930: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
7940: 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57  ingleObject ((DW
7950: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
7960: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  DLE, \.        D
7970: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
7980: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
7990: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
79a0: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
79b0: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
79c0: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
79d0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
79e0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
79f0: 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e  ctEx ((DWORD(WIN
7a00: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7a10: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f  RD, \.        BO
7a20: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d  OL))aSyscall[64]
7a30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7a40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7a50: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7a60: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
7a70: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
7a80: 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20  ointerEx,       
7a90: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7aa0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
7ab0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
7ac0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7ae0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7af0: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
7b00: 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  erEx ((BOOL(WINA
7b10: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47  PI*)(HANDLE,LARG
7b20: 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20  E_INTEGER, \.   
7b30: 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45       PLARGE_INTE
7b40: 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63  GER,DWORD))aSysc
7b50: 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74  all[65].pCurrent
7b60: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7b70: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
7b80: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7b90: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
7ba0: 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72  ALL)GetFileInfor
7bb0: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7bc0: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
7bd0: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
7be0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
7bf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7c10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7c20: 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f  ne osGetFileInfo
7c30: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7c40: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7c50: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
7c60: 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59      FILE_INFO_BY
7c70: 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50  _HANDLE_CLASS,LP
7c80: 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73  VOID,DWORD))aSys
7c90: 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e  call[66].pCurren
7ca0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7cb0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
7cc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7cd0: 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  WAL).  { "MapVie
7ce0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
7d00: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7d10: 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  p,    0 },.#else
7d20: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
7d30: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
7d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7d70: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
7d80: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28  OfFileFromApp ((
7d90: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
7da0: 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f  HANDLE,ULONG,ULO
7db0: 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20  NG64, \.        
7dc0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
7dd0: 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [67].pCurrent)..
7de0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7df0: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NRT.  { "CreateF
7e00: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
7e10: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
7e20: 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20  teFile2,        
7e30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7e40: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
7e50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
7e60: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7e90: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
7ea0: 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  le2 ((HANDLE(WIN
7eb0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
7ec0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
7ed0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45   \.        LPCRE
7ee0: 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
7ef0: 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53  D_PARAMETERS))aS
7f00: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
7f10: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7f20: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
7f30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7f40: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
7f50: 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  ).  { "LoadPacka
7f60: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
7f70: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61   (SYSCALL)LoadPa
7f80: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20  ckagedLibrary,  
7f90: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7fa0: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
7fb0: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
7fc0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7fe0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7ff0: 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  ine osLoadPackag
8000: 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44  edLibrary ((HMOD
8010: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
8020: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
8030: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
8040: 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  69].pCurrent)..#
8050: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8060: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
8070: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8080: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
8090: 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20  ckCount64,      
80a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
80b0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
80c0: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
80d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8100: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
8110: 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e  unt64 ((ULONGLON
8120: 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  G(WINAPI*)(VOID)
8130: 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43  )aSyscall[70].pC
8140: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8150: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
8160: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8170: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8180: 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79  CALL)GetNativeSy
8190: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20  stemInfo,     0 
81a0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
81b0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
81c0: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
81d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
81e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
81f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8200: 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
8210: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
8220: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
8230: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
8240: 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72  Syscall[71].pCur
8250: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
8260: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8270: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f  HAS_ANSI).  { "O
8280: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8290: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
82a0: 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  L)OutputDebugStr
82b0: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
82c0: 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75  #else.  { "Outpu
82d0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
82e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8310: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75  if..#define osOu
8320: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
8330: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
8340: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
8350: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
8360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8370: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
8380: 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  DE).  { "OutputD
8390: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
83a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
83b0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20  utDebugStringW, 
83c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
83d0: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
83e0: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
83f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8420: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
8430: 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49  bugStringW ((VOI
8440: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
8450: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d  TR))aSyscall[73]
8460: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
8470: 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22  "GetProcessHeap"
8480: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8490: 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65  ALL)GetProcessHe
84a0: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
84b0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
84c0: 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41  ProcessHeap ((HA
84d0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f  NDLE(WINAPI*)(VO
84e0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d  ID))aSyscall[74]
84f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8500: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8510: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
8520: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
8530: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
8540: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
8550: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
8560: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20  MappingFromApp, 
8570: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8580: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8590: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
85a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
85c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
85d0: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
85e0: 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41  pingFromApp ((HA
85f0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
8600: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
8610: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
8620: 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  BUTES,ULONG,ULON
8630: 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79  G64,LPCWSTR))aSy
8640: 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65  scall[75].pCurre
8650: 6e 74 29 0a 0a 20 20 7b 20 22 49 6e 74 65 72 6c  nt)..  { "Interl
8660: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8670: 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  ange", (SYSCALL)
8680: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8690: 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c  reExchange, 0 },
86a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65  ..#define osInte
86b0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
86c0: 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49  change ((LONG(WI
86d0: 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 76 6f 6c 61  NAPI*)(LONG vola
86e0: 74 69 6c 65 2a 2c 20 5c 0a 20 20 20 20 20 20 20  tile*, \.       
86f0: 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73   LONG,LONG))aSys
8700: 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e  call[76].pCurren
8710: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
8720: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
8730: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
8740: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
8750: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
8760: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
8770: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
8780: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
8790: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
87a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
87b0: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
87c0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
87d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
87e0: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
87f0: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
8800: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
8810: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
8820: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
8830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
8840: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
8850: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
8860: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
8870: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
8880: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
8890: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
88a0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
88b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
88c0: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
88d0: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
88e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
88f0: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
8900: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
8910: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
8920: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
8930: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
8940: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
8950: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8960: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
8970: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
8980: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
8990: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
89a0: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
89b0: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
89c0: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
89d0: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
89e0: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
89f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
8a00: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
8a10: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
8a20: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
8a30: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
8a40: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
8a50: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
8a60: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8a70: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
8a80: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8a90: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
8aa0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8ab0: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
8ac0: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
8ad0: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
8ae0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
8af0: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
8b00: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
8b10: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8b20: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8b30: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8b40: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
8b50: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
8b60: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
8b70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
8b80: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8b90: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
8ba0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
8bb0: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
8bc0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
8bd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8be0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
8bf0: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
8c00: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
8c10: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
8c20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
8c30: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
8c40: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
8c50: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
8c60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8c70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8c80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
8c90: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
8ca0: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
8cb0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8cc0: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
8cd0: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
8ce0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
8cf0: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
8d00: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
8d10: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
8d20: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
8d30: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
8d40: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
8d50: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
8d60: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8d70: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
8d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8d90: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
8da0: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
8db0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
8dc0: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
8dd0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
8de0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
8df0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
8e00: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
8e10: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
8e20: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
8e30: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
8e40: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
8e50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8e60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
8e70: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
8e80: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
8e90: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
8ea0: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
8eb0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
8ec0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
8ed0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
8ee0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
8ef0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
8f00: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
8f10: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
8f20: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
8f30: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
8f40: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
8f50: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
8f60: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
8f70: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
8f80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
8f90: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
8fa0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8fb0: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
8fc0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
8fd0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
8fe0: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
8ff0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
9000: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9010: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9020: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9030: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
9040: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
9050: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9060: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
9070: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
9080: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
9090: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
90a0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
90b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
90c0: 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69  OC./*.** If a Wi
90d0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
90e0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
90f0: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9100: 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  on will attempt 
9110: 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74  to.** compact it
9120: 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  .  Upon success,
9130: 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20   SQLITE_OK will 
9140: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70  be returned.  Up
9150: 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a  on failure, one.
9160: 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** of SQLITE_NOM
9170: 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  EM, SQLITE_ERROR
9180: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
9190: 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74  OUND will be ret
91a0: 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22  urned.  The.** "
91b0: 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d  pnLargest" argum
91c0: 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f  ent, if non-zero
91d0: 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  , will be used t
91e0: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a  o return the siz
91f0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67  e of the.** larg
9200: 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72  est committed fr
9210: 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20  ee block in the 
9220: 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a  heap, in bytes..
9230: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
9240: 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61  in32_compact_hea
9250: 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65  p(LPUINT pnLarge
9260: 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
9270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e  SQLITE_OK;.  UIN
9280: 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  T nLargest = 0;.
9290: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
92a0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
92b0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
92c0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
92d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
92e0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
92f0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9300: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9310: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9320: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9330: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9340: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9350: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
9360: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
9370: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9380: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
9390: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  ;.#endif.#if !SQ
93a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
93b0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
93c0: 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73  T.  if( (nLarges
93d0: 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28  t=osHeapCompact(
93e0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
93f0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29  N32_HEAP_FLAGS))
9400: 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  ==0 ){.    DWORD
9410: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
9420: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
9430: 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
9440: 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  ==NO_ERROR ){.  
9450: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9460: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
9470: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
9480: 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c  pact (no space),
9490: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
94b0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
94c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
94d0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
94e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
94f0: 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  g(SQLITE_ERROR, 
9500: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
9510: 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65  ompact (%lu), he
9520: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9530: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
9540: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
9550: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
9560: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
9570: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
9580: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  lse.  sqlite3_lo
9590: 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  g(SQLITE_NOTFOUN
95a0: 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  D, "failed to He
95b0: 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d  apCompact, heap=
95c0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
95d0: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
95e0: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
95f0: 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66  NOTFOUND;.#endif
9600: 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74  .  if( pnLargest
9610: 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20   ) *pnLargest = 
9620: 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75  nLargest;.  retu
9630: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9640: 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76  If a Win32 nativ
9650: 65 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20  e heap has been 
9660: 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73  configured, this
9670: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
9680: 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73  ttempt to.** des
9690: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
96a0: 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69  e it.  If the Wi
96b0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
96c0: 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20  is not isolated 
96d0: 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71  and/or.** the sq
96e0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
96f0: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  d() function doe
9700: 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72  s not return zer
9710: 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  o, SQLITE_BUSY w
9720: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
9730: 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65  ed and no change
9740: 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  s will be made t
9750: 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  o the Win32 nati
9760: 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20  ve heap..*/.int 
9770: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65  sqlite3_win32_re
9780: 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e  set_heap(){.  in
9790: 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  t rc;.  MUTEX_LO
97a0: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
97b0: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f  ex *pMaster; ) /
97c0: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
97d0: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
97e0: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
97f0: 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29  3_mutex *pMem; )
9800: 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79      /* The memsy
9810: 73 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  s static mutex *
9820: 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  /.  MUTEX_LOGIC(
9830: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
9840: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
9850: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
9860: 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55  _MASTER); ).  MU
9870: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20  TEX_LOGIC( pMem 
9880: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
9890: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
98a0: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a  _STATIC_MEM); ).
98b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
98c0: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
98d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
98e0: 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77  enter(pMem);.  w
98f0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
9900: 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d  ();.  if( winMem
9910: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
9920: 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  && winMemGetOwne
9930: 64 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d  d() && sqlite3_m
9940: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
9950: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
9960: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
9970: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
9980: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d  no outstanding m
9990: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
99a0: 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  s on.    ** the 
99b0: 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e  heap.  Also, sin
99c0: 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74  ce both the mast
99d0: 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f  er and memsys lo
99e0: 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  cks are currentl
99f0: 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68  y.    ** being h
9a00: 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74  eld by us, no ot
9a10: 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e  her function (i.
9a20: 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  e. from another 
9a30: 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20  thread) should. 
9a40: 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f     ** be able to
9a50: 20 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65   even access the
9a60: 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20   heap.  Attempt 
9a70: 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  to destroy and r
9a80: 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20  ecreate our.    
9a90: 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33  ** isolated Win3
9aa0: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f  2 native heap no
9ab0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
9ac0: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48  sert( winMemGetH
9ad0: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9ae0: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
9af0: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
9b00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9b10: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
9b20: 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65  ==0 );.    winMe
9b30: 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d  mShutdown(winMem
9b40: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
9b50: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
9b60: 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c  mGetHeap()==NULL
9b70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9b80: 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28  !winMemGetOwned(
9b90: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9ba0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9bb0: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
9bc0: 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74   rc = winMemInit
9bd0: 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74  (winMemGetDataPt
9be0: 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r());.    assert
9bf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9c00: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  || winMemGetHeap
9c10: 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()!=NULL );.    
9c20: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9c30: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
9c40: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
9c50: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
9c60: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
9c70: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9c80: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
9c90: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
9ca0: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9cb0: 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64  ap cannot be mod
9cc0: 69 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74  ified because it
9cd0: 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a   may be in use..
9ce0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
9cf0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
9d00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9d10: 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20  _leave(pMem);.  
9d20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9d30: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
9d40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
9d50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
9d60: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
9d70: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9d80: 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73  on outputs the s
9d90: 70 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20  pecified (ANSI) 
9da0: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69  string to the Wi
9db0: 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n32 debugger.** 
9dc0: 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
9dd0: 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */..void sqlite3
9de0: 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62  _win32_write_deb
9df0: 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ug(const char *z
9e00: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
9e10: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
9e20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
9e30: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
9e40: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
9e50: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
9e60: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
9e70: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
9e80: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
9e90: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
9ea0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
9eb0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
9ec0: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
9ed0: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
9ee0: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
9ef0: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
9f00: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
9f10: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9f20: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
9f30: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
9f40: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
9f50: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
9f60: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
9f70: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
9f80: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
9f90: 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75  in);.    osOutpu
9fa0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44  tDebugStringA(zD
9fb0: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
9fc0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
9fd0: 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b  ugStringA(zBuf);
9fe0: 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e  .  }.#elif defin
9ff0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
a000: 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73  HAS_WIDE).  mems
a010: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a020: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a030: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20  BUF_SIZE);.  if 
a040: 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  ( osMultiByteToW
a050: 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20  ideChar(.       
a060: 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73     osAreFileApis
a070: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
a080: 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a  : CP_OEMCP, 0, z
a090: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  Buf,.          n
a0a0: 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62  Min, (LPWSTR)zDb
a0b0: 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e  gBuf, SQLITE_WIN
a0c0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f  32_DBG_BUF_SIZE/
a0d0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d  sizeof(WCHAR))<=
a0e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
a0f0: 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44  .  }.  osOutputD
a100: 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43  ebugStringW((LPC
a110: 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23  WSTR)zDbgBuf);.#
a120: 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  else.  if( nMin>
a130: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
a140: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
a150: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a160: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
a170: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
a180: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72  , nMin);.    fpr
a190: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a1a0: 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  ", zDbgBuf);.  }
a1b0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
a1c0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
a1d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zBuf);.  }.#endi
a1e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
a1f0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
a200: 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75   suspends the cu
a210: 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72  rrent thread for
a220: 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20   at least ms.** 
a230: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
a240: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
a250: 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53  t to the Win32 S
a260: 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65  leep() interface
a270: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
a280: 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20  OS_WINRT.static 
a290: 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20  HANDLE sleepObj 
a2a0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
a2b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
a2c0: 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d  32_sleep(DWORD m
a2d0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69  illiseconds){.#i
a2e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
a2f0: 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62  T.  if ( sleepOb
a300: 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  j==NULL ){.    s
a310: 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61  leepObj = osCrea
a320: 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c  teEventExW(NULL,
a330: 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
a340: 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
a350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a    SYNCHRONIZE);.
a380: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c    }.  assert( sl
a390: 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a  eepObj!=NULL );.
a3a0: 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c    osWaitForSingl
a3b0: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
a3c0: 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  bj, milliseconds
a3d0: 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a  , FALSE);.#else.
a3e0: 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73    osSleep(millis
a3f0: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
a400: 7d 0a 0a 44 57 4f 52 44 20 73 71 6c 69 74 65 33  }..DWORD sqlite3
a410: 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c 45  Win32Wait(HANDLE
a420: 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57 4f   hObject){.  DWO
a430: 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20  RD rc;.  while( 
a440: 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  (rc = osWaitForS
a450: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68 4f  ingleObjectEx(hO
a460: 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45 2c  bject, INFINITE,
a470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d 3d          TRUE))==
a4a0: 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49  WAIT_IO_COMPLETI
a4b0: 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ON ){}.  return 
a4c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
a4d0: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
a4e0: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
a4f0: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
a500: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
a510: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
a520: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
a530: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
a540: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
a550: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
a560: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
a570: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
a580: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
a590: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
a5a0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
a5b0: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
a5c0: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
a5d0: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
a5e0: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
a5f0: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
a600: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
a610: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
a620: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
a630: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
a640: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
a650: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
a660: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
a670: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
a680: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
a690: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
a6a0: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
a6b0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
a6c0: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66  x() API..*/..#if
a6d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a6e0: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
a6f0: 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  NEX) || !SQLITE_
a700: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
a710: 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  EX.# define osIs
a720: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20  NT()  (1).#elif 
a730: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
a740: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
a750: 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  RT || !defined(S
a760: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
a770: 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f  ANSI).# define o
a780: 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c  sIsNT()  (1).#el
a790: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a7a0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
a7b0: 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  E).# define osIs
a7c0: 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a  NT()  (0).#else.
a7d0: 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28  # define osIsNT(
a7e0: 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f 73 5f  )  ((sqlite3_os_
a7f0: 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c 69  type==2) || sqli
a800: 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28  te3_win32_is_nt(
a810: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
a820: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
a830: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74 68 65  etermines if the
a840: 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75 6e 6e   machine is runn
a850: 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  ing a version of
a860: 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61 73 65   Windows.** base
a870: 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e  d on the NT kern
a880: 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  el..*/.int sqlit
a890: 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 76  e3_win32_is_nt(v
a8a0: 6f 69 64 29 7b 0a 20 20 69 66 28 20 6f 73 49 6e  oid){.  if( osIn
a8b0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
a8c0: 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65  Exchange(&sqlite
a8d0: 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30 29  3_os_type, 0, 0)
a8e0: 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ==0 ){.#if defin
a8f0: 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  ed(NTDDI_VERSION
a900: 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49  ) && NTDDI_VERSI
a910: 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 38  ON >= NTDDI_WIN8
a920: 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e  .    OSVERSIONIN
a930: 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73  FOW sInfo;.    s
a940: 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e  Info.dwOSVersion
a950: 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f  InfoSize = sizeo
a960: 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  f(sInfo);.    os
a970: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73  GetVersionExW(&s
a980: 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20  Info);.#else.   
a990: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20   OSVERSIONINFOA 
a9a0: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
a9b0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
a9c0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
a9d0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
a9e0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
a9f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6f 73  );.#endif.    os
aa00: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
aa10: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
aa20: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20  te3_os_type,.   
aa30: 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c       (sInfo.dwPl
aa40: 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f  atformId == VER_
aa50: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
aa60: 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a  T) ? 2 : 1, 0);.
aa70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49    }.  return osI
aa80: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
aa90: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
aaa0: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32  e3_os_type, 2, 2
aab0: 29 3d 3d 32 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  )==2;.}..#ifdef 
aac0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
aad0: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  LOC./*.** Alloca
aae0: 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d  te nBytes of mem
aaf0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
ab00: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
ab10: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  c(int nBytes){. 
ab20: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
ab30: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
ab40: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
ab50: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
ab60: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
ab70: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
ab80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
ab90: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
aba0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
abb0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
abc0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
abd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
abe0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
abf0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
ac00: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
ac10: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
ac20: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
ac30: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
ac40: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
ac50: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
ac60: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
ac70: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
ac80: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
ac90: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
aca0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
acb0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
acc0: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
acd0: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
ace0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
acf0: 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73        nBytes, os
ad00: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
ad10: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
ad20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
ad30: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
ad40: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
ad50: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
ad60: 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20  oid *pPrior){.  
ad70: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20  HANDLE hHeap;.. 
ad80: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
ad90: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
ada0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
adb0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
adc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
add0: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
ade0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
adf0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
ae00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
ae10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
ae20: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
ae30: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
ae40: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
ae50: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
ae60: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
ae70: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
ae80: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b  pPrior ) return;
ae90: 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c   /* Passing NULL
aea0: 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20   to HeapFree is 
aeb0: 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20  undefined. */.  
aec0: 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28  if( !osHeapFree(
aed0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
aee0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
aef0: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73  pPrior) ){.    s
af00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
af10: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
af20: 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f   to HeapFree blo
af30: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
af40: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
af50: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f         pPrior, o
af60: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
af70: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
af80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
af90: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
afa0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f  an existing memo
afb0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ry allocation.*/
afc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
afd0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
afe0: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
aff0: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
b000: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
b010: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
b020: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
b030: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
b040: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
b050: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
b060: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
b070: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b080: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b090: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b0a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b0b0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b0c0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
b0d0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
b0e0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
b0f0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
b100: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  r) );.#endif.  a
b110: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
b120: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f   );.  if( !pPrio
b130: 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  r ){.    p = osH
b140: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
b150: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b160: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
b170: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  )nBytes);.  }els
b180: 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  e{.    p = osHea
b190: 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  pReAlloc(hHeap, 
b1a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b1b0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c  P_FLAGS, pPrior,
b1c0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
b1d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29  ;.  }.  if( !p )
b1e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b1f0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b200: 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75  "failed to %s %u
b210: 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65   bytes (%lu), he
b220: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
b230: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
b240: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
b250: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
b260: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
b270: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
b280: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
b290: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
b2a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
b2b0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
b2c0: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
b2d0: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
b2e0: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
b2f0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
b300: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
b310: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
b320: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
b330: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b340: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b350: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b360: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b370: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b380: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b390: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b3a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b3b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b3c0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b3d0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b3e0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b3f0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b400: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b410: 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  p) );.#endif.  i
b420: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
b430: 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69  ;.  n = osHeapSi
b440: 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ze(hHeap, SQLITE
b450: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b460: 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  S, p);.  if( n==
b470: 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20  (SIZE_T)-1 ){.  
b480: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b490: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
b4a0: 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20  led to HeapSize 
b4b0: 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20  block %p (%lu), 
b4c0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
b4d0: 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47            p, osG
b4e0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
b4f0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b500: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b510: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b    return (int)n;
b520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20  .}../*.** Round 
b530: 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a  up a request siz
b540: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  e to the next va
b550: 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  lid allocation s
b560: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
b570: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
b580: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
b590: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n n;.}../*.** In
b5a0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
b5b0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
b5c0: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
b5d0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
b5e0: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
b5f0: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
b600: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
b610: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
b620: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
b630: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b640: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b650: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
b660: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
b670: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b680: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
b690: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
b6a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b6b0: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
b6c0: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
b6d0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
b6e0: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
b6f0: 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61    DWORD dwInitia
b700: 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  lSize = SQLITE_W
b710: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
b720: 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64  IZE;.    DWORD d
b730: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28  wMaximumSize = (
b740: 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f  DWORD)sqlite3Glo
b750: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b  balConfig.nHeap;
b760: 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d  .    if( dwMaxim
b770: 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  umSize==0 ){.   
b780: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
b790: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
b7a0: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20  HEAP_MAX_SIZE;. 
b7b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49     }else if( dwI
b7c0: 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78  nitialSize>dwMax
b7d0: 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20  imumSize ){.    
b7e0: 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20    dwInitialSize 
b7f0: 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b  = dwMaximumSize;
b800: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
b810: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
b820: 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c  osHeapCreate(SQL
b830: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b840: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
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 64 77 49 6e              dwIn
b870: 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78  itialSize, dwMax
b880: 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69  imumSize);.    i
b890: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
b8a0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20  >hHeap ){.      
b8b0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b8c0: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
b8d0: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48      "failed to H
b8e0: 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c  eapCreate (%lu),
b8f0: 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53   flags=%u, initS
b900: 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65  ize=%lu, maxSize
b910: 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20  =%lu",.         
b920: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b930: 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ), SQLITE_WIN32_
b940: 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e  HEAP_FLAGS, dwIn
b950: 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20  itialSize,.     
b960: 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69       dwMaximumSi
b970: 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
b980: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b990: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
b9a0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
b9b0: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
b9c0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
b9d0: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
b9e0: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
b9f0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
ba00: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
ba10: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
ba20: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
ba30: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ba40: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
ba50: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
ba60: 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29  rocessHeap (%lu)
ba70: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ", osGetLastErro
ba80: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r());.    return
ba90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
baa0: 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61   }.  pWinMemData
bab0: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
bac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69  ;.  assert( !pWi
bad0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
bae0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
baf0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
bb00: 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ->hHeap!=0 );.  
bb10: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
bb20: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
bb30: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
bb40: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
bb50: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
bb60: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
bb70: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
bb80: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
bb90: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
bba0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
bbb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bbc0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
bbd0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
bbe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bbf0: 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a  *.** Deinitializ
bc00: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
bc10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
bc20: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
bc30: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
bc40: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
bc50: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
bc60: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
bc70: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
bc80: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a  mData ) return;.
bc90: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bca0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
bcb0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
bcc0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bcd0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
bce0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
bcf0: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61  .  if( pWinMemDa
bd00: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
bd10: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bd20: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
bd30: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bd40: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bd50: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bd60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bd70: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bd80: 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  E).    assert( o
bd90: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
bda0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bdb0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
bdc0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
bdd0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
bde0: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
bdf0: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20  bOwned ){.      
be00: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72  if( !osHeapDestr
be10: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  oy(pWinMemData->
be20: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20  hHeap) ){.      
be30: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
be40: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
be50: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72  led to HeapDestr
be60: 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  oy (%lu), heap=%
be70: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
be80: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
be90: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
bea0: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  )pWinMemData->hH
beb0: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eap);.      }.  
bec0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
bed0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
bee0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
bef0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
bf00: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
bf10: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
bf20: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
bf30: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
bf40: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
bf50: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
bf60: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
bf70: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
bf80: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
bf90: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
bfa0: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
bfb0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
bfc0: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
bfd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bfe0: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
bff0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
c000: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
c010: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
c020: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
c030: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
c040: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
c050: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
c060: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
c070: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74  in32(void){.  st
c080: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
c090: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77  e3_mem_methods w
c0a0: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b  inMemMethods = {
c0b0: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  .    winMemMallo
c0c0: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65  c,.    winMemFre
c0d0: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61  e,.    winMemRea
c0e0: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
c0f0: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Size,.    winMem
c100: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e  Roundup,.    win
c110: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e  MemInit,.    win
c120: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
c130: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20   &win_mem_data. 
c140: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
c150: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  nMemMethods;.}..
c160: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
c170: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
c180: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
c190: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
c1a0: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d  MALLOC, sqlite3M
c1b0: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d  emGetWin32());.}
c1c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c1d0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
c1e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
c1f0: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
c200: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
c210: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20  code (UTF-16?). 
c220: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c230: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c240: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c250: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
c260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
c270: 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  TR winUtf8ToUnic
c280: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
c290: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
c2a0: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
c2b0: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  R zWideFilename;
c2c0: 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  ..  nChar = osMu
c2d0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c2e0: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
c2f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
c300: 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68  L, 0);.  if( nCh
c310: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ar==0 ){.    ret
c320: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69  urn 0;.  }.  zWi
c330: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  deFilename = sql
c340: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
c350: 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69  nChar*sizeof(zWi
c360: 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  deFilename[0]) )
c370: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c  ;.  if( zWideFil
c380: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c3a0: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
c3b0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
c3c0: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
c3d0: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
c3e0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
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 6e 43 68 61 72 29 3b 0a          nChar);.
c410: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
c420: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c430: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
c440: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
c450: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c460: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
c470: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
c480: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
c490: 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   Unicode to UTF-
c4a0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
c4b0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c4c0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
c4d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c4e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
c4f0: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
c500: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
c510: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
c520: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
c530: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
c540: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
c550: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
c560: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
c570: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c580: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
c590: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c5a0: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
c5b0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
c5c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
c5d0: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
c5e0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
c5f0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c600: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
c610: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c620: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
c630: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
c640: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
c650: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, 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 30 2c 20 30 29             0, 0)
c680: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c690: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
c6a0: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
c6b0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
c6c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
c6d0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
c6e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c6f0: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f  n ANSI string to
c700: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c710: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  de, based on the
c720: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65  .** current code
c730: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f  page settings fo
c740: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20  r 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 20 0a 2a 2a   to hold the .**
cee0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
cef0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
cf00: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
cf10: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
cf20: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
cf30: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
cf40: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
cf50: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
cf60: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
cf70: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
cf80: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
cf90: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
cfa0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
cfb0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
cfc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
cfd0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69  ilenameMbcs = wi
cfe0: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a  nUnicodeToMbcs(z
cff0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
d000: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
d010: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69  e);.  return zFi
d020: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f  lenameMbcs;.}../
d030: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d040: 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61  on sets the data
d050: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68   directory or th
d060: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
d070: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a  ctory based on.*
d080: 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61  * the provided a
d090: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74  rguments.  The t
d0a0: 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ype argument mus
d0b0: 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20  t be 1 in order 
d0c0: 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61  to set the.** da
d0d0: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
d0e0: 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  2 in order to se
d0f0: 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  t the temporary 
d100: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20  directory.  The 
d110: 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65  zValue.** argume
d120: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
d130: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
d140: 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74  to use.  The ret
d150: 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  urn value will b
d160: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  e.** SQLITE_OK i
d170: 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
d180: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
d190: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
d1a0: 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43  (DWORD type, LPC
d1b0: 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20  WSTR zValue){.  
d1c0: 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f  char **ppDirecto
d1d0: 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ry = 0;.#ifndef 
d1e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d1f0: 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20  INIT.  int rc = 
d200: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
d210: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
d220: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
d230: 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  if.  if( type==S
d240: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
d250: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
d260: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
d270: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61  ry = &sqlite3_da
d280: 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  ta_directory;.  
d290: 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d  }else if( type==
d2a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
d2b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
d2c0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
d2d0: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74  ory = &sqlite3_t
d2e0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
d2f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70   }.  assert( !pp
d300: 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70  Directory || typ
d310: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d320: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d330: 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  YPE.          ||
d340: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d350: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
d360: 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61  RY_TYPE.  );.  a
d370: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
d380: 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65  ory || sqlite3Me
d390: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70  mdebugHasType(*p
d3a0: 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54  pDirectory, MEMT
d3b0: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69  YPE_HEAP) );.  i
d3c0: 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29  f( ppDirectory )
d3d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c  {.    char *zVal
d3e0: 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20  ueUtf8 = 0;.    
d3f0: 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56  if( zValue && zV
d400: 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  alue[0] ){.     
d410: 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69   zValueUtf8 = wi
d420: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
d430: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
d440: 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30   ( zValueUtf8==0
d450: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d460: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d480: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d490: 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  *ppDirectory);. 
d4a0: 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20     *ppDirectory 
d4b0: 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20  = zValueUtf8;.  
d4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4d0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
d4e0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
d4f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ../*.** The retu
d500: 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47  rn value of winG
d510: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
d520: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
d530: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
d540: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
d550: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
d560: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
d570: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
d580: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
d590: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
d5a0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f  LastErrorMsg(DWO
d5b0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e  RD lastErrno, in
d5c0: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
d5d0: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
d5e0: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
d5f0: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
d600: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
d610: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
d620: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
d630: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
d640: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
d650: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
d660: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
d670: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
d680: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
d690: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
d6a0: 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
d6b0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
d6c0: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52  _WINRT.    WCHAR
d6d0: 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54   zTempWide[SQLIT
d6e0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
d6f0: 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20  SG_CHARS+1];.   
d700: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
d710: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
d720: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
d730: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
d760: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
d770: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 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 20 30 2c 0a 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 20 7a 54 65 6d 70             zTemp
d800: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
d830: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
d840: 2c 0a 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 20 30                 0
d860: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
d870: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
d880: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
d890: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
d8a0: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
d8b0: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
d8c0: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
d8f0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_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 20 46 4f 52 4d 41             FORMA
d920: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
d930: 5f 49 4e 53 45 52 54 53 2c 0a 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 20 4e 55 4c 4c 2c 0a 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 20 6c 61 73 74 45 72            lastEr
d980: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 30 2c 0a 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 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
d9d0: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 30 2c 0a 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 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
da20: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
da30: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
da40: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
da50: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
da60: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
da70: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
da80: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
da90: 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ut = winUnicodeT
daa0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
dab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
dac0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
dad0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
dae0: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20  _WINRT.      /* 
daf0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
db00: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
db10: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
db20: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
db30: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
db40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
db50: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
db60: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
db70: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
db80: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
db90: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
dba0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
dbb0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
dbc0: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_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 20 46 4f 52 4d              FORM
dbf0: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
dc00: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
dc30: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
dc40: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 4e 55 4c 4c 2c 0a 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 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       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 20 30 2c 0a               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 20 28 4c 50               (LP
dcd0: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &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 20 30 2c 0a 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 20 30 29 3b 0a 20 20            0);.  
dd20: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
dd30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
dd40: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
dd50: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
dd60: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
dd70: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
dd80: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
dd90: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
dda0: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
ddb0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
ddc0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
ddd0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20  loc();.      /* 
dde0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
ddf0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
de00: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
de10: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
de20: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
de30: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
de40: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
de50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
de60: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
de70: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
de80: 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74  %lx (%lu)", last
de90: 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f  Errno, lastErrno
dea0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
deb0: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75  /* copy a maximu
dec0: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20  m of nBuf chars 
ded0: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  to output buffer
dee0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
def0: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
df00: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  Buf, "%s", zOut)
df10: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68  ;.    /* free th
df20: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f  e UTF8 buffer */
df30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
df40: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zOut);.  }.  r
df50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
df60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
df70: 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  on - winLogError
df80: 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e  AtLine() - is on
df90: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
dfa0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
dfb0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  winLogError()..*
dfc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dfd0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  e is invoked aft
dfe0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
dff0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
e000: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73  tion..** It logs
e010: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
e020: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
e030: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
e040: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
e050: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
e060: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
e070: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
e080: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
e090: 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73  m .** FormatMess
e0a0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
e0b0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
e0c0: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
e0d0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
e0e0: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
e0f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
e100: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
e110: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
e120: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
e130: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
e140: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
e150: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
e160: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
e170: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
e180: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
e190: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
e1a0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
e1b0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
e1c0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
e1d0: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
e1e0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e1f0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
e200: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
e210: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e220: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
e250: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
e260: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e280: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
e290: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
e2a0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
e2b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e2c0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
e2d0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
e2e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
e2f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e300: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
e310: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
e320: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
e350: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
e360: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
e370: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
e380: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
e390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
e3a0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
e3b0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
e3c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e3e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e3f0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
e400: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
e410: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
e420: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
e430: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
e440: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
e450: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
e460: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
e470: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
e480: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
e490: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
e4a0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
e4b0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
e4c0: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
e4d0: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
e4e0: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
e4f0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
e500: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
e510: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
e520: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
e530: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
e540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
e550: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
e560: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
e570: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
e580: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
e590: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
e5a0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
e5b0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
e5c0: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a  ably caused by .
e5d0: 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66  ** antivirus sof
e5e0: 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65  tware.  Also the
e5f0: 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62   initial delay b
e600: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
e610: 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65  retry..** The de
e620: 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69  lay increases li
e630: 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68  nearly with each
e640: 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64   retry..*/.#ifnd
e650: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
e660: 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65  IOERR_RETRY.# de
e670: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
e680: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30  2_IOERR_RETRY 10
e690: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
e6a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
e6b0: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23  RR_RETRY_DELAY.#
e6c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
e6d0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e6e0: 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66  _DELAY 25.#endif
e6f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
e700: 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49  oerrRetry = SQLI
e710: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e720: 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74  ETRY;.static int
e730: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
e740: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  lay = SQLITE_WIN
e750: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
e760: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ELAY;../*.** The
e770: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
e780: 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73  ry1" macro is us
e790: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
e7a0: 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  if a particular 
e7b0: 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  I/O.** error cod
e7c0: 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47  e obtained via G
e7d0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73  etLastError() is
e7e0: 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20   eligible to be 
e7f0: 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20  retried.  It.** 
e800: 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20  must accept the 
e810: 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44  error code DWORD
e820: 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67   as its only arg
e830: 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64  ument and should
e840: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
e850: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
e860: 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65   code is transie
e870: 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64  nt in nature and
e880: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a   the operation.*
e890: 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  * responsible fo
e8a0: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  r generating the
e8b0: 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20   original error 
e8c0: 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70  might succeed up
e8d0: 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72  on being.** retr
e8e0: 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65  ied.  The argume
e8f0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
e900: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72   should be a var
e910: 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  iable..**.** Add
e920: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63  itionally, a mac
e930: 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65  ro named "winIoe
e940: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79  rrCanRetry2" may
e950: 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66   be defined.  If
e960: 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65   it.** is define
e970: 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f  d, it will be co
e980: 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65  nsulted only whe
e990: 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e  n the macro "win
e9a0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a  IoerrCanRetry1".
e9b0: 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  ** returns zero.
e9c0: 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43    The "winIoerrC
e9d0: 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20  anRetry2" macro 
e9e0: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70  is completely op
e9f0: 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61  tional and.** ma
ea00: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63  y be used to inc
ea10: 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  lude additional 
ea20: 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74  error codes in t
ea30: 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75  he set that shou
ea40: 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ld.** result in 
ea50: 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20  the failing I/O 
ea60: 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20  operation being 
ea70: 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63  retried by the c
ea80: 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65  aller.  If.** de
ea90: 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49  fined, the "winI
eaa0: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d  oerrCanRetry2" m
eab0: 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69  acro must exhibi
eac0: 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e  t external seman
ead0: 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61  tics.** identica
eae0: 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68  l to those of th
eaf0: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
eb00: 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  try1" macro..*/.
eb10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e  #if !defined(win
eb20: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a  IoerrCanRetry1).
eb30: 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72  #define winIoerr
eb40: 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28  CanRetry1(a) (((
eb50: 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53  a)==ERROR_ACCESS
eb60: 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20  _DENIED)        
eb70: 7c 7c 20 5c 0a 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 20                  
eb90: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
eba0: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
ebb0: 29 20 20 20 20 7c 7c 20 5c 0a 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 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
ebe0: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
ebf0: 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  ON)       || \. 
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 20 20 20 20 28 28 61               ((a
ec20: 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54  )==ERROR_DEV_NOT
ec30: 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c  _EXIST)        |
ec40: 7c 20 5c 0a 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 20 20                  
ec60: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45    ((a)==ERROR_NE
ec70: 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20  TNAME_DELETED)  
ec80: 20 20 20 20 7c 7c 20 5c 0a 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 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
ecb0: 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20  OR_SEM_TIMEOUT) 
ecc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 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 20 20 20 20 28 28 61 29              ((a)
ecf0: 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f  ==ERROR_NETWORK_
ed00: 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65  UNREACHABLE)).#e
ed10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ndif../*.** If a
ed20: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
ed30: 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
ed40: 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
ed50: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ed60: 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
ed70: 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
ed80: 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
ed90: 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
eda0: 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
edb0: 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
edc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
edd0: 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e  winRetryIoerr(in
ede0: 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52  t *pnRetry, DWOR
edf0: 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57  D *pError){.  DW
ee00: 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73  ORD e = osGetLas
ee10: 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  tError();.  if( 
ee20: 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65  *pnRetry>=winIoe
ee30: 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69  rrRetry ){.    i
ee40: 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
ee50: 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
ee60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ee70: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69   0;.  }.  if( wi
ee80: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28  nIoerrCanRetry1(
ee90: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
eea0: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69  3_win32_sleep(wi
eeb0: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
eec0: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
eed0: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
eee0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
eef0: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69  }.#if defined(wi
ef00: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29  nIoerrCanRetry2)
ef10: 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49  .  else if( winI
ef20: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29  oerrCanRetry2(e)
ef30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ef40: 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49  win32_sleep(winI
ef50: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28  oerrRetryDelay*(
ef60: 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20  1+*pnRetry));.  
ef70: 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20    ++*pnRetry;.  
ef80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
ef90: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72  #endif.  if( pEr
efa0: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
efb0: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
efc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
efd0: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
efe0: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
eff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f000: 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  inLogIoerr(int n
f010: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
f020: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
f030: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
f040: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
f050: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
f060: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
f070: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
f080: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f090: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
f0a0: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
f0b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
f0c0: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
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 2a 2a 2a 2a 2a  ****************
f110: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
f120: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
f130: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
f140: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
f150: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
f160: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
f170: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
f180: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
f190: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
f1a0: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
f1b0: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
f1c0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
f1d0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
f1e0: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
f1f0: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
f200: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
f210: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
f220: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
f230: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
f240: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
f250: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
f260: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
f270: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
f280: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
f290: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
f2a0: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
f2b0: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
f2c0: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
f2d0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
f2e0: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
f2f0: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
f300: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
f310: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
f320: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
f330: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
f340: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
f350: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
f360: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
f370: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
f380: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
f390: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
f3a0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
f3b0: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
f3c0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
f3d0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
f3e0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
f3f0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
f400: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
f410: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
f420: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
f430: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
f440: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
f450: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
f460: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
f470: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
f480: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
f490: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
f4a0: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
f4b0: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
f4c0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
f4d0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
f4e0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
f4f0: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
f500: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
f510: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
f520: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
f530: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
f540: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
f550: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
f560: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
f570: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
f580: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
f590: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
f5a0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
f5b0: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
f5c0: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
f5d0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
f5e0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
f5f0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
f600: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
f610: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
f620: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
f630: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
f640: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
f650: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
f660: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
f670: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
f680: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
f690: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
f6a0: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
f6b0: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
f6c0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
f6d0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
f6e0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
f6f0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
f700: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
f710: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f720: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
f730: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
f740: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
f750: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
f760: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
f770: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
f780: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
f790: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
f7a0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
f7b0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
f7c0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
f7d0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
f7e0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
f7f0: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
f800: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
f810: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
f820: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
f830: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
f840: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
f850: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
f860: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
f870: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
f880: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
f890: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
f8a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
f8b0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
f8c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f8d0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
f8e0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
f8f0: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
f900: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
f910: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f920: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
f930: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
f960: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
f970: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
f980: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
f990: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
f9a0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
f9b0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
f9c0: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
f9d0: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
f9e0: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
f9f0: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
fa00: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
fa10: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
fa20: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
fa30: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
fa40: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
fa50: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
fa60: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
fa70: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
fa80: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
fa90: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
faa0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
fab0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
fac0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
fad0: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
fae0: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, 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: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
fb20: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
fb30: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
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 20 20                  
fb60: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
fb70: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
fb80: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
fb90: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
fba0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
fbb0: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
fbc0: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
fbd0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
fbe0: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
fbf0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
fc00: 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
fc10: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
fc20: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
fc30: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
fc40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
fc50: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
fc60: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
fc70: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
fc80: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
fc90: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
fca0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
fcb0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
fcc0: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
fcd0: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
fce0: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
fcf0: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
fd00: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
fd10: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
fd20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
fd30: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
fd40: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
fd50: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
fd60: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
fd70: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
fd80: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
fd90: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
fda0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fdb0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fdc0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
fdd0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
fde0: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
fdf0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
fe00: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
fe10: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
fe20: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
fe30: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
fe40: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
fe50: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
fe60: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
fe70: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
fe80: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
fe90: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
fea0: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
feb0: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
fec0: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
fed0: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
fee0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
fef0: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
ff00: 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
ff10: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ff20: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
ff30: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
ff40: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
ff50: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ff60: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ff70: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
ff80: 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
ff90: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
ffa0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
ffb0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
ffc0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
ffd0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
ffe0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
fff0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
10000 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
10010 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
10020 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
10030 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
10040 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
10050 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
10060 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
10070 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20  f( bInit ){.    
10080 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
10090 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
100a0 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
100b0 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
100c0 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
100d0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
100e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
100f0 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
10100 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
10110 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
10120 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
10130 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
10140 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
10150 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
10160 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
10170 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
10180 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
10190 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
101a0 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
101b0 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
101c0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
101d0 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
101e0 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
101f0 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
10200 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
10210 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
10220 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
10230 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
10240 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
10250 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
10260 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
10270 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
10280 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
10290 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
102a0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
102b0 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
102c0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
102d0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
102e0 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
102f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10300 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
10310 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
10320 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10330 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
10340 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10350 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
10360 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
10370 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
10380 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
10390 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
103a0 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
103b0 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70  e */.    osUnmap
103c0 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
103d0 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f  ->shared);.    o
103e0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
103f0 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
10400 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
10410 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
10420 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
10430 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
10440 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f  );    .    osClo
10450 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10460 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
10470 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
10480 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
10490 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
104a0 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
104b0 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
104c0 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
104d0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
104e0 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
104f0 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
10500 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10510 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
10520 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
10530 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10540 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
10550 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
10560 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
10570 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
10580 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
10590 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
105a0 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
105b0 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
105c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
105d0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
105e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
105f0 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10600 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
10610 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
10620 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
10630 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
10640 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
10650 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
10660 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
10670 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
10680 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
10690 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
106a0 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
106b0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
106c0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
106d0 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
106e0 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
106f0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10700 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
10710 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10720 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
10730 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10740 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
10750 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
10760 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
10770 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
10780 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
107a0 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
107b0 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
107c0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
107d0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
107e0 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
107f0 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
10800 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
10810 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
10820 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10830 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
10840 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
10850 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
10860 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
10870 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
10880 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
10890 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
108a0 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
108b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
108c0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
108d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
108e0 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
108f0 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10900 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10910 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
10920 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
10930 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10940 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10950 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
10960 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
10970 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
10980 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
10990 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
109a0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
109b0 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
109c0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
109d0 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
109e0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
109f0 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
10a00 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
10a10 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10a20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10a30 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
10a40 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10a50 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10a60 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
10a70 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
10a80 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
10a90 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
10aa0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
10ab0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10ac0 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
10ad0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10ae0 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
10af0 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10b00 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10b10 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10b20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
10b40 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10b50 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
10b60 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
10b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
10b80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10b90 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
10ba0 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10bb0 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10bc0 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
10bd0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10be0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10bf0 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10c00 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10c10 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
10c20 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10c30 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
10c40 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10c50 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
10c60 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10c70 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10c80 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10c90 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10ca0 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10cb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
10cc0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
10cd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10ce0 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
10cf0 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
10d00 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
10d10 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
10d20 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
10d30 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
10d40 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
10d50 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
10d60 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
10d70 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
10d80 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10d90 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
10da0 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
10db0 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
10dc0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10dd0 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
10de0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
10df0 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
10e00 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
10e10 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
10e20 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
10e30 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
10e40 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10e50 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
10e60 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10e70 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
10e80 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
10e90 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10ea0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
10eb0 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
10ec0 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
10ed0 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
10ee0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10ef0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10f00 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10f10 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
10f20 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10f40 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10f50 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
10f60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10f70 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
10f80 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
10f90 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10fa0 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
10fb0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
10fc0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
10fd0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
10fe0 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11000 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
11010 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
11020 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
11030 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
11040 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
11050 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11060 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11070 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11080 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
11090 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
110a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
110b0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
110c0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
110d0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
110e0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
110f0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11100 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
11110 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
11120 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
11130 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11140 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11150 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
11160 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11170 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11180 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11190 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
111a0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
111b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
111c0 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
111d0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
111e0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
111f0 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
11200 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11210 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11220 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11230 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11240 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
11250 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
11260 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11270 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
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 2a 2a 2a 2a 2a 2a 2a  ****************
112c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
112d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
112e0 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
112f0 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
11300 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
11310 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
11320 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11330 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
11340 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
11350 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
11360 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
11370 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
11380 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
11390 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
113a0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
113b0 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
113c0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
113d0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
113e0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
113f0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11400 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
11410 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11420 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
11430 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
11440 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11460 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
11470 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
11480 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
11490 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
114a0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
114b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
114c0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
114d0 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
114e0 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
114f0 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11500 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11510 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
11520 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
11530 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
11540 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
11550 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
11560 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
11570 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
11580 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
11590 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
115a0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
115b0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
115c0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
115d0 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
115e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
115f0 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
11600 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
11610 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
11620 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11630 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
11640 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11650 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
11660 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
11670 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
11680 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
11690 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
116a0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
116b0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
116c0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
116d0 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
116e0 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
116f0 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
11700 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
11710 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
11720 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
11730 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
11740 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11760 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
11770 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
11780 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
11790 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
117a0 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
117b0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
117c0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
117d0 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
117e0 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
117f0 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11800 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
11810 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
11820 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
11830 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
11840 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11850 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11860 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11870 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
11880 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
11890 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
118a0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
118d0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11930 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
11940 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
11950 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
11960 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
11970 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
11980 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
11990 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
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 2a 2a  ****************
119d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
119f0 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
11a00 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
11a10 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
11a20 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
11a30 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
11a40 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
11a50 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
11a60 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
11a70 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
11a80 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
11a90 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
11aa0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
11ab0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
11ac0 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
11ad0 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
11ae0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
11af0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
11b00 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
11b10 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
11b20 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
11b30 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
11b40 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
11b50 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
11b60 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
11b70 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
11b80 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
11b90 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
11ba0 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
11bb0 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
11bc0 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
11bd0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
11be0 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c00 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
11c10 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
11c20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
11c30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
11c40 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
11c50 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
11c60 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
11c70 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c90 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
11ca0 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
11cb0 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
11cc0 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
11cd0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
11ce0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
11cf0 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
11d00 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
11d10 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
11d20 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
11d30 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
11d40 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
11d50 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
11d60 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
11d70 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
11d80 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
11d90 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
11da0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
11db0 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
11dc0 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
11dd0 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
11de0 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
11df0 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
11e00 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
11e10 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
11e20 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
11e30 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
11e40 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
11e50 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
11e60 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
11e70 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11e80 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
11e90 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
11ea0 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  urred, it is als
11eb0 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
11ec0 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
11ed0 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
11ee0 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
11ef0 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
11f00 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
11f10 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
11f20 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
11f30 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
11f40 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
11f50 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
11f60 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11f70 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
11f80 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
11f90 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
11fa0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
11fb0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11fc0 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
11fd0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11ff0 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
12000 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
12010 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
12020 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12030 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
12040 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
12050 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
12060 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
12070 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
12080 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
12090 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
120a0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
120b0 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
120c0 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
120d0 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
120e0 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
120f0 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
12100 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
12110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12120 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
12130 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
12160 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
12170 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
12180 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
12190 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
121a0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
121b0 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
121c0 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
121d0 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
121e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
121f0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
12200 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
12210 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
12220 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
12230 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12240 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12250 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
12260 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
12270 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
12280 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12290 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
122a0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
122b0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
122c0 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
122d0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
122e0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
122f0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
12300 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
12310 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
12320 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
12330 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
12340 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
12350 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
12360 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
12370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12380 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
12390 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
123a0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
123b0 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
123c0 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
123d0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
123e0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
123f0 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
12400 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
12410 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
12420 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
12430 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
12440 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
12450 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
12460 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
12470 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
12480 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
12490 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
124a0 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
124b0 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
124c0 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
124d0 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
124e0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
124f0 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
12500 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
12510 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
12520 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
12530 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
12540 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
12550 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
12560 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
12570 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
12580 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
12590 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
125a0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
125b0 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
125c0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
125d0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
125e0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
125f0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
12600 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
12610 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
12620 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
12630 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
12640 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
12650 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
12660 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
12670 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
12680 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
12690 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
126a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
126b0 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
126c0 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
126d0 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
126e0 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
126f0 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
12700 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
12710 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
12720 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
12730 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
12740 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
12750 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
12760 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
12770 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
12780 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
12790 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
127a0 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
127b0 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
127c0 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
127d0 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
127e0 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
127f0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
12800 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
12810 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
12820 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
12830 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
12840 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
12850 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
12860 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
12870 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
12880 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20  ffffff .        
12890 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
128a0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
128b0 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
128c0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
128d0 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
128e0 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
128f0 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
12900 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
12910 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
12920 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
12930 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12940 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
12950 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
12960 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
12970 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
12980 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c  ("CLOSE file=%p,
12990 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
129a0 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a  ->h, rc ? "ok" :
129b0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
129c0 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
129d0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
129e0 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
129f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
12a00 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
12a10 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12a30 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65  winClose", pFile
12a40 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->zPath);.}../*.
12a50 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
12a60 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
12a70 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
12a80 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
12a90 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
12aa0 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
12ab0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
12ac0 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
12ad0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
12ae0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
12af0 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
12b00 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
12b10 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
12b20 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
12b30 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
12b40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
12b50 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
12b60 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
12b70 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
12b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12b90 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
12ba0 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
12bb0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
12bc0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
12bd0 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
12be0 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51  et */.){.#if !SQ
12bf0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12c00 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
12c10 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
12c20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
12c30 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
12c40 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
12c50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
12c60 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
12c70 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
12c80 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
12c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12ca0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
12cb0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
12cc0 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
12cd0 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12cf0 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
12d00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
12d10 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12d20 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
12d30 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
12d40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12d50 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
12d60 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
12d70 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
12d80 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
12d90 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66  p, amount=%d, of
12da0 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
12db0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12dc0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
12dd0 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
12de0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
12df0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
12e00 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
12e10 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
12e20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
12e30 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
12e40 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
12e50 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
12e60 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
12e70 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
12e80 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
12e90 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
12ea0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
12eb0 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
12ec0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
12ed0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
12ee0 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
12ef0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
12f00 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
12f10 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
12f20 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c  (("READ-MMAP fil
12f30 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12f40 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
12f50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12f70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12f80 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
12f90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
12fa0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
12fb0 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
12fc0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
12fd0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12fe0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
12ff0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
13000 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
13010 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
13020 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
13030 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
13040 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
13050 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13060 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
13070 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
13080 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
13090 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
130a0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
130b0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
130c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
130d0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
130e0 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
130f0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
13100 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
13110 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
13120 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
13130 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
13140 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
13150 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
13160 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
13170 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
13180 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
13190 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
131a0 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
131b0 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
131c0 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
131d0 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
131e0 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
131f0 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
13200 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
13210 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
13220 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
13230 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13240 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
13250 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
13260 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
13270 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
13280 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13290 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
132a0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
132b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
132c0 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20  _IOERR_READ\n", 
132d0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
132e0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
132f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
13300 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
13310 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13330 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
13340 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
13350 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
13360 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
13370 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
13380 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
13390 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
133a0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
133b0 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
133c0 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
133d0 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
133e0 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52  nRead);.    OSTR
133f0 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
13400 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
13410 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e  ERR_SHORT_READ\n
13420 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13440 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
13450 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  D;.  }..  OSTRAC
13460 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
13470 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
13480 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
134a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
134b0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
134c0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
134d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
134e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
134f0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
13500 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
13510 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
13520 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
13530 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
13540 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
13550 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
13560 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
13570 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
13580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13590 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
135a0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
135b0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
135c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
135d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
135e0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
135f0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
13600 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
13610 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
13620 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
13630 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
13640 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
13670 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
13680 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20  else false */.  
13690 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
136a0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
136b0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* File handle *
136c0 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
136d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
136e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
136f0 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61   retries */..  a
13700 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
13710 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13720 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
13730 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
13740 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
13750 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
13760 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
13770 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20  SQLITE_FULL);.. 
13780 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
13790 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
137a0 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
137b0 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
137c0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
137d0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
137e0 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
137f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13800 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
13810 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
13820 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
13830 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
13840 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
13850 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
13860 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
13870 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
13880 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
13890 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
138a0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
138b0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
138c0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
138d0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
138e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
138f0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
13900 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
13910 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
13920 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
13930 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50  ACE(("WRITE-MMAP
13940 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13950 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
13960 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
13970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13990 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
139a0 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
139b0 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
139c0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
139d0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
139e0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
139f0 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
13a00 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
13a10 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
13a20 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
13a30 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
13a40 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
13a50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
13a60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13a70 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b  E.  rc = winSeek
13a80 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
13a90 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
13aa0 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65   ){.#else.  {.#e
13ab0 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45  ndif.#if !SQLITE
13ac0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56  _OS_WINCE.    OV
13ad0 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
13ae0 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
13af0 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
13b00 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
13b10 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
13b20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
13b30 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
13b40 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
13b50 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
13b60 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
13b70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13b80 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
13b90 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
13ba0 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13bc0 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
13bd0 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
13be0 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
13bf0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
13c00 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
13c10 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
13c20 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
13c30 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
13c40 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65  _OS_WINCE.    me
13c50 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
13c60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
13c70 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
13c80 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
13c90 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
13ca0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
13cb0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
13cc0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
13cd0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13ce0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
13cf0 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28  ndif..    while(
13d00 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53   nRem>0 ){.#if S
13d10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13d20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
13d30 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
13d40 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
13d50 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ite, 0) ){.#else
13d60 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
13d70 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
13d80 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
13d90 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70  Write, &overlapp
13da0 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  ed) ){.#endif.  
13db0 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74        if( winRet
13dc0 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
13dd0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
13de0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57        assert( nW
13e10 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
13e20 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  e<=(DWORD)nRem )
13e30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
13e40 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e  te==0 || nWrite>
13e50 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20  (DWORD)nRem ){. 
13e60 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
13e70 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13e80 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
13e90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  ak;.      }.#if 
13ea0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
13eb0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
13ec0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
13ed0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13ee0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
13ef0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
13f00 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
13f10 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
13f20 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
13f30 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
13f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
13f50 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
13f60 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
13f70 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
13f80 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
13f90 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13fa0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
13fb0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
13fc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
13fd0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
13fe0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13ff0 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
14000 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
14010 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
14020 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
14030 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
14040 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
14050 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
14060 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
14070 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14080 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
14090 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
140a0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
140b0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
140d0 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
140e0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
140f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
14100 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
14110 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
14120 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  E\n", pFile->h))
14130 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
14140 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14150 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
14160 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32        "winWrite2
14190 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
141a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
141b0 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
141c0 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
141d0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
141e0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
141f0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
14200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14210 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
14220 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
14230 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
14240 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
14250 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
14260 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14270 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
14280 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
14290 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
142a0 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
142b0 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
142c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
142d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
142e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
142f0 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
14300 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
14310 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
14320 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14330 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14340 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14350 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
14360 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
14370 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
14380 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
14390 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
143a0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
143b0 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
143c0 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
143d0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
143e0 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
143f0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
14400 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
14410 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
14420 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
14430 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
14440 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
14450 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
14460 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
14470 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
14480 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
14490 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
144a0 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
144b0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
144c0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
144d0 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
144e0 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
144f0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
14500 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
14510 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
14520 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
14530 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
14540 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
14550 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
14560 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
14570 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
14580 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
14590 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
145a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
145b0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
145c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
145f0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
14600 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
14610 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
14620 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
14630 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
14640 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
14650 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
14660 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
14670 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
14680 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14690 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
146a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
146b0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
146c0 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
146d0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
146e0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
146f0 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
14700 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
14710 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
14720 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
14730 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
14740 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
14750 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
14760 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
14770 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
14780 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
14790 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
147a0 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
147b0 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
147c0 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
147d0 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
147e0 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
147f0 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
14800 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
14810 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
14820 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
14830 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14840 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14850 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
14860 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
14870 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
14880 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
14890 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
148a0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
148b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
148c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
148d0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
148e0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
148f0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
14900 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
14910 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
14920 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
14930 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
14940 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
14950 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
14960 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
14970 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
14980 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
14990 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
149a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
149b0 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
149c0 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
149d0 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
149e0 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
149f0 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
14a00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14a10 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
14a20 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
14a30 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
14a40 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
14a50 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
14a60 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
14a70 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
14a80 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
14a90 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
14aa0 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
14ab0 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
14ac0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
14ad0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14ae0 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
14af0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
14b00 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
14b10 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
14b20 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
14b30 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
14b40 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
14b50 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
14b60 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
14b70 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
14b80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14b90 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
14ba0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14bb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
14bc0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
14bd0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
14be0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
14bf0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
14c00 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
14c10 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
14c20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
14c30 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
14c40 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
14c50 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
14c60 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
14c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
14c80 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
14c90 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
14ca0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
14cb0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
14cc0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
14cd0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
14ce0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
14cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
14d00 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
14d10 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
14d20 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
14d30 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14d40 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
14d50 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
14d60 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
14d70 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
14d80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
14d90 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
14da0 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
14db0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
14dc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14dd0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
14de0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14df0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
14e00 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
14e10 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
14e20 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
14e30 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
14e40 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
14e50 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
14e60 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
14e70 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14e80 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
14e90 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
14ea0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
14eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
14ec0 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
14ed0 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
14ee0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
14ef0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
14f00 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
14f10 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
14f20 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
14f30 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
14f40 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f60 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
14f70 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14f80 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14f90 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
14fa0 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
14fb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14fc0 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
14fd0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
14fe0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
14ff0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
15000 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
15010 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15020 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15030 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
15040 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
15050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
15060 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
15070 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
15080 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
15090 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
150a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
150b0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
150c0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
150d0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
150e0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
150f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15100 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
15110 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15120 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
15130 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
15140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15150 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
15160 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
15170 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
15180 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
15190 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
151a0 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
151b0 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
151c0 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
151d0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
151e0 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
151f0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
15200 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15230 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
15240 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
15250 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
15260 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
15270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15280 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15290 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
152a0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
152b0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
152c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
152d0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
152e0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
152f0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15300 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
15310 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
15320 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
15330 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
15340 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
15350 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
15360 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
15370 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
15380 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
15390 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
153a0 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
153b0 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
153c0 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
153d0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
153e0 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
153f0 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
15400 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
15410 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
15420 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15430 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
15440 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
15450 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
15460 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
15470 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15480 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
15490 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
154a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
154b0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
154c0 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
154d0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
154e0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
154f0 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
15500 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
15510 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
15520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
15530 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
15540 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
15550 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
15560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15570 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
15580 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
15590 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
155a0 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
155b0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
155c0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
155d0 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
155e0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
155f0 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
15600 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
15610 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
15620 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
15630 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
15640 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
15650 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
15660 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
15670 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
15680 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
15690 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
156a0 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
156b0 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
156c0 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
156d0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
156e0 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
156f0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
15700 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
15710 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
15720 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
15730 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
15740 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
15750 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
15760 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
15770 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
15780 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
15790 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
157a0 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
157b0 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
157c0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
157d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
157e0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
157f0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
15800 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
15810 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
15820 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
15830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
15860 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
15870 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
15880 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
15890 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
158a0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
158b0 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
158c0 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
158d0 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
158e0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
158f0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
15900 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15910 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
15920 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
15930 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
15940 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
15950 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
15960 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
15970 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
15980 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
15990 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
159a0 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
159b0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
159c0 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
159d0 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
159e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
159f0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
15a00 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
15a10 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
15a20 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
15a30 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
15a40 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
15a50 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
15a60 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
15a70 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
15a80 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
15a90 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
15aa0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
15ab0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
15ac0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
15ad0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
15ae0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
15af0 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
15b00 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
15b10 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15b20 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
15b30 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
15b40 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
15b50 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15b60 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
15b70 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
15b80 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
15bb0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
15bc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
15bd0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
15be0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
15bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
15c00 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
15c10 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
15c20 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
15c30 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
15c40 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
15c50 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15c60 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
15c70 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15c80 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
15c90 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
15cc0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15cd0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15ce0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15cf0 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
15d00 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15d10 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
15d20 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
15d30 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
15d40 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
15d50 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15d60 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
15d70 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
15d80 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
15d90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
15da0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
15db0 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
15dc0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
15dd0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
15de0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
15df0 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
15e00 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
15e10 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
15e20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
15e30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
15e40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
15e50 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
15e60 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
15e70 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
15e80 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
15e90 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
15ea0 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
15eb0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
15ec0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
15ed0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
15ee0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
15ef0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
15f00 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
15f10 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
15f20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
15f30 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
15f40 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15f50 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
15f60 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
15f70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
15f80 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
15f90 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
15fa0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
15fb0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
15fc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
15fe0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
15ff0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
16000 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
16010 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
16020 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c  e=%p, result=%d\
16030 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
16040 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  s));.  return re
16050 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
16060 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16070 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16080 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
16090 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
160a0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
160b0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
160c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
160d0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
160e0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
160f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
16100 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
16110 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
16120 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
16130 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
16140 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
16150 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
16160 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
16170 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
16180 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
16190 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
161a0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
161b0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
161c0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
161d0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
161e0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
161f0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
16200 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
16210 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
16220 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
16230 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
16240 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
16250 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
16260 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
16270 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
16280 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
16290 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
162a0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
162b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
162c0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
162d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
162e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
162f0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
16300 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
16310 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16320 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
16330 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
16340 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
16350 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
16360 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
16370 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
16380 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
16390 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
163a0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
163b0 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
163c0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
163d0 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
163e0 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
163f0 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
16400 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
16410 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
16420 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16430 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
16440 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16450 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
16460 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
16470 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
16480 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
16490 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
164a0 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
164b0 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
164c0 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
164d0 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
164e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
164f0 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
16500 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
16510 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
16520 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
16530 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
16540 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
16550 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
16560 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
16570 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
16580 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
16590 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
165a0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
165b0 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
165c0 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
165d0 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
165e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
165f0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
16600 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
16610 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
16620 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20   locktype));..  
16630 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
16640 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
16650 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
16660 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
16670 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
16680 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
16690 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
166a0 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
166b0 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
166c0 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
166d0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
166e0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
166f0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
16700 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
16710 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16720 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c  CK-HELD file=%p,
16730 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
16740 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
16750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16760 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
16770 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
16780 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
16790 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
167a0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
167b0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
167c0 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
167d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
167e0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
167f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
16800 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
16810 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
16820 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
16830 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
16840 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
16850 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
16860 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
16870 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
16880 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
16890 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
168a0 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
168b0 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
168c0 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
168d0 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
168e0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
168f0 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
16900 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
16910 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
16920 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20  cktype;.  if(   
16930 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
16940 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ==NO_LOCK).     
16950 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65  || (   (locktype
16960 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
16970 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
16980 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16990 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a  RESERVED_LOCK)).
169a0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
169b0 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
169c0 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
169d0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
169e0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
169f0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
16a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
16a30 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
16a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
16a50 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
16a60 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
16a70 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
16a80 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
16a90 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
16aa0 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
16ab0 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
16ac0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
16ad0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
16ae0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
16af0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
16b00 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
16b10 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
16b20 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
16b30 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
16b40 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
16b50 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
16b60 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
16b70 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
16b80 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
16b90 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
16ba0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16bb0 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
16bc0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
16bd0 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
16be0 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74  count=%d, result
16bf0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
16c00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16c10 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20   cnt, res));.   
16c20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
16c30 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f  ==ERROR_INVALID_
16c40 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20  HANDLE ){.      
16c50 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
16c60 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
16c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16c80 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
16c90 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
16ca0 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
16cb0 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
16cc0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
16cd0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16ce0 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33  >h, cnt, sqlite3
16cf0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
16d00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16d20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
16d30 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
16d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
16d50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
16d60 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
16d70 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
16d80 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
16d90 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
16da0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
16db0 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
16dc0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
16dd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
16de0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
16df0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
16e00 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
16e10 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52     res = winGetR
16e20 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
16e30 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
16e40 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
16e50 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e70 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
16e80 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
16ea0 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
16eb0 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
16ec0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
16ed0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
16ee0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16ef0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
16f00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16f10 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
16f20 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16f30 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16f40 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
16f50 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
16f60 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
16f70 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
16f80 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
16f90 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
16fa0 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
16fb0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16fc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16fd0 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
16fe0 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
16ff0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
17000 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
17010 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
17020 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
17030 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
17040 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
17050 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
17060 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17070 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
17080 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
17090 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
170a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
170b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
170c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
170d0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
170e0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
170f0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
17100 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17110 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
17120 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  E_FLAGS, SHARED_
17130 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17150 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17160 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
17170 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
17180 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
17190 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
171a0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
171b0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
171c0 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52  );.      winGetR
171d0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
171e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
171f0 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
17200 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
17210 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
17220 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
17230 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
17240 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
17250 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
17260 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
17270 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17280 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17290 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
172a0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
172b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
172c0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
172d0 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
172e0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
172f0 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
17300 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
17310 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
17320 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
17330 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
17340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17350 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
17360 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
17370 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
17380 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
17390 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
173a0 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61  FAIL file=%p, wa
173b0 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c  nted=%d, got=%d\
173c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
173d0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
173e0 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
173f0 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  ));.  }.  pFile-
17400 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
17410 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f  newLocktype;.  O
17420 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
17430 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
17440 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
17450 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
17460 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
17470 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
17480 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
17490 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
174a0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
174b0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
174c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
174d0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
174e0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
174f0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
17500 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
17510 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17520 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
17530 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
17540 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
17550 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
17560 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
17570 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
17580 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65  esOut){.  int re
17590 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  s;.  winFile *pF
175a0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
175b0 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
175c0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
175d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
175e0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
175f0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
17600 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
17610 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %p, pResOut=%p\n
17620 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65  ", pFile->h, pRe
17630 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72  sOut));..  asser
17640 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
17650 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17660 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
17670 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b   ){.    res = 1;
17680 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
17690 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
176a0 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28  =%p, result=%d (
176b0 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
176c0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65  ->h, res));.  }e
176d0 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  lse{.    res = w
176e0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
176f0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
17700 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
17710 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17720 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
17730 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  es ){.      winU
17740 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
17750 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
17760 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
17770 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72    }.    res = !r
17780 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  es;.    OSTRACE(
17790 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
177a0 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
177b0 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
177c0 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
177d0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
177e0 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
177f0 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
17800 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
17810 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
17820 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17840 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20  le->h, pResOut, 
17850 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
17860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17870 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17880 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17890 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
178a0 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
178b0 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
178c0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
178d0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
178e0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
178f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17900 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
17910 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
17920 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
17930 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
17940 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
17950 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17960 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
17970 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
17980 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
17990 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
179a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
179b0 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
179c0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
179d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
179e0 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
179f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
17a00 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
17a10 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
17a20 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
17a30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17a40 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
17a50 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
17a60 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
17a70 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
17a80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17a90 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
17aa0 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
17ab0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
17ac0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17ad0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
17ae0 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
17af0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
17b00 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
17b10 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
17b20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
17b30 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
17b40 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
17b50 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
17b60 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
17b70 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
17b80 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  E_LOCK ){.    wi
17b90 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17ba0 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
17bb0 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
17bc0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
17bd0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
17be0 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65  D_LOCK && !winGe
17bf0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
17c00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
17c10 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
17c20 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
17c30 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
17c40 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
17c50 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
17c60 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
17c70 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
17c80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
17c90 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
17ca0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
17cc0 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  nUnlock", pFile-
17cd0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
17ce0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
17cf0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
17d00 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
17d10 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
17d20 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
17d30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
17d40 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
17d50 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
17d60 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
17d70 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
17d80 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
17d90 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
17da0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
17db0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
17dc0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
17dd0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
17de0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
17df0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
17e00 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  e;.  OSTRACE(("U
17e10 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
17e20 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
17e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17e40 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
17e50 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
17e60 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
17e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17e80 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
17e90 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61  inititially nega
17ea0 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
17eb0 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
17ec0 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
17ed0 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
17ee0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
17ef0 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
17f00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
17f10 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
17f20 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
17f30 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
17f40 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
17f50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17f70 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46   winModeBit(winF
17f80 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
17f90 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
17fa0 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
17fb0 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
17fc0 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
17fd0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
17fe0 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
17ff0 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
18000 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
18010 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
18020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
18030 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
18040 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
18050 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
18060 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65  ces to VFS helpe
18070 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66  r methods used f
18080 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
18090 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
180a0 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
180b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63  sqlite3_vfs *, c
180c0 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20  har **);.static 
180d0 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
180e0 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74  st void *);.stat
180f0 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69  ic BOOL winIsDri
18100 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
18110 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
18120 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61  ./*.** Control a
18130 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  nd query of the 
18140 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
18150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18160 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  winFileControl(s
18170 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18180 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
18190 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  Arg){.  winFile 
181a0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
181b0 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45  e*)id;.  OSTRACE
181c0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
181d0 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70  , op=%d, pArg=%p
181e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f  \n", pFile->h, o
181f0 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69  p, pArg));.  swi
18200 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
18210 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18220 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
18230 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
18240 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
18250 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  e;.      OSTRACE
18260 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18270 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18280 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
18290 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
182a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
182b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
182c0 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
182d0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
182e0 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45  int)pFile->lastE
182f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52  rrno;.      OSTR
18300 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
18310 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18320 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18330 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18340 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18350 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18360 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
18370 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
18380 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
18390 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f   *)pArg;.      O
183a0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
183b0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
183c0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
183d0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
183e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
183f0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18400 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
18410 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NT: {.      if( 
18420 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
18430 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18440 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b  te3_int64 oldSz;
18450 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
18460 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64  = winFileSize(id
18470 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20  , &oldSz);.     
18480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
184a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
184b0 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65  newSz = *(sqlite
184c0 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20  3_int64*)pArg;. 
184d0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77           if( new
184e0 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20  Sz>oldSz ){.    
184f0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
18500 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
18510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
18520 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69   = winTruncate(i
18530 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20  d, newSz);.     
18540 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
18550 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
18560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f       }.        O
18580 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18590 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
185a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
185b0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
185c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
185d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
185e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
185f0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
18600 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
18610 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
18620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18630 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18640 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
18650 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
18660 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
18670 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  le, WINFILE_PERS
18680 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70  IST_WAL, (int*)p
18690 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
186a0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
186b0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
186c0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
186d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
186e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
186f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18700 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
18710 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
18720 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
18730 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f  ile, WINFILE_PSO
18740 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
18750 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18760 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18770 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
18780 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
18790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
187a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
187b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
187c0 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
187d0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
187e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
187f0 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56  ("%s", pFile->pV
18800 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs->zName);.    
18810 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18820 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
18830 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18840 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
18850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18860 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
18870 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
18880 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20  2_AV_RETRY: {.  
18890 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e      int *a = (in
188a0 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  t*)pArg;.      i
188b0 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20  f( a[0]>0 ){.   
188c0 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
188d0 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  ry = a[0];.     
188e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
188f0 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52  a[0] = winIoerrR
18900 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  etry;.      }.  
18910 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29      if( a[1]>0 )
18920 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65  {.        winIoe
18930 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61  rrRetryDelay = a
18940 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [1];.      }else
18950 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d  {.        a[1] =
18960 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
18970 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lay;.      }.   
18980 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
18990 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
189a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
189b0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
189c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
189d0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
189e0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61  LITE_TEST.    ca
189f0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
18a00 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45  WIN32_SET_HANDLE
18a10 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44  : {.      LPHAND
18a20 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48  LE phFile = (LPH
18a30 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20  ANDLE)pArg;.    
18a40 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c    HANDLE hOldFil
18a50 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  e = pFile->h;.  
18a60 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a      pFile->h = *
18a70 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70  phFile;.      *p
18a80 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65  hFile = hOldFile
18a90 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18aa0 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d  ("FCNTL oldFile=
18ab0 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20  %p, newFile=%p, 
18ac0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ae0 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d  hOldFile, pFile-
18af0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
18b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18b10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
18b20 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18b30 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
18b40 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
18b50 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ile = 0;.      i
18b60 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65  nt rc = winGetTe
18b70 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
18b80 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20  fs, &zTFile);.  
18b90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18bb0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
18bc0 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
18bd0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18be0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18bf0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
18c00 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
18c10 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
18c20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18c30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18c40 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
18c50 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18c60 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
18c70 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
18c80 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
18c90 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
18ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
18cb0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
18cc0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18cd0 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
18ce0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
18cf0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18d00 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
18d10 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29   }.      *(i64*)
18d20 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
18d30 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
18d40 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
18d50 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
18d60 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
18d70 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
18d80 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
18d90 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
18da0 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
18db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
18dc0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  ile->mmapSize>0 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  ){.          win
18de0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
18df0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
18e00 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c   winMapfile(pFil
18e10 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
18e20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18e30 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
18e40 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
18e50 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
18e60 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18e70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18e80 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  rc;.    }.#endif
18e90 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
18ea0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18eb0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rc=SQLITE_NOTFOU
18ec0 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  ND\n", pFile->h)
18ed0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18ee0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
18ef0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18f00 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
18f10 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
18f20 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
18f30 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
18f40 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
18f50 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
18f60 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
18f70 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
18f80 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
18f90 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
18fa0 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
18fb0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
18fc0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
18fd0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
18fe0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
18ff0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
19000 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
19010 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
19020 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
19030 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
19040 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
19050 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
19060 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
19070 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
19080 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
19090 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
190a0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76  _file *id){.  (v
190b0 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  oid)id;.  return
190c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
190d0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
190e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76  /*.** Return a v
190f0 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20  ector of device 
19100 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e  characteristics.
19110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19120 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
19130 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
19140 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e  file *id){.  win
19150 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69  File *p = (winFi
19160 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  le*)id;.  return
19170 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
19180 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
19190 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28  PEN |.         (
191a0 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  (p->ctrlFlags & 
191b0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51  WINFILE_PSOW)?SQ
191c0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
191d0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30  SAFE_OVERWRITE:0
191e0 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e  );.}../* .** Win
191f0 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c  dows will only l
19200 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69  et you create fi
19210 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73  le view mappings
19220 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f  .** on allocatio
19230 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69  n size granulari
19240 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a  ty boundaries..*
19250 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33  * During sqlite3
19260 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f  _os_init() we do
19270 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   a GetSystemInfo
19280 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  ().** to get the
19290 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a   granularity siz
192a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53  e..*/.static SYS
192b0 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
192c0 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
192d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
192e0 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
192f0 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
19300 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
19310 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
19320 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
19330 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
19340 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
19350 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
19360 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73  used by .** this
19370 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
19380 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
19390 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
193a0 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
193b0 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
193c0 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
193d0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
193e0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
193f0 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
19400 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
19410 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
19420 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
19430 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
19440 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
19450 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
19460 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
19470 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
19480 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
19490 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
194a0 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
194b0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
194c0 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
194d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
194e0 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
194f0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
19500 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
19510 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
19520 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
19530 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
19540 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19550 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
19560 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
19570 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
19580 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
19590 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  G.static int win
195a0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  ShmMutexHeld(voi
195b0 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
195c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
195d0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
195e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
195f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
19600 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19610 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
19620 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
19630 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
19640 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
19650 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
19660 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
19670 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
19680 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
19690 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
196a0 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
196b0 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69  d has its own wi
196c0 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75  nFile object, bu
196d0 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f  t they all.** po
196e0 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
196f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
19700 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
19710 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a  er words, each.*
19720 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73  * log-summary is
19730 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63   opened only onc
19740 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
19750 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  *.** winShmMutex
19760 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
19770 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
19780 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
19790 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
197a0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
197b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
197c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
197d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
197e0 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a  .**      pNext .
197f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
19800 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
19810 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
19820 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
19830 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
19840 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
19850 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
19860 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  ther winShmNode.
19870 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
19880 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ld or winShmNode
19890 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
198a0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
198b0 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
198c0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
198d0 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
198e0 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
198f0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  ucture..**.*/.st
19900 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
19910 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
19920 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
19930 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
19940 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
19950 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
19960 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
19970 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
19980 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68  e */.  winFile h
19990 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
199a0 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
199b0 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f   from winOpen */
199c0 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  ..  int szRegion
199d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
199e0 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
199f0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
19a00 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e  */.  int nRegion
19a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
19a30 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73   apRegion */.  s
19a40 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
19a50 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61  {.    HANDLE hMa
19a60 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
19a70 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
19a80 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  om CreateFileMap
19a90 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64  ping */.    void
19aa0 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65   *pMap;.  } *aRe
19ab0 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61  gion;.  DWORD la
19ac0 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
19ad0 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77     /* The Window
19ae0 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  s errno from the
19af0 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
19b00 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20  */..  int nRef; 
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69   /* Number of wi
19b30 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
19b40 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
19b50 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73  .  winShm *pFirs
19b60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
19b70 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65   All winShm obje
19b80 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19b90 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
19ba0 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  Node *pNext;    
19bb0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
19bc0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53  list of all winS
19bd0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a  hmNode objects *
19be0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19bf0 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53  DEBUG.  u8 nextS
19c00 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
19c10 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
19c20 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76  able winShm.id v
19c30 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
19c40 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
19c50 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77  l array of all w
19c60 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19c70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  s..**.** The win
19c80 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
19c90 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
19ca0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
19cb0 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
19cc0 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d  */.static winShm
19cd0 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65  Node *winShmNode
19ce0 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
19cf0 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
19d00 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
19d10 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
19d20 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
19d30 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
19d40 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
19d50 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
19d60 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
19d70 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
19d80 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
19d90 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
19da0 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
19db0 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
19dc0 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e      winShm.pShmN
19dd0 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  ode.**    winShm
19de0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
19df0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
19e00 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
19e10 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d  winShm.pShmNode-
19e20 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
19e30 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
19e40 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
19e50 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
19e60 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b  .struct winShm {
19e70 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
19e80 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a  ShmNode;      /*
19e90 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
19ea0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
19eb0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  t */.  winShm *p
19ec0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
19ed0 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d    /* Next winShm
19ee0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77   with the same w
19ef0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  inShmNode */.  u
19f00 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
19f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19f20 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
19f30 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65   winShmNode mute
19f40 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
19f50 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
19f60 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
19f70 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
19f80 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
19f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19fa0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
19fb0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
19fc0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19fd0 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1a000 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1a010 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20   its winShmNode 
1a020 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1a030 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
1a040 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
1a050 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1a060 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
1a070 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
1a080 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  4)        /* fir
1a090 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
1a0a0 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
1a0b0 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f  DMS    (WIN_SHM_
1a0c0 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
1a0d0 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
1a0e0 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
1a0f0 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f  .** Apply adviso
1a100 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1a110 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69   n bytes beginni
1a120 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23  ng at ofst..*/.#
1a130 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43  define _SHM_UNLC
1a140 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  1.#define _SH
1a150 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69  M_RDLCK  2.#defi
1a160 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33  ne _SHM_WRLCK  3
1a170 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1a180 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
1a190 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
1a1a0 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  e,    /* Apply l
1a1b0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1a1c0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1a1d0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1a1e0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1a1f0 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b     /* _SHM_UNLCK
1a200 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72  , _SHM_RDLCK, or
1a210 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20   _SHM_WRLCK */. 
1a220 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1a230 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1a240 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
1a250 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f  o be locked/unlo
1a260 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  cked */.  int nB
1a270 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
1a280 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a290 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
1a2a0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lock */.){.  int
1a2b0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1a2c0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a2d0 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
1a2e0 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
1a2f0 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1a300 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
1a310 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
1a320 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a330 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1a340 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a350 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  pFile->mutex) ||
1a360 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
1a370 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
1a380 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1a390 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65  , lock=%d, offse
1a3a0 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22  t=%d, size=%d\n"
1a3b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1a3c0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63  le->hFile.h, loc
1a3d0 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79  kType, ofst, nBy
1a3e0 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  te));..  /* Rele
1a3f0 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
1a400 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1a410 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
1a420 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
1a430 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
1a440 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1a450 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
1a460 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1a470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1a480 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
1a490 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
1a4a0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
1a4b0 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
1a4c0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
1a4d0 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
1a4e0 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
1a4f0 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
1a500 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
1a510 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  E_LOCK;.    rc =
1a520 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
1a530 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
1a540 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20  Flags, ofst, 0, 
1a550 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  nByte, 0);.  }. 
1a560 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29   .  if( rc!= 0 )
1a570 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a580 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1a590 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a5a0 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
1a5b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
1a5c0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1a5d0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1a5e0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1a5f0 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f  , func=%s, errno
1a600 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  =%lu, rc=%s\n",.
1a610 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a620 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b  ->hFile.h, (lock
1a630 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c  Type == _SHM_UNL
1a640 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b  CK) ? "winUnlock
1a650 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20  File" :.        
1a660 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22     "winLockFile"
1a670 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1a680 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  no, sqlite3ErrNa
1a690 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74  me(rc)));..  ret
1a6a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1a6b0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1a6c0 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
1a6d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a6e0 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
1a6f0 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
1a700 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1a710 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
1a720 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
1a730 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
1a740 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
1a750 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
1a760 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
1a770 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
1a780 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
1a790 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
1a7a0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
1a7b0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1a7c0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
1a7d0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
1a7e0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
1a7f0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1a800 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
1a810 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
1a820 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
1a830 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
1a840 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
1a850 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
1a860 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73  ShmNode *p;.  as
1a870 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
1a880 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54  xHeld() );.  OST
1a890 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1a8a0 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65   pid=%lu, delete
1a8b0 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Flag=%d\n",.    
1a8c0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1a8d0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1a8e0 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20  deleteFlag));.  
1a8f0 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
1a900 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
1a910 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
1a920 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
1a930 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1a940 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
1a950 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f  utex ){ sqlite3_
1a960 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1a970 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f  tex); }.      fo
1a980 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
1a990 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
1a9a0 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73     BOOL bRc = os
1a9b0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1a9c0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
1a9d0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
1a9e0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1a9f0 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  -UNMAP pid=%lu, 
1aa00 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
1aa10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1aa20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1aa30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
1aa40 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
1aa50 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1aa60 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
1aa70 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
1aa80 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
1aa90 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
1aaa0 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
1aab0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1aac0 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53  ("SHM-PURGE-CLOS
1aad0 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1aae0 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1ab10 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1ab20 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1ab30 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1ab40 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1ab50 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1ab60 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
1ab70 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
1ab80 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
1ab90 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1aba0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1abb0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1abc0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
1abd0 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
1abe0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
1abf0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
1ac00 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ac10 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
1ac20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
1ac30 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
1ac40 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ac50 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
1ac60 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
1ac70 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
1ac80 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
1ac90 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
1aca0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1acb0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1acc0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
1acd0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1ace0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
1acf0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
1ad00 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
1ad10 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
1ad20 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
1ad30 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1ad40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1ad50 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
1ad60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ad70 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
1ad80 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
1ad90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1ada0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1adb0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
1adc0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1add0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1ade0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1adf0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1ae00 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1ae10 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1ae20 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1ae30 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1ae40 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1ae50 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1ae60 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1ae70 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1ae80 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1ae90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1aea0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1aeb0 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
1aec0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
1aed0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1aee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1aef0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1af00 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1af10 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
1af20 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
1af30 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1af40 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1af50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1af80 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
1af90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
1afa0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1afb0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
1afc0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
1afd0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
1b000 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
1b010 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1b020 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
1b030 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
1b040 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
1b050 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1b060 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
1b070 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
1b080 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
1b090 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
1b0a0 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
1b0b0 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
1b0c0 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
1b0d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
1b0e0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
1b0f0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
1b100 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b110 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1b120 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1b130 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1b140 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1b150 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1b160 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1b170 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1b180 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1b190 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1b1a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1b1b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b1c0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1b1d0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b1e0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
1b1f0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
1b200 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
1b210 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b220 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
1b230 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
1b240 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
1b250 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
1b260 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
1b270 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
1b280 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
1b290 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
1b2a0 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
1b2b0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
1b2c0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
1b2d0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
1b2e0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
1b2f0 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
1b300 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1b310 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
1b320 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
1b330 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
1b340 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
1b350 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
1b360 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
1b370 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
1b380 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
1b390 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
1b3a0 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
1b3b0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
1b3c0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1b3d0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1b3e0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
1b3f0 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
1b400 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
1b410 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
1b420 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
1b430 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1b440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b450 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
1b460 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
1b470 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
1b480 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
1b490 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1b4a0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
1b4b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
1b4c0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1b4d0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
1b4e0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
1b4f0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1b500 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1b510 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1b520 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1b530 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1b540 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1b550 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b560 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1b570 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1b580 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1b590 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
1b5a0 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
1b5c0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b5f0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1b610 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1b620 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
1b630 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
1b640 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
1b650 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b660 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
1b670 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1b680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1b690 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
1b6a0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
1b6b0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b6c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
1b6d0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b6e0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
1b6f0 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
1b700 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1b710 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
1b720 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
1b730 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1b740 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1b750 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
1b760 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
1b770 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1b780 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1b790 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1b7a0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1b7b0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1b7c0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1b7d0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1b7e0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
1b7f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b810 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1b820 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1b830 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
1b840 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
1b870 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1b880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b8a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
1b8b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1b8c0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1b8d0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1b8e0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1b8f0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1b900 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
1b910 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1b920 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1b930 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1b940 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1b950 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1b960 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1b970 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1b980 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1b990 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1b9a0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
1b9b0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
1b9c0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
1b9d0 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
1b9e0 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
1b9f0 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
1ba00 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
1ba10 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1ba20 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1ba30 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1ba40 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1ba50 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1ba60 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1ba70 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
1ba80 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1ba90 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
1baa0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
1bab0 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
1bac0 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
1bad0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1bae0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1baf0 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1bb00 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1bb10 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1bb20 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1bb30 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1bb40 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1bb50 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1bb60 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1bb70 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1bb80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1bb90 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1bba0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1bbb0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1bbc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1bbd0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1bbe0 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1bbf0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1bc00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bc10 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1bc20 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1bc30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1bc40 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1bc50 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1bc60 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
1bc70 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1bc80 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1bc90 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1bca0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
1bcb0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1bcc0 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
1bcd0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1bce0 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1bcf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1bd00 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
1bd10 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
1bd20 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1bd30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bd40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1bd50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1bd60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1bd70 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1bd80 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
1bd90 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
1bda0 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
1bdb0 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
1bdc0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1bdd0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1bde0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1bdf0 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1be00 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
1be10 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
1be20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
1be30 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
1be40 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
1be50 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1be60 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1be70 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1be80 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
1be90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1bea0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1beb0 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
1bec0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1bed0 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
1bee0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
1bef0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
1bf00 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
1bf10 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1bf20 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
1bf30 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
1bf40 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
1bf50 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
1bf60 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1bf70 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1bf80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1bf90 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1bfa0 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
1bfb0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
1bfc0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
1bfd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
1bfe0 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
1bff0 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
1c000 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c010 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1c020 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
1c030 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1c040 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
1c050 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
1c060 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
1c070 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
1c080 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
1c090 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1c0a0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
1c0b0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
1c0c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1c0d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1c0e0 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
1c0f0 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
1c100 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
1c110 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
1c120 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
1c130 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
1c140 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1c150 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1c160 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1c170 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
1c180 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
1c190 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1c1a0 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
1c1b0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1c1c0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
1c1d0 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
1c1e0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1c1f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c200 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1c210 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
1c220 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1c230 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
1c240 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
1c250 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
1c260 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1c270 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1c280 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1c290 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1c2a0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c2c0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
1c2d0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1c2e0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
1c310 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
1c320 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1c330 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
1c340 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
1c350 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
1c360 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
1c370 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1c380 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
1c390 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1c3a0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
1c3b0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
1c3c0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1c3d0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1c3e0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
1c3f0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
1c400 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
1c410 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c430 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1c440 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
1c450 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1c460 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1c470 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1c480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1c4b0 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c4e0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
1c4f0 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
1c500 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
1c510 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
1c520 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1c530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
1c540 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1c550 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1c560 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1c570 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1c580 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1c590 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1c5a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1c5b0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
1c5c0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1c5d0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1c5e0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1c5f0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1c600 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1c610 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1c620 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
1c630 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1c640 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1c650 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
1c660 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
1c670 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
1c680 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
1c690 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
1c6a0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
1c6b0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
1c6c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1c6d0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c6e0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1c6f0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1c700 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
1c710 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
1c720 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1c730 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
1c740 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
1c750 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
1c760 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
1c770 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1c780 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1c790 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1c7a0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
1c7b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c7c0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
1c7d0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
1c7e0 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
1c7f0 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
1c800 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
1c810 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1c820 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
1c830 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
1c840 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
1c850 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
1c860 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1c870 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1c880 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1c890 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
1c8a0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1c8b0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1c8c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c8d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
1c8e0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
1c8f0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
1c900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c910 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
1c920 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1c930 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1c940 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1c950 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
1c960 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1c970 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1c980 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1c990 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1c9a0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1c9b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1c9c0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1c9d0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1c9e0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1c9f0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1ca00 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1ca10 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1ca20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1ca30 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1ca40 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1ca50 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1ca60 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1ca70 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1ca80 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1ca90 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1caa0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1cab0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1cac0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1cad0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1cae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1caf0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1cb00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1cb10 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1cb20 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1cb30 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1cb40 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1cb50 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1cb60 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1cb70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cb80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1cb90 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1cba0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1cbb0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1cbc0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1cbd0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1cbe0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1cbf0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1cc00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1cc10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cc20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1cc30 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1cc40 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1cc50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cc60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1cc70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1cc80 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1cc90 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1cca0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1ccb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1ccc0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1ccd0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1cce0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1ccf0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1cd00 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1cd10 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1cd20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1cd30 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1cd40 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1cd50 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1cd60 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1cd70 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1cd80 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1cd90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cda0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1cdb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1cdc0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1cdd0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1cde0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1cdf0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1ce00 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1ce10 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1ce20 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1ce30 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1ce40 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1ce50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ce60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ce70 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1ce80 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1ce90 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1cea0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1ceb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1cec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ced0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1cee0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1cef0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1cf00 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1cf10 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1cf20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1cf30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1cf40 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1cf50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1cf60 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1cf70 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1cf80 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1cf90 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1cfa0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1cfb0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1cfc0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1cfd0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1cfe0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1cff0 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1d000 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1d010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1d020 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1d030 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1d040 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1d050 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1d060 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1d070 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1d080 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1d090 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1d0a0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1d0b0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1d0c0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1d0d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1d0e0 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
1d0f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1d100 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
1d110 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1d120 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1d130 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
1d140 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1d150 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
1d160 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
1d170 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
1d180 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
1d190 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1d1a0 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
1d1b0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
1d1c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d1d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1d1e0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
1d1f0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
1d200 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
1d210 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1d220 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1d230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d240 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1d250 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
1d260 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
1d270 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
1d280 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
1d290 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
1d2a0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
1d2b0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1d2c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d2d0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1d2e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d2f0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1d300 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1d310 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
1d320 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
1d330 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1d340 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1d350 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1d360 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1d370 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1d380 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1d390 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1d3a0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1d3b0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1d3c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1d3d0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1d3e0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
1d3f0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1d400 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1d410 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1d420 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1d430 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
1d440 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
1d450 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
1d460 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1d470 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1d480 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1d490 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
1d4a0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
1d4b0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
1d4c0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
1d4d0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
1d4e0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
1d4f0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1d500 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
1d510 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
1d520 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
1d530 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1d540 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
1d550 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
1d560 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1d570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1d580 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
1d590 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1d5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1d5b0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
1d5c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1d5d0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
1d600 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
1d610 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
1d620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d630 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
1d640 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
1d670 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
1d680 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
1d690 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d6b0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
1d6c0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
1d6d0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1d6e0 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
1d6f0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1d700 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1d710 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1d720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d730 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
1d740 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
1d750 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
1d760 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1d770 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1d780 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
1d790 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
1d7a0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1d7b0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
1d7c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d7d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1d7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
1d7f0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
1d800 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
1d810 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
1d820 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
1d830 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1d840 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
1d850 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1d860 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1d870 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
1d880 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
1d890 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
1d8a0 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
1d8b0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
1d8c0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1d8d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1d8e0 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
1d8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1d900 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
1d910 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
1d920 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1d930 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1d940 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
1d950 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
1d960 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
1d970 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1d980 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1d990 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
1d9a0 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
1d9b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
1d9c0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
1d9d0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
1d9e0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1d9f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1da00 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1da10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
1da20 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1da30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1da40 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1da50 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
1da60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1da70 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1da80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1da90 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1daa0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1dad0 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
1dae0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
1daf0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1db00 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
1db10 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1db20 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1db30 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1db40 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
1db50 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
1db60 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
1db70 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
1db80 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
1db90 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1dba0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
1dbb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
1dbc0 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
1dbd0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1dbe0 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
1dbf0 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
1dc00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1dc10 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1dc20 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
1dc30 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
1dc40 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
1dc50 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
1dc60 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1dc70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1dc80 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
1dc90 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1dca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dcb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1dcc0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1dcd0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1dce0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1dcf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1dd10 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
1dd20 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1dd30 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1dd40 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1dd50 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
1dd60 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1dd70 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
1dd80 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1dd90 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
1dda0 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
1ddb0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
1ddc0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1ddd0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1dde0 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
1ddf0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
1de00 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
1de10 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
1de20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1de30 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1de40 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1de50 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1de60 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1de70 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1de80 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1de90 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1dea0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1deb0 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1dec0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1ded0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1dee0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1def0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1df00 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1df10 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1df20 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45       .#if SQLITE
1df30 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1df40 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1df50 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
1df60 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
1df70 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
1df80 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1df90 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ITE, nByte, NULL
1dfa0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1dfb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1dfc0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1dfd0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1dfe0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1dff0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1e000 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
1e010 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1e020 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
1e030 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
1e040 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1e050 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1e060 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
1e070 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1e080 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
1e090 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
1e0a0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1e0b0 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1e0c0 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1e0d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1e0e0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
1e0f0 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
1e100 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
1e110 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1e120 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1e130 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e140 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1e150 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
1e170 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1e180 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
1e190 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
1e1a0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1e1b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e1c0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e1d0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1e1e0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1e1f0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1e200 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1e210 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
1e220 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
1e230 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1e240 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
1e250 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1e260 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1e270 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1e280 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1e290 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1e2a0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1e2b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
1e2c0 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
1e2d0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1e2e0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1e2f0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1e300 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1e310 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
1e320 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1e330 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1e340 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1e350 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1e360 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1e370 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
1e380 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
1e390 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1e3a0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e3b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e3c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e3d0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1e3e0 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e400 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
1e410 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1e420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e430 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
1e440 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e450 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e460 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e470 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1e480 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e490 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
1e4a0 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
1e4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e4c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1e4d0 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1e4e0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1e4f0 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1e500 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1e510 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1e520 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1e530 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1e540 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1e550 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1e560 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1e570 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1e580 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1e590 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1e5a0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e5b0 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1e5c0 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1e5d0 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1e5e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1e5f0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1e600 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1e610 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e620 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1e630 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1e640 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1e650 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1e660 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1e670 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1e680 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1e690 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1e6a0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1e6b0 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1e6c0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1e6d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e6e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1e6f0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1e700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1e710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1e720 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1e730 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1e740 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1e750 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1e760 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1e770 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1e780 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1e790 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1e7a0 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1e7b0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1e7c0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1e7d0 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1e7e0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1e7f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1e800 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1e810 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1e820 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1e830 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1e840 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1e850 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1e860 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1e870 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1e880 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1e890 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1e8a0 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1e8b0 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1e8c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e8d0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e8e0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1e8f0 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1e900 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1e910 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1e920 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1e930 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1e940 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1e950 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1e960 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e970 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1e980 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1e990 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e9a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1e9b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1e9c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1e9d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e9e0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1e9f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1ea00 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1ea20 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ea30 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1ea40 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ea50 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1ea60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1ea70 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1ea80 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1ea90 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1eaa0 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1eab0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1eae0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
1eaf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1eb00 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1eb10 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1eb20 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1eb30 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1eb40 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
1eb50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
1eb60 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
1eb70 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
1eb80 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
1eb90 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1eba0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1ebb0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1ebc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1ebd0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1ebe0 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1ebf0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1ec00 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1ec20 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ec30 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1ec40 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
1ec50 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1ec60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ec70 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1ec80 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
1ecb0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1ecc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1ecd0 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1ece0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1ecf0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1ed00 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1ed10 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1ed20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1ed30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ed40 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
1ed50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ed60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1ed70 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
1ed80 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
1ed90 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1eda0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
1edb0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
1edc0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
1edd0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
1ede0 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
1edf0 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
1ee00 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
1ee10 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
1ee20 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
1ee30 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
1ee40 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
1ee50 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
1ee60 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
1ee70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1ee80 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
1ee90 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
1eea0 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
1eeb0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
1eec0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
1eed0 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
1eee0 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
1eef0 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
1ef00 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
1ef10 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
1ef20 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1ef30 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
1ef40 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1ef50 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
1ef60 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
1ef70 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
1ef80 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
1ef90 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
1efa0 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
1efb0 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
1efc0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1efd0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
1efe0 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
1eff0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f000 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
1f010 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
1f020 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
1f030 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
1f040 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
1f050 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1f060 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
1f070 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
1f080 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1f090 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
1f0a0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1f0b0 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
1f0c0 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
1f0d0 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
1f0e0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
1f0f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
1f100 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
1f110 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
1f120 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1f130 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1f140 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
1f150 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1f160 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f170 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
1f180 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
1f190 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
1f1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f1b0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
1f1c0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
1f1d0 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1f1e0 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
1f1f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1f200 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1f210 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1f220 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1f230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f240 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
1f250 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f260 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f270 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
1f280 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1f290 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
1f2a0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
1f2b0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
1f2c0 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
1f2d0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
1f2e0 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
1f2f0 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
1f300 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1f310 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20  e - 1);. .  if( 
1f320 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e  nMap==0 && pFd->
1f330 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1f340 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1f350 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Fd);.  }.  if( n
1f360 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
1f370 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ze ){.    void *
1f380 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57  pNew = 0;.    DW
1f390 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41  ORD protect = PA
1f3a0 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  GE_READONLY;.   
1f3b0 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46   DWORD flags = F
1f3c0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20  ILE_MAP_READ;.. 
1f3d0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1f3e0 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70  pFd);.    if( (p
1f3f0 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
1f400 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  WINFILE_RDONLY)=
1f410 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74  =0 ){.      prot
1f420 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57  ect = PAGE_READW
1f430 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67  RITE;.      flag
1f440 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52  s |= FILE_MAP_WR
1f450 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  ITE;.    }.#if S
1f460 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1f470 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1f480 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1f490 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
1f4a0 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1f4b0 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
1f4c0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1f4d0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1f4e0 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
1f4f0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1f500 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
1f510 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1f520 20 20 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 28                 (
1f540 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1f550 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1f560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f580 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1f590 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1f5a0 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
1f5b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1f5c0 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64  AS_ANSI).    pFd
1f5d0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1f5e0 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46  eFileMappingA(pF
1f5f0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1f600 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
1f630 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
1f640 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f660 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
1f670 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
1f680 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  ), NULL);.#endif
1f690 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d  .    if( pFd->hM
1f6a0 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
1f6b0 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1f6c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1f6d0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1f6e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1f6f0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1f700 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1f730 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e1", pFd->zPath)
1f740 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1f750 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1f760 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1f770 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1f780 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1f790 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1f7a0 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
1f7b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1f7c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1f7d0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1f7e0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1f7f0 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
1f800 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1f810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f820 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f830 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20  assert( (nMap % 
1f840 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1f850 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20  eSize)==0 );.   
1f860 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1f870 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28  SIZE_T)==sizeof(
1f880 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c  sqlite3_int64) |
1f890 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66  | nMap<=0xffffff
1f8a0 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ff );.#if SQLITE
1f8b0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
1f8c0 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1f8d0 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
1f8e0 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1f8f0 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
1f900 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
1f910 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1f920 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
1f930 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54  s, 0, 0, (SIZE_T
1f940 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20  )nMap);.#endif. 
1f950 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c     if( pNew==NUL
1f960 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  L ){.      osClo
1f970 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d  seHandle(pFd->hM
1f980 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ap);.      pFd->
1f990 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hMap = NULL;.   
1f9a0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1f9b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1f9c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1f9d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1f9e0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1f9f0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1fa20 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le2", pFd->zPath
1fa30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1fa40 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1fa50 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1fa60 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1fa70 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1fa80 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1fa90 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d  AP-FILE-MAP pid=
1faa0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1fab0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1fac0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1fad0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1fae0 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1faf0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1fb00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fb10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1fb20 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
1fb30 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  pNew;.    pFd->m
1fb40 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
1fb50 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1fb60 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a  eActual = nMap;.
1fb70 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1fb80 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1fb90 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1fba0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1fbb0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1fbc0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1fbd0 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72  , pFd));.  retur
1fbe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1fbf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1fc00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
1fc10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
1fc20 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
1fc30 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
1fc40 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
1fc50 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
1fc60 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
1fc70 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
1fc80 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
1fc90 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
1fca0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
1fcb0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
1fcc0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
1fcd0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
1fce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1fcf0 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
1fd00 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
1fd10 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
1fd20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
1fd30 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
1fd40 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
1fd50 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
1fd60 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1fd70 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
1fd80 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
1fd90 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
1fda0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1fdb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
1fdc0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
1fdd0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
1fde0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1fdf0 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
1fe00 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
1fe10 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
1fe20 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
1fe30 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
1fe40 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1fe50 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
1fe60 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
1fe70 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
1fe80 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1fe90 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
1fea0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1feb0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1fec0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1fed0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
1fee0 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
1fef0 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
1ff00 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
1ff10 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
1ff20 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
1ff30 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1ff40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ff50 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
1ff60 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
1ff70 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1ff80 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
1ff90 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
1ffa0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
1ffb0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
1ffc0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
1ffd0 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
1ffe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20000 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
20010 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
20020 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
20030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20040 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20050 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
20060 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
20070 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
20080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20090 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
200a0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
200b0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
200c0 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
200d0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
200e0 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
200f0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
20100 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
20110 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
20120 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
20130 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
20140 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
20150 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
20160 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20170 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
20180 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
20190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
201a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
201b0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
201c0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
201d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
201e0 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
201f0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
20200 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
20210 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68  call to winFetch
20220 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
20230 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
20240 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
20250 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
20260 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
20270 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
20280 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
20290 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46  ssed to the winF
202a0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
202b0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
202c0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
202d0 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
202e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
202f0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
20300 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
20310 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
20320 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
20330 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
20340 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
20350 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
20360 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
20370 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
20380 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74  tic int winUnfet
20390 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
203a0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76  *fd, i64 iOff, v
203b0 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  oid *p){.#if SQL
203c0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
203d0 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
203e0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
203f0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
20400 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
20410 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  file */..  /* If
20420 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
20430 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
20440 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
20450 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
20460 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
20470 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
20480 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
20490 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
204a0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
204b0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
204c0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
204d0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
204e0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
204f0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
20500 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
20510 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
20520 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
20530 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
20540 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
20550 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
20560 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
20570 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
20580 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
20590 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
205a0 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
205b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
205c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
205d0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
205e0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
205f0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
20600 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
20610 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
20620 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
20630 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
20640 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
20650 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
20660 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
20670 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
20680 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
20690 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
206a0 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
206b0 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20  cessary can can 
206c0 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74  be omitted - pot
206d0 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69  entially improvi
206e0 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72  ng.    ** perfor
206f0 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77  mance.  */.    w
20700 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
20710 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
20720 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
20730 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
20740 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
20750 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20760 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
20770 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
20780 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
20790 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a  cessId(), fd));.
207a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
207b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
207c0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
207d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
207e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
207f0 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
20800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20810 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
20820 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
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 0a 2a 2a 2a 2a 2a 2a  *********.******
20850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20890 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
208a0 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
208b0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
208c0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
208d0 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
208e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
208f0 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
20900 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
20910 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
20920 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20  ethod = {.  3,  
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
20950 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
20960 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20980 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
20990 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
209a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
209b0 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
209c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
209d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
209e0 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
209f0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
20a00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
20a10 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
20a20 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
20a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20a40 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
20a50 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
20a60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
20a70 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
20a80 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
20aa0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
20ab0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20ad0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
20ae0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
20af0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
20b00 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
20b10 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
20b20 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
20b30 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
20b40 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
20b50 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
20b60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
20b70 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
20b80 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20b90 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
20ba0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
20bb0 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
20bc0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20be0 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
20bf0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
20c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20c10 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
20c20 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c40 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
20c50 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20   winShmUnmap,   
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
20c80 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20  .  winFetch,    
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
20cb0 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20    winUnfetch    
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
20ce0 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a  ****************
20d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d30 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
20d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
20d50 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
20d60 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
20d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
20d90 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
20da0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20db0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
20dc0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
20dd0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69  s object..*/..#i
20de0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
20df0 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  IN__)./*.** Conv
20e00 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66  ert a filename f
20e10 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65  rom whatever the
20e20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
20e30 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20  ating system.** 
20e40 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c  supports for fil
20e50 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d  enames into UTF-
20e60 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
20e70 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  d the result is.
20e80 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
20e90 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
20ea0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
20eb0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
20ec0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
20ed0 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55  r *winConvertToU
20ee0 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
20ef0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
20f00 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e  e){.  char *zCon
20f10 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
20f20 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
20f30 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
20f40 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
20f50 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
20f60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
20f70 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
20f80 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  lse{.    zConver
20f90 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  ted = sqlite3_wi
20fa0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
20fb0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
20fc0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
20fd0 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
20fe0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
20ff0 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
21000 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rted;.}.#endif..
21010 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
21020 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
21030 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
21040 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
21050 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
21060 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
21070 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
21080 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
21090 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
210a0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
210b0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
210c0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
210d0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
210e0 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43  tatic void *winC
210f0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
21100 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
21110 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
21120 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
21130 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
21140 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
21150 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
21160 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
21170 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
21180 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
21190 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
211a0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
211b0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
211c0 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
211d0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
211e0 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
211f0 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
21200 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
21210 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
21220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
21230 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
21240 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
21250 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20  specified UTF-8 
21260 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a  string buffer.**
21270 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72   ends with a dir
21280 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
21290 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e   character or on
212a0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
212b0 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69  ly.** added to i
212c0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
212d0 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72   winMakeEndInDir
212e0 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  Sep(int nBuf, ch
212f0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28  ar *zBuf){.  if(
21300 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74   zBuf ){.    int
21310 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53   nLen = sqlite3S
21320 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
21330 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b     if( nLen>0 ){
21340 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
21350 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e  DirSep(zBuf[nLen
21360 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
21370 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
21380 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31  }else if( nLen+1
21390 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  <nBuf ){.       
213a0 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69   zBuf[nLen] = wi
213b0 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20  nGetDirSep();.  
213c0 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b        zBuf[nLen+
213d0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  1] = '\0';.     
213e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
213f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
21400 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21410 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
21420 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
21430 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
21440 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72  esulting pointer
21450 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20   into pzBuf..** 
21460 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
21470 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75  rned in pzBuf mu
21480 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20  st be freed via 
21490 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
214a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
214b0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c  nGetTempname(sql
214c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
214d0 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20  char **pzBuf){. 
214e0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
214f0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
21500 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
21510 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
21520 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
21530 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
21540 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69  123456789";.  si
21550 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74  ze_t i, j;.  int
21560 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53   nPre = sqlite3S
21570 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
21580 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
21590 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42  ;.  int nMax, nB
215a0 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a  uf, nDir, nLen;.
215b0 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
215c0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
215d0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
215e0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
215f0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
21600 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
21610 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
21620 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
21630 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
21640 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
21650 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
21660 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
21670 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
21680 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
21690 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
216a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
216b0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
216c0 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
216d0 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20   file.  ** name 
216e0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
216f0 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73  y file.  If this
21700 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f   fails, we canno
21710 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f  t continue..  */
21720 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e  .  nMax = pVfs->
21730 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66  mxPathname; nBuf
21740 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a   = nMax + 2;.  z
21750 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Buf = sqlite3Mal
21760 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b  locZero( nBuf );
21770 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a  .  if( !zBuf ){.
21780 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21790 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
217a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
217b0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  M\n"));.    retu
217c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
217d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
217e0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
217f0 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72  effective tempor
21800 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
21810 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20  First, check if 
21820 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  one.  ** has bee
21830 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  n explicitly set
21840 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
21850 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ion; otherwise, 
21860 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a  use the one.  **
21870 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
21880 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
21890 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72  tem..  */.  nDir
218a0 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20   = nMax - (nPre 
218b0 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28  + 15);.  assert(
218c0 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28   nDir>0 );.  if(
218d0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
218e0 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69  rectory ){.    i
218f0 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c  nt nDirLen = sql
21900 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
21910 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21920 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  ory);.    if( nD
21930 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  irLen>0 ){.     
21940 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65   if( !winIsDirSe
21950 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  p(sqlite3_temp_d
21960 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e  irectory[nDirLen
21970 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
21980 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20  nDirLen++;.     
21990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69   }.      if( nDi
219a0 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20  rLen>nDir ){.   
219b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
219c0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
219d0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
219e0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
219f0 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
21a00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
21a10 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21a20 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
21a30 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29  etTempname1", 0)
21a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21a50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21a60 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
21a70 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
21a80 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
21a90 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
21aa0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
21ab0 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
21ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
21ad0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  irs[] = {.      
21ae0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53   0, /* getenv("S
21af0 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a  QLITE_TMPDIR") *
21b00 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
21b10 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20  etenv("TMPDIR") 
21b20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
21b30 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f  getenv("TMP") */
21b40 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21b50 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a  tenv("TEMP") */.
21b60 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21b70 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
21b80 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76  ") */.       "/v
21b90 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  ar/tmp",.       
21ba0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
21bb0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
21bc0 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20    ".",.       0 
21bd0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
21be0 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20  erminator */.   
21bf0 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   };.    unsigned
21c00 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
21c10 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
21c20 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  ;..    if( !azDi
21c30 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
21c40 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
21c50 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  TE_TMPDIR");.   
21c60 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
21c70 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
21c80 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
21c90 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21ca0 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
21cb0 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a   getenv("TMP");.
21cc0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21cd0 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d  3] ) azDirs[3] =
21ce0 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b   getenv("TEMP");
21cf0 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
21d00 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20  [4] ) azDirs[4] 
21d10 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
21d20 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72  OFILE");.    for
21d30 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
21d40 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
21d50 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
21d60 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
21d70 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
21d80 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ted;.      if( z
21d90 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
21da0 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e;.      /* If t
21db0 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77  he path starts w
21dc0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
21dd0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  er followed by t
21de0 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a  he colon.      *
21df0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73  * character, ass
21e00 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64  ume it is alread
21e10 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  y a native Win32
21e20 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65   path; otherwise
21e30 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75  ,.      ** it mu
21e40 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  st be converted 
21e50 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  to a native Win3
21e60 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43  2 path via the C
21e70 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20  ygwin API.      
21e80 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e  ** prior to usin
21e90 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  g it..      */. 
21ea0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72       if( winIsDr
21eb0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
21ec0 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  n(zDir) ){.     
21ed0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
21ee0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
21ef0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29  f8Filename(zDir)
21f00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
21f10 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
21f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21f30 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
21f40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
21f50 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
21f60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21f70 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
21f80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21f90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
21fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21fb0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
21fc0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
21fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
21fe0 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
21ff0 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a  f, "%s", zDir);.
22000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22010 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22020 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
22030 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
22040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22050 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22060 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22070 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
22080 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
22090 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a  Zero( nMax+1 );.
220a0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
220b0 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
220c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
220d0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
220e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
220f0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22100 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22110 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
22120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22130 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
22140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22150 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
22160 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
22170 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43      osIsNT() ? C
22180 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
22190 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
221a0 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20  _WIN_A, zDir,.  
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
221c0 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31  onverted, nMax+1
221d0 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
221e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
221f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22200 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22210 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
22220 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22230 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22240 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
22250 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
22260 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22270 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
22280 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  ERR_CONVPATH, (D
22290 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
222c0 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72  Tempname2", zDir
222d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
222e0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
222f0 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
22300 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  .          /* At
22310 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
22320 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61  know the candida
22330 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69  te directory exi
22340 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20  sts and should. 
22350 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75           ** be u
22360 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  sed.  However, w
22370 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f  e may need to co
22380 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67  nvert the string
22390 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
223a0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d        ** its nam
223b0 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e  e into UTF-8 (i.
223c0 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d  e. if it is UTF-
223d0 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20  16 right now).. 
223e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
223f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
22400 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
22410 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f  Utf8Filename(zCo
22420 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22430 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
22440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22450 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
22460 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
22470 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22480 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
22490 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
224a0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
224b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
224c0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
224d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
224e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
224f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22510 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
22520 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
22530 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22540 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
22550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22560 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
22580 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
22590 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
225a0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
225b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
225c0 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f  }.#elif !SQLITE_
225d0 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
225e0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
225f0 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73  .  else if( osIs
22600 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
22610 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50   *zMulti;.    LP
22620 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d  WSTR zWidePath =
22630 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
22640 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28  ro( nMax*sizeof(
22650 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66  WCHAR) );.    if
22660 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a  ( !zWidePath ){.
22670 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22680 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22690 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
226a0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
226b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
226c0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
226d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
226e0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
226f0 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
22700 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74  W(nMax, zWidePat
22710 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
22720 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
22730 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
22740 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22750 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22760 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22770 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22780 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
22790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
227a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
227b0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
227c0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
227d0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
22800 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
22810 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69   zMulti = winUni
22820 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
22830 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
22840 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
22850 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22860 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
22870 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
22880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
22890 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
228a0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
228b0 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
228c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
228d0 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
228e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
228f0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22900 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22910 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22920 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22930 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22940 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
22950 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
22960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
22970 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
22980 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
22990 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
229a0 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
229b0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
229c0 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
229d0 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
229e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
229f0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
22a00 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22a10 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22a20 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
22a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22a40 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22a50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
22a60 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
22a70 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
22a80 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
22a90 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22aa0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22ab0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22ac0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
22ad0 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
22ae0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
22af0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
22b00 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
22b10 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
22b20 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
22b40 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
22b50 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
22b60 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
22b70 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
22b80 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
22b90 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
22ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
22bb0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
22bc0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
22bd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22be0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
22bf0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
22c00 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22c10 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22c20 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22c30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22c40 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
22c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22c60 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
22c70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
22c80 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
22c90 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  NSI */.#endif /*
22ca0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
22cb0 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T */..  /*.  ** 
22cc0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
22cd0 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
22ce0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20   directory ends 
22cf0 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69  with an appropri
22d00 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  ate.  ** separat
22d10 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  or.  If it does 
22d20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73  not and there is
22d30 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63   not enough spac
22d40 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20  e left to add.  
22d50 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20  ** one, fail..  
22d60 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b  */.  if( !winMak
22d70 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69  eEndInDirSep(nDi
22d80 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20  r+1, zBuf) ){.  
22d90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22da0 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
22db0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22dc0 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
22dd0 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
22de0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22df0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
22e00 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34  "winGetTempname4
22e10 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ", 0);.  }..  /*
22e20 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  .  ** Check that
22e30 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
22e40 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
22e50 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
22e60 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
22e70 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c  name in the foll
22e80 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20  owing format:.  
22e90 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70  **.  **   "<temp
22ea0 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e  orary_directory>
22eb0 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58  /etilqs_XXXXXXXX
22ec0 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a  XXXXXXX\0\0".  *
22ed0 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72  *.  ** If not, r
22ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22ef0 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  OR.  The number 
22f00 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20  17 is used here 
22f10 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
22f20 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
22f30 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
22f40 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20  he 15 character 
22f50 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e  random suffix an
22f60 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74  d the.  ** two t
22f70 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72  railing NUL char
22f80 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e  acters.  The fin
22f90 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  al directory sep
22fa0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
22fb0 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
22fc0 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61  y added if it wa
22fd0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72  s not already pr
22fe0 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c  esent..  */.  nL
22ff0 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
23000 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66  en30(zBuf);.  if
23010 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b  ( (nLen + nPre +
23020 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20   17) > nBuf ){. 
23030 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23040 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41  zBuf);.    OSTRA
23050 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23060 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
23070 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
23080 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
23090 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
230a0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
230b0 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  5", 0);.  }..  s
230c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
230d0 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42  nBuf-16-nLen, zB
230e0 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f  uf+nLen, SQLITE_
230f0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
23100 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65  );..  j = sqlite
23110 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
23120 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
23130 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
23140 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  j]);.  for(i=0; 
23150 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
23160 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28  .    zBuf[j] = (
23170 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
23180 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
23190 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
231a0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a  hars)-1) ];.  }.
231b0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
231c0 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
231d0 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b    *pzBuf = zBuf;
231e0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
231f0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65  MP-FILENAME name
23200 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%s, rc=SQLITE_O
23210 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20  K\n", zBuf));.  
23220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23240 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
23250 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c  med file is real
23260 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  ly a directory. 
23270 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
23280 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68  .** it is someth
23290 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
232a0 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69   directory, or i
232b0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
232c0 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ind of memory.**
232d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
232e0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
232f0 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
23300 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74  t void *zConvert
23310 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  ed){.  DWORD att
23320 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
23330 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
23340 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  no;..  if( osIsN
23350 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
23360 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
23370 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
23380 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
23390 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
233a0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
233b0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
233c0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
233d0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
233e0 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
233f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
23420 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
23430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
23450 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
23460 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
23470 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
23480 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b  }.    if( !rc ){
23490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
234a0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65   /* Invalid name
234b0 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61  ? */.    }.    a
234c0 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
234d0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
234e0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
234f0 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
23500 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
23510 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
23520 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
23530 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
23540 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21  .  return (attr!
23550 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
23560 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74  TRIBUTES) && (at
23570 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
23580 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a  E_DIRECTORY);.}.
23590 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
235a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
235b0 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c  t winOpen(.  sql
235c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
235d0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
235e0 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61  o get maximum pa
235f0 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a  th name length *
23600 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23610 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
23620 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
23630 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
23640 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
23650 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
23660 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
23670 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
23680 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
236a0 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
236b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
236c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
236d0 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
236e0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
236f0 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
23700 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
23710 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
23720 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
23730 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
23740 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
23750 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
23760 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
23770 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
23780 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
23790 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
237a0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
237b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
237c0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
237d0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
237f0 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
23800 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
23810 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
23820 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46  me = zName; /* F
23830 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
23840 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
23850 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  nt cnt = 0;..  /
23860 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
23870 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
23880 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
23890 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
238a0 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
238b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
238c0 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
238d0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
238e0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
238f0 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65    char *zTmpname
23900 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d   = 0; /* For tem
23910 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c  porary filename,
23920 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a   if necessary. *
23930 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
23940 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
23950 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
23960 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
23970 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
23980 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
23990 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
239a0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
239b0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
239c0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
239d0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
239e0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
239f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23a00 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
23a10 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
23a20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
23a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23a40 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
23a50 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
23a60 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23a70 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
23a80 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
23a90 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
23aa0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
23ab0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
23ac0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
23ad0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23ae0 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
23af0 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
23b00 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
23b10 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
23b20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
23b30 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
23b40 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
23b50 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23b60 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23b70 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
23b80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
23b90 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
23ba0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
23bb0 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
23bc0 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
23bd0 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
23be0 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
23bf0 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
23c00 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
23c10 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
23c20 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
23c30 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
23c40 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
23c50 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
23c60 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
23c70 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
23c80 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
23c90 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
23ca0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
23cb0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
23cc0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
23cd0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
23ce0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
23cf0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
23d00 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
23d10 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
23d20 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
23d30 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
23d40 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
23d50 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
23d60 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
23d70 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
23d80 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
23d90 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
23da0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
23db0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
23dc0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
23dd0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
23de0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
23df0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
23e00 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
23e10 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
23e20 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
23e30 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
23e40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
23e50 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
23e60 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
23e70 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
23e80 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
23e90 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
23ea0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23eb0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23ec0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23ed0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
23ee0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23ef0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23f00 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23f10 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
23f20 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
23f30 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
23f40 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
23f50 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
23f60 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
23f70 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
23f80 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
23f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
23fa0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
23fb0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
23fc0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
23fd0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
23fe0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
23ff0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
24000 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24010 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
24020 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
24030 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
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 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
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 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
24080 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
24090 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
240a0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
240b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
240c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
240d0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
240e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
240f0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
24100 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24110 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
24120 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
24130 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  0 );.  memset(pF
24140 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ile, 0, sizeof(w
24150 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c  inFile));.  pFil
24160 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
24170 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69  ANDLE_VALUE;..#i
24180 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
24190 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  T.  if( !zUtf8Na
241a0 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74  me && !sqlite3_t
241b0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
241c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
241d0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20  (SQLITE_ERROR,. 
241e0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f         "sqlite3_
241f0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76  temp_directory v
24200 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  ariable should b
24210 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22  e set for WinRT"
24220 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
24230 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
24240 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
24250 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
24260 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
24270 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
24280 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
24290 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
242a0 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
242b0 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
242c0 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
242d0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
242e0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
242f0 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
24300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
24320 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
24330 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
24340 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
24350 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
24360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24370 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
24380 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
24390 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
243a0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
243b0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
243c0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
243d0 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
243e0 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
243f0 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
24400 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
24410 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
24420 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
24430 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
24440 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
24450 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24460 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
24470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
24480 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
24490 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
244a0 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
244b0 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
244c0 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
244d0 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
244e0 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
244f0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
24500 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
24510 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
24520 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
24530 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
24540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
24550 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
24560 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
24570 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
24580 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
24590 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
245a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
245b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
245c0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
245d0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
245e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
245f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
24600 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
24610 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
24620 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24630 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
24640 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
24650 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
24660 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
24670 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
24680 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
24690 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
246a0 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
246b0 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
246c0 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
246d0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
246e0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
246f0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
24700 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
24710 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
24720 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24730 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20  a new file is . 
24740 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c   ** created. SQL
24750 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  ite doesn't use 
24760 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22  it to indicate "
24770 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
24780 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  " .  ** as it is
24790 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
247a0 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
247b0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
247c0 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
247d0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
247e0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
247f0 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
24800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
24810 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
24820 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
24830 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24840 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
24850 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
24860 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
24870 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
24880 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
24890 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
248a0 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
248b0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
248c0 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
248d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
248e0 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
248f0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
24900 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24910 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
24920 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
24930 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
24940 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
24950 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
24960 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
24970 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
24980 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
24990 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
249a0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
249b0 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
249c0 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
249d0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
249e0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
249f0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
24a00 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
24a30 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24a60 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
24a70 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
24a80 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
24a90 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24aa0 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24ab0 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
24ac0 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
24ad0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
24ae0 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
24af0 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
24b00 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
24b10 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24b20 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
24b30 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
24b40 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24b50 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
24b60 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
24b70 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
24b80 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
24b90 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
24ba0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
24bb0 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
24bc0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
24bd0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
24be0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
24bf0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24c00 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
24c10 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
24c20 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
24c30 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
24c40 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24c50 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
24c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
24c70 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24c80 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
24c90 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
24ca0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24cb0 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
24cc0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24cd0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
24ce0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
24cf0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
24d00 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
24d10 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
24d20 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
24d30 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
24d40 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
24d50 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
24d60 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24d70 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
24d80 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
24d90 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
24da0 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
24db0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
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 64 77 44 65 73 69 72 65 64         dwDesired
24de0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
24e10 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
24e40 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
24e70 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
24e80 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
24e90 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
24ec0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
24ed0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
24ee0 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
24ef0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
24f00 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
24f10 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
24f20 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
24f50 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f70 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
24f80 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
24fb0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
24fc0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
24ff0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
25020 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25030 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
25060 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25070 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
25080 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
25090 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
250a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
250b0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
250c0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
250d0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
250e0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
250f0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
25120 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
25150 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25170 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
25180 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251a0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
251b0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
251c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
251f0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
25220 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
25230 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
25240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25250 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
25260 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
25270 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
25280 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
25290 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
252a0 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
252b0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
252c0 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
252d0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
252e0 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
252f0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
25300 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
25310 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
25320 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25330 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
25340 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
25350 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
25360 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
25370 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
25380 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
25390 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
253a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
253b0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
253c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
253d0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
253e0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
253f0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
25400 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
25410 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
25420 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
25430 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
25440 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20  _OPEN_READONLY) 
25450 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
25460 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f         ~(SQLITE_
25470 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
25480 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
25490 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f  E)),.         pO
254a0 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
254b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
254c0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
254d0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
254e0 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  }..  if( pOutFla
254f0 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gs ){.    if( is
25500 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
25510 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
25520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25530 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
25540 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
25550 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
25560 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
25570 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
25580 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
25590 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
255a0 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  %lx, pOutFlags=%
255b0 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64  p, *pOutFlags=%d
255c0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
255d0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
255e0 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65  f8Name, dwDesire
255f0 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61  dAccess, pOutFla
25600 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a  gs, pOutFlags ?.
25610 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74             *pOut
25620 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49  Flags : 0, (h==I
25630 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25640 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
25650 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53  : "ok"));..#if S
25660 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
25670 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
25680 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
25690 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
256a0 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77        && (rc = w
256b0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
256c0 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53  Name, pFile))!=S
256d0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
256e0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
256f0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
25700 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
25710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25720 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
25730 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
25740 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73  -CE-LOCK name=%s
25750 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d  , rc=%s\n", zNam
25760 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
25770 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74  e(rc)));.    ret
25780 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
25790 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
257a0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
257b0 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
257c0 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
257d0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
257e0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
257f0 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ed);.  }..  sqli
25800 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
25810 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  e);.  pFile->pMe
25820 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
25830 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56  hod;.  pFile->pV
25840 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69  fs = pVfs;.  pFi
25850 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28  le->h = h;.  if(
25860 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20   isReadonly ){. 
25870 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
25880 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52  ags |= WINFILE_R
25890 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
258a0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
258b0 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f  lean(zName, "pso
258c0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
258d0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
258e0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
258f0 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
25900 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70  LE_PSOW;.  }.  p
25910 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
25920 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
25930 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
25940 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  me;.#if SQLITE_M
25950 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
25960 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
25970 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  ULL;.  pFile->pM
25980 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
25990 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
259a0 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
259b0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
259c0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
259d0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
259e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
259f0 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  map;.#endif..  O
25a00 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
25a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25a20 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
25a30 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
25a40 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e  ** Note that Win
25a50 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
25a60 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
25a70 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
25a80 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
25a90 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
25aa0 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
25ab0 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
25ac0 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
25ad0 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
25ae0 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
25af0 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
25b00 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
25b10 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
25b20 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
25b30 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
25b40 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
25b50 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
25b60 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
25b70 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
25b80 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
25b90 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
25ba0 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
25bb0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
25bc0 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
25bd0 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
25be0 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
25bf0 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
25c00 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
25c10 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
25c20 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
25c30 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
25c40 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
25c50 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
25c60 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
25c70 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
25c80 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
25c90 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
25ca0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
25cb0 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
25cc0 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
25cd0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
25ce0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
25cf0 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
25d00 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
25d10 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74  t rc;.  DWORD at
25d20 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  tr;.  DWORD last
25d30 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
25d40 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
25d50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25d60 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
25d70 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
25d80 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
25d90 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
25da0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
25db0 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ETE);.  OSTRACE(
25dc0 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
25dd0 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c  , syncDir=%d\n",
25de0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63   zFilename, sync
25df0 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Dir));..  zConve
25e00 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
25e10 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
25e20 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
25e30 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
25e40 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
25e50 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
25e60 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
25e70 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
25e80 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
25e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25ea0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
25eb0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
25ec0 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49     do {.#if SQLI
25ed0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
25ee0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
25ef0 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
25f00 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d  rData;.      mem
25f10 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
25f20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
25f30 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20  ata));.      if 
25f40 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  ( osGetFileAttri
25f50 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72  butesExW(zConver
25f60 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e  ted, GetFileExIn
25f70 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
25f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
25fa0 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20  AttrData) ){.   
25fb0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
25fc0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
25fd0 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65  ibutes;.      }e
25fe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  lse{.        las
25ff0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
26000 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
26010 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
26020 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
26030 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
26040 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
26050 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
26060 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
26070 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
26080 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
26090 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
260a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
260b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
260c0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
260d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
260e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
260f0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74  .#else.      att
26100 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
26110 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
26120 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ted);.#endif.   
26130 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e     if ( attr==IN
26140 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
26150 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20  BUTES ){.       
26160 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
26170 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
26180 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
26190 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
261a0 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
261b0 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
261c0 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
261d0 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
261e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
261f0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
26200 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
26210 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
26220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26240 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
26250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26260 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
26270 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
26280 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b  UTE_DIRECTORY ){
26290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
262a0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46  LITE_ERROR; /* F
262b0 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  iles only. */.  
262c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
262d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
262e0 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43  osDeleteFileW(zC
262f0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
26300 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26310 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20  _OK; /* Deleted 
26320 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  OK. */.        b
26330 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26340 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74      if ( !winRet
26350 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
26360 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
26370 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26380 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f  _ERROR; /* No mo
26390 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20  re retries. */. 
263a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
263b0 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c      }.    } whil
263c0 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  e(1);.  }.#ifdef
263d0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
263e0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
263f0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74     do {.      at
26400 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
26410 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65  tributesA(zConve
26420 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20  rted);.      if 
26430 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
26440 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
26450 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
26460 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
26470 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
26480 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
26490 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
264a0 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
264b0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
264c0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
264d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
264e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
264f0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
26500 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
26510 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
26520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26530 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26550 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26560 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46       if ( attr&F
26570 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
26580 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20  RECTORY ){.     
26590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
265a0 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f  RROR; /* Files o
265b0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nly. */.        
265c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
265d0 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65       if ( osDele
265e0 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
265f0 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ed) ){.        r
26600 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
26610 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f  * Deleted OK. */
26620 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
26630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26640 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72   ( !winRetryIoer
26650 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
26660 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
26670 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26680 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
26690 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
266a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
266b0 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
266c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
266d0 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54   rc && rc!=SQLIT
266e0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
266f0 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  OENT ){.    rc =
26700 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
26710 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
26720 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
26730 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e  nDelete", zFilen
26740 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
26750 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
26760 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
26770 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
26780 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ed);.  OSTRACE((
26790 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
267a0 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65   rc=%s\n", zFile
267b0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  name, sqlite3Err
267c0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
267d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
267e0 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73  * Check the exis
267f0 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73  tence and status
26800 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   of a file..*/.s
26810 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
26820 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
26830 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
26840 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
26850 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
26860 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
26870 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
26880 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
26890 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
268c0 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
268d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  file */.  int *p
268e0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
268f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
26900 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ult */.){.  DWOR
26910 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
26920 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
26930 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76  stErrno = 0;.  v
26940 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
26950 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26960 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69  TER(pVfs);..  Si
26970 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
26980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
26990 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
269a0 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
269b0 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d   name=%s, flags=
269c0 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %x, pResOut=%p\n
269d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
269e0 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  ilename, flags, 
269f0 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43  pResOut));..  zC
26a00 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
26a10 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
26a20 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
26a30 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
26a40 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
26a50 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
26a60 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
26a70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
26a80 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
26a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26aa0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
26ab0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
26ac0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
26ad0 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
26ae0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
26af0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
26b00 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
26b10 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
26b20 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
26b30 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
26b40 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
26b50 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
26b60 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
26b90 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20  nfoStandard, .  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
26bc0 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
26bd0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
26be0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
26bf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
26c00 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
26c10 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
26c20 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
26c30 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
26c40 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
26c50 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
26c60 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
26c70 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
26c80 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
26c90 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
26ca0 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
26cb0 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
26cc0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
26cd0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
26ce0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
26cf0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
26d00 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
26d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26d20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
26d30 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
26d40 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
26d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26d60 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
26d70 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  t);.      if( la
26d80 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46  stErrno!=ERROR_F
26d90 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26  ILE_NOT_FOUND &&
26da0 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
26db0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
26dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26dd0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26de0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
26df0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
26e00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
26e10 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
26e20 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20   "winAccess",.  
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
26e50 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
26e60 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
26e70 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
26e80 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
26e90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
26ea0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
26eb0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
26ec0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
26ed0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
26ee0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
26ef0 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
26f00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26f10 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
26f20 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
26f30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
26f40 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
26f50 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
26f60 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
26f70 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
26f80 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
26f90 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
26fa0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
26fb0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
26fc0 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TE:.      rc = a
26fd0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
26fe0 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74               (at
27000 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
27010 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  UTE_READONLY)==0
27020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27030 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
27040 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
27050 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
27060 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
27070 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
27080 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
27090 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%s, pResOut=%p
270a0 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
270b0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
270c0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
270d0 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a  name, pResOut, *
270e0 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
270f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27100 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
27110 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
27120 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
27130 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
27140 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a  a drive letter.*
27150 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  * followed by a 
27160 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e  colon character.
27170 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
27180 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
27190 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73  AndColon(.  cons
271a0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
271b0 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20  e.){.  return ( 
271c0 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
271d0 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20  Pathname[0]) && 
271e0 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a  zPathname[1]==':
271f0 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ' );.}../*.** Re
27200 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
27210 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
27220 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
27230 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69   be used verbati
27240 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65  m.  If.** non-ze
27250 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  ro is returned f
27260 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
27270 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  n, the calling f
27280 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d  unction must sim
27290 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70  ply.** use the p
272a0 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d  rovided path nam
272b0 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20  e verbatim -OR- 
272c0 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20  resolve it into 
272d0 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
272e0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65  .** using the Ge
272f0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69  tFullPathName Wi
27300 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  n32 API function
27310 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e   (if available).
27320 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
27330 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
27340 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
27350 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
27360 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  {.  /*.  ** If t
27370 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
27380 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61  rts with a forwa
27390 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61  rd slash or a ba
273a0 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65  ckslash, it is e
273b0 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67  ither.  ** a leg
273c0 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76  al UNC name, a v
273d0 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70  olume relative p
273e0 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c  ath, or an absol
273f0 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e  ute path name in
27400 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22   the.  ** "Unix"
27410 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f   format on Windo
27420 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ws.  There is no
27430 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66   easy way to dif
27440 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
27450 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  en.  ** the fina
27460 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65  l two cases; the
27470 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72  refore, we retur
27480 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75  n the safer retu
27490 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45  rn value of TRUE
274a0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61  .  ** so that ca
274b0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
274c0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70  nction will simp
274d0 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74  ly use it verbat
274e0 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  im..  */.  if ( 
274f0 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74  winIsDirSep(zPat
27500 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  hname[0]) ){.   
27510 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
27520 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
27530 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
27540 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74  arts with a lett
27550 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69  er and a colon i
27560 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f  t is either a vo
27570 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69  lume.  ** relati
27580 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62  ve path or an ab
27590 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61  solute path.  Ca
275a0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
275b0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a  nction must not.
275c0 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    ** attempt to 
275d0 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65  treat it as a re
275e0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
275f0 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75   (i.e. they shou
27600 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20  ld simply use.  
27610 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e  ** it verbatim).
27620 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
27630 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
27640 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29  Colon(zPathname)
27650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
27660 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
27670 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
27680 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
27690 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
276a0 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
276b0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
276c0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
276d0 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
276e0 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
276f0 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
27700 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
27710 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
27720 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
27730 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
27740 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
27750 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
27760 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
27770 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
27780 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
27790 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
277a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
277b0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
277c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
277d0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
277e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
277f0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
27800 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
27810 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
27820 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
27830 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
27840 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
27850 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
27860 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27880 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
27890 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
278a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
278b0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
278c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
278d0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69  ffer */.){.  .#i
278e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
278f0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
27900 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
27910 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
27920 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27930 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
27940 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
27950 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
27960 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
27970 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
27980 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
27990 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
279a0 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
279b0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
279c0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
279d0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
279e0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
279f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
27a00 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
27a10 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
27a20 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
27a30 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
27a40 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
27a50 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
27a60 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
27a70 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
27a80 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
27a90 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
27aa0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
27ab0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
27ac0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
27ad0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
27ae0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27af0 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
27b00 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
27b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27b20 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
27b30 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
27b40 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
27b50 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
27b60 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
27b70 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
27b80 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20  TO_WIN_A) |.    
27b90 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41          CCP_RELA
27ba0 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c  TIVE, zRelative,
27bb0 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50   zOut, pVfs->mxP
27bc0 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
27bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27be0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
27bf0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
27c00 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
27c10 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
27c20 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c40 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
27c50 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
27c60 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
27c70 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
27c80 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
27c90 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74  tf8Filename(zOut
27ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55  );.      if( !zU
27cb0 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tf8 ){.        s
27cc0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
27cd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
27ce0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
27cf0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
27d00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
27d10 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
27d20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27d30 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
27d40 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
27d50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27d60 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
27d70 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
27d80 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ), zUtf8);.     
27d90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
27da0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
27db0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
27dc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
27dd0 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
27de0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
27df0 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
27e00 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
27e10 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
27e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27e30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
27e40 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
27e50 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
27e60 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
27e70 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
27e80 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
27e90 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20  X_TO_WIN_A),.   
27ea0 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69           zRelati
27eb0 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
27ec0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
27ed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27ee0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
27ef0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
27f00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
27f10 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
27f20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
27f50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
27f60 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
27f70 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
27f80 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
27f90 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
27fa0 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
27fb0 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
27fc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27fd0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
27fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27ff0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  R_NOMEM;.      }
28000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
28010 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
28020 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
28030 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
28040 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
28050 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
28060 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
28070 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
28080 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
280a0 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
280b0 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
280c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
280d0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
280e0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
280f0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
28100 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
28110 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
28120 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
28130 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
28140 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
28150 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
28160 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
28170 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
28180 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
28190 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
281a0 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
281b0 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
281c0 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
281d0 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
281e0 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
281f0 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
28200 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
28210 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
28220 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
28230 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
28240 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
28250 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
28260 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
28270 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
28280 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
28290 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
282a0 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
282b0 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
282c0 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
282d0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
282e0 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
282f0 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
28300 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28310 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28320 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28330 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
28340 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
28350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28360 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
28370 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
28380 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
28390 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
283a0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
283b0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
283c0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
283d0 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
283e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
283f0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
28400 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
28410 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
28420 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
28430 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
28440 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65  _).  DWORD nByte
28450 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
28460 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  rted;.  char *zO
28470 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ut;..  /* If thi
28480 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
28490 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
284a0 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
284b0 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
284c0 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
284d0 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
284e0 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
284f0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
28500 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
28510 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65  /' && winIsDrive
28520 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
28530 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20  Relative+1) ){. 
28540 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
28550 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f    }..  /* It's o
28560 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
28570 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
28580 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
28590 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
285a0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
285b0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
285c0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
285d0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
285e0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
285f0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
28600 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
28610 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
28620 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
28630 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
28640 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
28650 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
28660 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
28670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28680 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ROR );.  if ( sq
28690 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
286a0 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
286b0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
286c0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
286d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
286e0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
286f0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
28700 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
28710 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
28720 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
28730 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
28740 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
28750 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
28760 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
28770 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
28780 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
28790 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
287a0 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
287b0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
287c0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
287d0 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
287e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
287f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
28800 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
28810 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
28820 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
28850 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
28860 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
28870 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ve);.    return 
28880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
28890 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
288a0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
288b0 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Filename(zRelati
288c0 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ve);.  if( zConv
288d0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
288e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
288f0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
28900 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
28910 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
28920 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
28930 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
28940 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
28950 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
28960 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
28970 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28980 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28990 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
289a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
289b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
289c0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
289d0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
28a00 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame1", zRelative
28a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
28a20 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
28a30 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
28a40 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
28a50 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
28a60 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
28a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28a80 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28a90 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28aa0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28ab0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
28ac0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
28ad0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
28ae0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28af0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
28b00 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
28b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28b20 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28b30 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
28b40 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
28b50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
28b60 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
28b70 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
28b80 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
28b90 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
28bc0 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  2", zRelative);.
28bd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28be0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28bf0 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77  d);.    zOut = w
28c00 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
28c10 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
28c20 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
28c30 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
28c40 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
28c50 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
28c60 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
28c70 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
28c80 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
28c90 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
28ca0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
28cb0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
28cc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28cd0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
28ce0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
28cf0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
28d00 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
28d10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
28d40 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65  lPathname3", zRe
28d50 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
28d60 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
28d70 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
28d80 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
28d90 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
28da0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
28db0 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
28dc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28dd0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28df0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
28e00 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
28e10 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
28e20 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
28e30 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
28e40 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
28e50 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
28e60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28e70 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
28e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
28e90 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
28ea0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28eb0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28ec0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28ed0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28f00 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76  name4", zRelativ
28f10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
28f20 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28f30 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
28f40 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
28f50 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
28f60 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
28f70 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
28f80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
28f90 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
28fa0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
28fb0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
28fc0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
28fd0 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
28fe0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28ff0 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
29000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29010 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
29020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
29030 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
29040 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
29050 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
29060 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
29070 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
29080 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
29090 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
290a0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
290b0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
290c0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
290d0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
290e0 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
290f0 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
29100 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
29110 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
29120 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
29130 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66  ANDLE h;.#if def
29140 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
29150 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70  .  int nFull = p
29160 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
29170 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  1;.  char *zFull
29180 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
29190 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20  Zero( nFull );. 
291a0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
291b0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75  d = 0;.  if( zFu
291c0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ll==0 ){.    OST
291d0 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
291e0 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
291f0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
29200 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
29210 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29220 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  if( winFullPathn
29230 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
29240 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c  ame, nFull, zFul
29250 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  l)!=SQLITE_OK ){
29260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29270 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53  e(zFull);.    OS
29280 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
29290 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
292a0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
292b0 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
292c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
292d0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
292e0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
292f0 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b  Filename(zFull);
29300 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
29310 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  zFull);.#else.  
29320 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
29330 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
29340 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
29350 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
29360 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29370 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  s);.#endif.  if(
29380 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
29390 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
293a0 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
293b0 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
293c0 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
293d0 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
293e0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  0;.  }.  if( osI
293f0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
29400 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
29410 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
29420 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
29430 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
29440 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
29450 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
29460 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
29470 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
29480 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
29490 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
294a0 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
294b0 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
294c0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
294d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
294e0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
294f0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
29500 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29510 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20  , (void*)h));.  
29520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
29530 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
29540 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
29550 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
29560 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
29570 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
29580 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
29590 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
295a0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
295b0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
295c0 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
295d0 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
295e0 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
295f0 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
29600 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
29610 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
29620 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
29630 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63  {.  FARPROC proc
29640 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29650 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72  ETER(pVfs);.  pr
29660 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64  oc = osGetProcAd
29670 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
29680 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52  H, zSym);.  OSTR
29690 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64  ACE(("DLSYM hand
296a0 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73  le=%p, symbol=%s
296b0 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c  , address=%p\n",
296c0 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
296d0 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f  d*)pH, zSym, (vo
296e0 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65  id*)proc));.  re
296f0 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
29700 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74  id))proc;.}.stat
29710 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
29720 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
29730 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
29740 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
29750 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
29760 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
29770 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
29780 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
29790 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c  CLOSE handle=%p\
297a0 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64  n", (void*)pHand
297b0 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  le));.}.#else /*
297c0 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
297d0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
297e0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
297f0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
29800 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
29810 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
29820 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
29830 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
29840 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
29850 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
29860 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
29870 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
29880 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
29890 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
298a0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
298b0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
298c0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
298d0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
298e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
298f0 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
29900 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
29910 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
29920 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
29930 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
29940 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
29950 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
29960 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
29970 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
29980 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
29990 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
299a0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
299b0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
299c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
299d0 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
299e0 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
299f0 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
29a00 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
29a10 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
29a20 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
29a30 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
29a40 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
29a50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
29a60 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f  INRT.  if( sizeo
29a70 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42  f(ULONGLONG)<=nB
29a80 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e  uf-n ){.    ULON
29a90 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
29aa0 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
29ab0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
29ac0 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
29ad0 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
29ae0 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
29af0 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73   }.#else.  if( s
29b00 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
29b10 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
29b20 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
29b30 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
29b40 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29b50 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
29b60 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
29b70 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  of(cnt);.  }.#en
29b80 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  dif.  if( sizeof
29b90 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
29ba0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
29bb0 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
29bc0 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
29bd0 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
29be0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
29bf0 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
29c00 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
29c10 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
29c20 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
29c30 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
29c40 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
29c50 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
29c60 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
29c70 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
29c80 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
29c90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29ca0 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
29cb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  {.  sqlite3_win3
29cc0 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  2_sleep((microse
29cd0 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
29ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29cf0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
29d00 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
29d10 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
29d20 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
29d30 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
29d40 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
29d50 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
29d60 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
29d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
29d80 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
29d90 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
29da0 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
29db0 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
29dc0 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
29dd0 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
29de0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
29df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
29e00 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
29e10 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
29e20 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
29e30 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
29e40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
29e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
29e60 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
29e70 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
29e80 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
29e90 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
29ea0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
29eb0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
29ec0 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
29ed0 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
29ee0 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
29ef0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
29f00 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
29f10 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
29f20 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
29f30 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
29f40 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
29f50 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
29f60 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
29f70 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
29f80 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
29f90 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
29fa0 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
29fb0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
29fc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
29fd0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
29fe0 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
29ff0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2a000 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2a010 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2a020 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
2a030 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2a040 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
2a050 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
2a060 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
2a070 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
2a080 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
2a090 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
2a0a0 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
2a0b0 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
2a0c0 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
2a0d0 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49  . .  */.  FILETI
2a0e0 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20  ME ft;.  static 
2a0f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2a100 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  t64 winFiletimeE
2a110 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a  poch = 23058135*
2a120 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
2a130 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  640000;.#ifdef S
2a140 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
2a150 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2a160 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
2a170 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
2a180 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
2a190 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  000;.#endif.  /*
2a1a0 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64   2^32 - to avoid
2a1b0 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77   use of LL and w
2a1c0 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a  arnings in gcc *
2a1d0 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
2a1e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
2a1f0 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a  ax32BitValue = .
2a200 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2a210 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
2a220 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
2a230 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20  )2000000000 +.  
2a240 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2a250 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
2a260 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2a270 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
2a280 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
2a290 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
2a2a0 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
2a2b0 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
2a2c0 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
2a2d0 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
2a2e0 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
2a2f0 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
2a300 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
2a310 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a320 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
2a330 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
2a340 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
2a350 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
2a360 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2a370 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
2a380 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
2a390 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
2a3a0 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
2a3b0 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
2a3c0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2a3d0 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
2a3e0 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
2a3f0 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
2a400 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2a410 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
2a420 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
2a430 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
2a440 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
2a450 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2a460 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
2a470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
2a480 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2a490 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
2a4a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2a4b0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
2a4c0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
2a4d0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
2a4e0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
2a4f0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
2a500 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2a510 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2a520 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
2a530 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
2a540 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
2a550 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
2a560 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
2a570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2a580 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
2a590 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2a5a0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
2a5b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
2a5c0 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
2a5d0 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
2a5e0 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
2a5f0 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
2a600 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
2a610 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
2a620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a630 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
2a640 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
2a650 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
2a660 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
2a670 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
2a680 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
2a690 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
2a6a0 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
2a6b0 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
2a6c0 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
2a6d0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
2a6e0 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
2a6f0 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
2a700 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
2a710 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
2a720 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
2a730 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
2a740 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
2a750 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
2a760 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
2a770 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
2a780 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
2a790 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
2a7a0 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
2a7b0 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
2a7c0 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
2a7d0 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
2a7e0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
2a7f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2a800 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2a810 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
2a820 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
2a830 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
2a840 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
2a850 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2a860 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
2a870 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
2a880 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2a890 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
2a8a0 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
2a8b0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
2a8c0 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
2a8d0 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
2a8e0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
2a8f0 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
2a900 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
2a910 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
2a920 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
2a930 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
2a940 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2a950 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
2a960 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
2a970 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
2a980 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
2a990 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
2a9a0 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
2a9b0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
2a9c0 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
2a9d0 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
2a9e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
2a9f0 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
2aa00 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
2aa10 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2aa20 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2aa30 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
2aa40 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
2aa50 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
2aa60 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
2aa70 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
2aa80 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
2aa90 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
2aaa0 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
2aab0 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
2aac0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
2aad0 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
2aae0 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
2aaf0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
2ab00 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
2ab10 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
2ab20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
2ab30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2ab40 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
2ab50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ab60 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2ab70 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
2ab80 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2ab90 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47  );.  return winG
2aba0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
2abb0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2abc0 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a   nBuf, zBuf);.}.
2abd0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2abe0 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
2abf0 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
2ac00 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
2ac10 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2ac20 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
2ac30 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2ac40 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
2ac50 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
2ac60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2ac70 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
2ac80 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
2ac90 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
2aca0 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33  .    SQLITE_WIN3
2acb0 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
2acc0 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20  , /* mxPathname 
2acd0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2acf0 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
2ad00 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  32",            
2ad10 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2ad20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ad30 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2ad40 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
2ad50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ad60 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69   xOpen */.    wi
2ad70 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  nDelete,        
2ad80 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
2ad90 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
2ada0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
2adb0 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46  cess */.    winF
2adc0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
2add0 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
2ade0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
2adf0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
2ae00 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
2ae10 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  winDlError,     
2ae20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
2ae30 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
2ae40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ae50 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2ae60 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2ae70 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
2ae80 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
2ae90 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52  ess,       /* xR
2aea0 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
2aeb0 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20   winSleep,      
2aec0 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
2aed0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2aee0 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
2aef0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
2af00 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72     winGetLastErr
2af10 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  or,     /* xGetL
2af20 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
2af30 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2af40 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74  t64, /* xCurrent
2af50 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20  TimeInt64 */.   
2af60 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
2af70 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73  l,    /* xSetSys
2af80 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2af90 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inGetSystemCall,
2afa0 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2afb0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2afc0 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2afd0 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
2afe0 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66  Call */.  };.#if
2aff0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b000 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b010 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
2b020 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68  _vfs winLongPath
2b030 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2b060 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2b070 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
2b080 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49  File */.    SQLI
2b090 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
2b0a0 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61  H_BYTES, /* mxPa
2b0b0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2b0e0 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61     "win32-longpa
2b0f0 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65  th",    /* zName
2b100 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b120 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
2b130 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
2b140 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2b150 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2b160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2b170 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
2b180 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
2b190 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2b1a0 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2b1b0 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
2b1c0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2b1d0 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2b1e0 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
2b1f0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
2b200 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
2b210 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
2b220 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
2b230 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
2b240 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
2b250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b260 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2b270 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2b280 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2b290 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2b2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b2b0 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
2b2c0 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
2b2d0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2b2e0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2b2f0 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
2b300 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2b310 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2b320 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
2b330 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2b340 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
2b350 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2b360 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
2b370 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
2b380 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
2b390 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
2b3a0 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
2b3b0 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
2b3c0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2b3d0 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   };.#endif..  /*
2b3e0 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68   Double-check th
2b3f0 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b  at the aSyscall[
2b400 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e  ] array has been
2b410 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
2b420 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65  * correctly.  Se
2b430 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36  e ticket [bb3a86
2b440 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a  e890c8e96ab] */.
2b450 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
2b460 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37  ize(aSyscall)==7
2b470 37 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d  7 );..  /* get m
2b480 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61  emory map alloca
2b490 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79  tion granularity
2b4a0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69   */.  memset(&wi
2b4b0 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  nSysInfo, 0, siz
2b4c0 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29  eof(SYSTEM_INFO)
2b4d0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
2b4e0 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61  _WINRT.  osGetNa
2b4f0 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26  tiveSystemInfo(&
2b500 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c  winSysInfo);.#el
2b510 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
2b520 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
2b530 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
2b540 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  rt( winSysInfo.d
2b550 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
2b560 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73  larity>0 );.  as
2b570 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
2b580 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b  .dwPageSize>0 );
2b590 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
2b5a0 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73  register(&winVfs
2b5b0 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  , 1);..#if defin
2b5c0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2b5d0 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69  HAS_WIDE).  sqli
2b5e0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2b5f0 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  (&winLongPathVfs
2b600 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  , 0);.#endif..  
2b610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b620 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ; .}..int sqlite
2b630 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
2b640 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2b650 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70  INRT.  if( sleep
2b660 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj!=NULL ){.   
2b670 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73   osCloseHandle(s
2b680 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c  leepObj);.    sl
2b690 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  eepObj = NULL;. 
2b6a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2b6b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b6c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2b6d0 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a              E_OS_WIN */.