/ Hex Artifact Content
Login

Artifact 3cf34661f5ef47be81bb7be541582d6e14852159:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 62 50 65 72 73 69 73 74 57 61 6c    u8 bPersistWal
0790: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
07a0: 65 20 74 6f 20 70 65 72 73 69 73 74 20 57 41 4c  e to persist WAL
07b0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 44 57 4f 52   files */.  DWOR
07c0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
07d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
07e0: 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
07f0: 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
0800: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 73 65 63 74   */.  DWORD sect
0810: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  orSize;       /*
0820: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   Sector size of 
0830: 74 68 65 20 64 65 76 69 63 65 20 66 69 6c 65 20  the device file 
0840: 69 73 20 6f 6e 20 2a 2f 0a 20 20 77 69 6e 53 68  is on */.  winSh
0850: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
0860: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
0870: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
0880: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
0890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
08a0: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c  ath;      /* Ful
08b0: 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
08c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
08d0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
08e0: 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69       /* Chunk si
08f0: 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ze configured by
0900: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
0910: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
0920: 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54  OS_WINCE.  LPWST
0930: 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  R zDeleteOnClose
0940: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69  ;  /* Name of fi
0950: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65  le to delete whe
0960: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48  n closing */.  H
0970: 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20  ANDLE hMutex;   
0980: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
0990: 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
09a0: 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64  access to shared
09b0: 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e   lock */  .  HAN
09c0: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
09d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
09e0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
09f0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
0a00: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
0a10: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
0a20: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
0a30: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
0a40: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
0a50: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
0a60: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
0a70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
0a80: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
0a90: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a    */.#endif.};..
0aa0: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
0ab0: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
0ac0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
0ad0: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
0ae0: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
0af0: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
0b00: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
0b10: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
0b20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0b30: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
0b40: 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20  . * The initial 
0b50: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0b60: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0b70: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0b80: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0ba0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
0bb0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
0bc0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
0bd0: 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45  IT_SIZE ((SQLITE
0be0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
0bf0: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20  IZE) * \.       
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
0c30: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39  PAGE_SIZE) + 419
0c40: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
0c50: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  . * The maximum 
0c60: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0c70: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0c80: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0c90: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0cb0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0cc0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0cd0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
0ce0: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69  _SIZE  (0).#endi
0cf0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74  f../*. * The ext
0d00: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20  ra flags to use 
0d10: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  in calls to the 
0d20: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e  Win32 heap APIs.
0d30: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0d40: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20   be. * zero for 
0d50: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
0d60: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  vior.. */.#ifnde
0d70: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
0d80: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66  EAP_FLAGS.#  def
0d90: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0da0: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20  _HEAP_FLAGS     
0db0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (0).#endif../*.*
0dc0: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
0dd0: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
0de0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
0df0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
0e00: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
0e10: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
0e20: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
0e30: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
0e40: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
0e50: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
0e60: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
0e70: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0e80: 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20    u32 magic;    
0e90: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
0ea0: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
0eb0: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
0ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
0ed0: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
0ee0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
0ef0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
0f00: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
0f10: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
0f20: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
0f30: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
0f40: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
0f50: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
0f60: 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32  M_MAGIC     0x42
0f70: 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73  b2830b.#endif..s
0f80: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
0f90: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
0fa0: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
0fb0: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
0fc0: 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20  _MAGIC,.#endif. 
0fd0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a   NULL, FALSE.};.
0fe0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
1000: 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65  sertMagic() asse
1010: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  rt( win_mem_data
1020: 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  .magic==WINMEM_M
1030: 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65  AGIC ).#else.#de
1040: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
1050: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
1060: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
1070: 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d  etHeap() win_mem
1080: 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61  _data.hHeap..sta
1090: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
10a0: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
10b0: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
10c0: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
10d0: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63  *pPrior);.static
10e0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
10f0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
1100: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  r, int nBytes);.
1110: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1120: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a  mSize(void *p);.
1130: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1140: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b  mRoundup(int n);
1150: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1160: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
1170: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76  pData);.static v
1180: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
1190: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
11a0: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74  a);..const sqlit
11b0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
11c0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
11d0: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66  32(void);.#endif
11e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
11f0: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
1200: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74  * Forward protot
1210: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ypes..*/.static 
1220: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a  int getSectorSiz
1230: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e(.    sqlite3_v
1240: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f  fs *pVfs,.    co
1250: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
1260: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38  ive     /* UTF-8
1270: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b   file name */.);
1280: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1290: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
12a0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
12b0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
12c0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
12d0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
12e0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
12f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1300: 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57  is Win9x.** or W
1310: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
1320: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1330: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1340: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1350: 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a  tem is Win9x..**
1360: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1370: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1380: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1390: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
13a0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
13b0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
13c0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
13d0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
13e0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
13f0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
1400: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
1410: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1420: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1430: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1440: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1450: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1460: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  ndif../*.** Many
1470: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
1480: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
1490: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
14a0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
14b0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
14c0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
14d0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
14e0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
14f0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
1500: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
1510: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
1520: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
1530: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
1540: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
1550: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
1560: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 23  stem calls..*/.#
1570: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1580: 4e 43 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NCE.#  define SQ
1590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
15a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
15b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
15d0: 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  NT.#  define SQL
15e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
15f0: 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  DE.#endif..#ifnd
1600: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
1610: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
1620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
1630: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a  ITE_OS_WINCE./*.
1650: 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20  ** These macros 
1660: 61 72 65 20 6e 65 63 65 73 73 61 72 79 20 62 65  are necessary be
1670: 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20 43 45  cause Windows CE
1680: 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76 65   does not native
1690: 6c 79 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a  ly support the.*
16a0: 2a 20 57 69 6e 33 32 20 41 50 49 73 20 4c 6f 63  * Win32 APIs Loc
16b0: 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46 69 6c  kFile, UnlockFil
16c0: 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45  e, and LockFileE
16d0: 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e  x.. */..#  defin
16e0: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63  e LockFile(a,b,c
16f0: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63  ,d,e)       winc
1700: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c  eLockFile(&a, b,
1710: 20 63 2c 20 64 2c 20 65 29 0a 23 20 20 64 65 66   c, d, e).#  def
1720: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61  ine UnlockFile(a
1730: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69  ,b,c,d,e)     wi
1740: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61  nceUnlockFile(&a
1750: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20  , b, c, d, e).# 
1760: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
1770: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
1780: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45    winceLockFileE
1790: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  x(&a, b, c, d, e
17a0: 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  , f)../*.** Thes
17b0: 65 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61  e are the specia
17c0: 6c 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20  l syscall hacks 
17d0: 66 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20  for Windows CE. 
17e0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c   The locking rel
17f0: 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65 73 20  ated.** defines 
1800: 68 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68  here refer to th
1810: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64  e macros defined
1820: 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20 2a 2f   just above.. */
1830: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  ..#  define osAr
1840: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1850: 20 20 20 20 20 20 31 0a 23 20 20 64 65 66 69 6e        1.#  defin
1860: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 20 20 20  e osLockFile    
1870: 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b              Lock
1880: 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f  File.#  define o
1890: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20 20 20 20  sUnlockFile     
18a0: 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46           UnlockF
18b0: 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  ile.#  define os
18c0: 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20 20 20 20  LockFileEx      
18d0: 20 20 20 20 20 20 20 20 4c 6f 63 6b 46 69 6c 65          LockFile
18e0: 45 78 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  Ex.#endif..stati
18f0: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
1900: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
1910: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
1920: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1930: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
1940: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
1950: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
1960: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
1970: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
1980: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
1990: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
19a0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
19b0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
19c0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
19d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
19e0: 49 4e 43 45 0a 20 20 7b 20 22 41 72 65 46 69 6c  INCE.  { "AreFil
19f0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
1a00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
1a10: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
1a20: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
1a30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1a40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1a50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1a60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1a70: 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ).#else.  { "Are
1a80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1a90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1aa0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1ab0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1ac0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1ad0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
1ae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1af0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
1b00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1b10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1b20: 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20  ALL)CharLowerW, 
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61  ,.#else.  { "Cha
1b50: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
1b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1b70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1b90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
1ba0: 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57  CharLowerW ((LPW
1bb0: 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57  STR(WINAPI*)(LPW
1bc0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  STR))aSyscall[1]
1bd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
1be0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1bf0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1c00: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1c10: 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  ).  { "CharUpper
1c20: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1c30: 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70   (SYSCALL)CharUp
1c40: 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20  perW,           
1c50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
1c60: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1c80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1ca0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
1cb0: 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57  ine osCharUpperW
1cc0: 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49   ((LPWSTR(WINAPI
1cd0: 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63  *)(LPWSTR))aSysc
1ce0: 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29  all[2].pCurrent)
1cf0: 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64  ..  { "CloseHand
1d00: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
1d10: 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48   (SYSCALL)CloseH
1d20: 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20  andle,          
1d30: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
1d40: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28   osCloseHandle (
1d50: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
1d60: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
1d70: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
1d80: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d90: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1da0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1db0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
1dc0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
1dd0: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
1de0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1df0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1e10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1e30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1e40: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41  ne osCreateFileA
1e50: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
1e60: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
1e70: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
1e80: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
1e90: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
1ea0: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
1eb0: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
1ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1ee0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
1ef0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
1f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
1f10: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  ateFileW,       
1f20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
1f30: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1f40: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
1f80: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
1f90: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ileW ((HANDLE(WI
1fa0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
1fb0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
1fc0: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
1fd0: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
1fe0: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
1ff0: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 72 65 61  rent)..  { "Crea
2010: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 22 2c 20  teFileMapping", 
2020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2030: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2040: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ,       0 },..#d
2050: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
2060: 6c 65 4d 61 70 70 69 6e 67 20 28 28 48 41 4e 44  leMapping ((HAND
2070: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
2080: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
2090: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
20a0: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
20b0: 44 57 4f 52 44 2c 4c 50 43 54 53 54 52 29 29 61  DWORD,LPCTSTR))a
20c0: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
20d0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
20e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
20f0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72  AS_WIDE).  { "Cr
2100: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
2110: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
2120: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
2130: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
2140: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
2150: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2160: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2190: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
21a0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
21b0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
21c0: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
21d0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
21e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
21f0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
2200: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
2210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2220: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2230: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2240: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
2250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
2260: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
2270: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
2280: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2290: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
22a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
22b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
22d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
22e0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
22f0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2300: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
2310: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
2320: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
2330: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2340: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2350: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2360: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2370: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
2380: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2390: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
23b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
23c0: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
23d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
23e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2400: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
2410: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
2420: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
2430: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
2440: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2460: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
2470: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
2480: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2490: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
24b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
24c0: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
24d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
24e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
24f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2500: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2510: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
2520: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
2530: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
2540: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
2550: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2560: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
2570: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
2580: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
2590: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
25a0: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
25b0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
25c0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
25d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
25f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2600: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
2610: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
2620: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
2630: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
2640: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
2650: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
2660: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2670: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2680: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
2690: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
26a0: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
26b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
26c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
26d0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
26e0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
26f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2710: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2720: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
2730: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
2740: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2750: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2760: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
2770: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
2780: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2790: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
27a0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
27b0: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
27c0: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
27d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
27e0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
27f0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
2800: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
2810: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2830: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2840: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2850: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
2860: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
2870: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
2880: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2890: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
28a0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
28b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
28d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
28e0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
28f0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
2900: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
2910: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
2920: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2930: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2940: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
2950: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2960: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2970: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
2980: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
2990: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
29a0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
29b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
29c0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
29d0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
29e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2a10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
2a20: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
2a30: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
2a40: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
2a50: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
2a60: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
2a70: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2a80: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
2a90: 0a 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ..  { "FreeLibra
2aa0: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
2ab0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
2ac0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
2ad0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2ae0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
2af0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
2b00: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
2b10: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
2b20: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
2b30: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
2b40: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
2b50: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
2b60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2b70: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2b80: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
2b90: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
2ba0: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
2bb0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
2bc0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
2bd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2be0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2bf0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2c00: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
2c10: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
2c20: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
2c30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
2c40: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2c50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2c80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
2c90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2ca0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2cb0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
2cc0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
2cd0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
2ce0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
2cf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2d00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2d10: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2d20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2d30: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
2d40: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
2d50: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
2d60: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
2d70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2d80: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
2d90: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
2da0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2dd0: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
2de0: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
2df0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
2e00: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
2e10: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
2e20: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
2e30: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
2e40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2e50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2e60: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
2e70: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
2e80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2ea0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
2eb0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
2ec0: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
2ed0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2f00: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
2f10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
2f20: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2f30: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
2f40: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
2f50: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2f60: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2f70: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
2f80: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
2f90: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
2fa0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
2fb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2fc0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2fd0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
2fe0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3010: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
3020: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
3030: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
3040: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
3050: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3070: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3080: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3090: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
30a0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
30b0: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
30c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
30d0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
30e0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
30f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3110: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3120: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
3130: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
3140: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
3150: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
3160: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
3170: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
3180: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
3190: 0a 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  ..  { "GetFileSi
31a0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
31b0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
31c0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
31d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
31e0: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
31f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3200: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
3210: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
3220: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3230: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3240: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3250: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3260: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3270: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
3280: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
3290: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
32a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
32b0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
32c0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
32d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
32f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3300: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
3310: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
3320: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
3330: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
3340: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
3350: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
3360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3370: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3380: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3390: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
33a0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
33b0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
33c0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
33d0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
33e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
33f0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
3400: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3430: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3440: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
3450: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3460: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
3470: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
3480: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
3490: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
34a0: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
34b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
34c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
34d0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
34e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
34f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
3500: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3510: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
3520: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3530: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3540: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
3550: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
3560: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
3570: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
3580: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
3590: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
35a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
35b0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
35c0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
35d0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
35e0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
35f0: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
3600: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
3610: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
3620: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
3630: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
3640: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
3650: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
3660: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
3670: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
3680: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
3690: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
36a0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
36b0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
36c0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
36d0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
36e0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
36f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3700: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
3710: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
3720: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49  SCALL)GetSystemI
3730: 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30  nfo,           0
3740: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3750: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
3760: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
3770: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
3780: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
3790: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
37a0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
37b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
37c0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
37d0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
37e0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
37f0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
3800: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
3810: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
3820: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3830: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
3840: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
3850: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
3860: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
3870: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
3880: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3890: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
38a0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
38b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
38c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
38d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
38e0: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
38f0: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
3900: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
3910: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
3920: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
3930: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3940: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3950: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3960: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
3970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3980: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
3990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
39a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
39b0: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
39c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
39d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
39e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
39f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3a00: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
3a10: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
3a20: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
3a30: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
3a40: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
3a50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3a60: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
3a70: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
3a80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3a90: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
3aa0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3ab0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
3ac0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3ad0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3af0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3b00: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
3b10: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
3b20: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
3b30: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
3b40: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3b50: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
3b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3b70: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
3b80: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
3b90: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3ba0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
3bb0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
3bc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
3bd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3be0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3bf0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3c00: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
3c10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
3c20: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
3c30: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
3c40: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3c50: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
3c60: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3c70: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3c80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3ca0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
3cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3cc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
3cd0: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
3ce0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
3cf0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
3d00: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
3d10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3d20: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
3d30: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3d40: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
3d50: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
3d60: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
3d70: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
3d80: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
3d90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3da0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
3db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3dc0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
3dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3de0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
3df0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
3e00: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
3e10: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
3e20: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
3e30: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [36].pCurrent)..
3e40: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
3e50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3e60: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
3e70: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
3e80: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3e90: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
3ea0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3eb0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  DLE))aSyscall[37
3ec0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ed0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3ef0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
3f20: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
3f30: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
3f40: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
3f50: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
3f60: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
3f70: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
3f80: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
3f90: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
3fa0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3fb0: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
3fc0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
3fd0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
3fe0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
3ff0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4000: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
4010: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
4020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4030: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
4040: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
4050: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4060: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
4070: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
4080: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
4090: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
40a0: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
40b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
40c0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
40d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
40e0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
40f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4100: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
4110: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
4120: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4130: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
4140: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
4150: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4160: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4170: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4180: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4190: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
41a0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
41b0: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
41c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
41d0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
41f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4210: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4220: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
4230: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
4240: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
4250: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
4260: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
4270: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4280: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61  S_WIDE).  { "Loa
4290: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
42a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42b0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
42c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
42d0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
42e0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
42f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4320: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
4330: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
4340: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
4350: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33  STR))aSyscall[43
4360: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4370: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
4380: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4390: 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20  CALL)LocalFree, 
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
43b0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  },..#define osLo
43c0: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
43d0: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
43e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
43f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
4410: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4430: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4460: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
4470: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4480: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
4490: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
44a0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  RD))aSyscall[45]
44b0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65  .pCurrent).#else
44c0: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4510: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4520: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
4530: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
4540: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4550: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
4560: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4570: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20  ne osLockFileEx 
4580: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4590: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
45a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
45b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
45c0: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
45d0: 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [46].pCurrent).#
45e0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
45f0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
4600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4630: 66 0a 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  f..  { "MapViewO
4640: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
4650: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
4660: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
4670: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4680: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
4690: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
46a0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
46b0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
46c0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
46d0: 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75  aSyscall[47].pCu
46e0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
46f0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
4700: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
4710: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
4720: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
4730: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
4740: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
4750: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
4760: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
4770: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
4780: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
4790: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
47a0: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
47b0: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
47c0: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
47d0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
47e0: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
47f0: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
4800: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
4810: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
4820: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
4830: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  ER*))aSyscall[49
4840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4850: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4870: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4890: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
48a0: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
48b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
48c0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
48d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
48e0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
48f0: 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e  call[50].pCurren
4900: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
4910: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
4920: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
4930: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
4940: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4950: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
4960: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4970: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
4980: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
4990: 0a 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  ..  { "SetFilePo
49a0: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
49b0: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
49c0: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
49d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
49e0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
49f0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
4a00: 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50  *)(HANDLE,LONG,P
4a10: 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20  LONG, \.        
4a20: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4a30: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  52].pCurrent).. 
4a40: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4a60: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20  YSCALL)Sleep,   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4a90: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
4aa0: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
4ab0: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65  scall[53].pCurre
4ac0: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
4ad0: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
4ae0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
4af0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
4b00: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
4b10: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
4b20: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
4b30: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
4b40: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
4b50: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
4b60: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  ME))aSyscall[54]
4b70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4b80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4b90: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
4ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4bb0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
4bc0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
4bd0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4be0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
4bf0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4c00: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
4c10: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4c20: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
4c30: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
4c40: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
4c50: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
4c60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4c90: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
4ca0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
4cb0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4cc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4cd0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
4ce0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4cf0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
4d00: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
4d10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4d20: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
4d30: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
4d40: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
4d50: 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [56].pCurrent).#
4d60: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
4d70: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
4d80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4db0: 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  f..  { "UnmapVie
4dc0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
4dd0: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
4de0: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
4df0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4e00: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
4e10: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4e20: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
4e30: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65  scall[57].pCurre
4e40: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
4e50: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
4e60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
4e70: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
4e80: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4e90: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
4ea0: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
4eb0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
4ec0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
4ed0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
4ee0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
4ef0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d  OL))aSyscall[58]
4f00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4f10: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
4f20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4f30: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f50: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
4f60: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
4f70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
4f80: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
4f90: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4fa0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
4fb0: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
4fc0: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
4fd0: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
4fe0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
4ff0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
5000: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
5010: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
5020: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
5030: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
5040: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52  win32" VFSes.  R
5050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5060: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
5070: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
5080: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
5090: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
50a0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
50b0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
50c0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
50d0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
50e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
50f0: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
5100: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
5110: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
5120: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
5130: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
5140: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5150: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
5160: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
5170: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
5180: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
5190: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
51a0: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
51b0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
51c0: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
51d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
51e0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
51f0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
5200: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
5210: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
5220: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
5230: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
5240: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
5250: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
5260: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
5270: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
5280: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
5290: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
52a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
52b0: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
52c0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
52d0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
52e0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
52f0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
5300: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
5310: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
5320: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
5330: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5340: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
5350: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5360: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
5370: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
5380: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
5390: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
53a0: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
53b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
53c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
53d0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
53e0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
53f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
5400: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5410: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
5420: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5440: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
5450: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
5460: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
5470: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54a0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
54b0: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
54c0: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
54d0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
54e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
54f0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
5500: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
5510: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5540: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
5550: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
5560: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
5570: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
5580: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
5590: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
55a0: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
55b0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
55c0: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
55d0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
55e0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
55f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5600: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d  ptr winGetSystem
5610: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
5620: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
5630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5640: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
5650: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
5660: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
5670: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
5680: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
5690: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
56a0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
56b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
56c0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
56d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
56e0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
56f0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
5700: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5710: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5720: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
5730: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
5740: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
5750: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
5760: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
5770: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
5780: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
5790: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
57a0: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
57b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
57c0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
57d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
57e0: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
57f0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
5800: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78  nst char *winNex
5810: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
5820: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
5830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5840: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
5850: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5860: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
5870: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
5880: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
5890: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
58a0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
58b0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
58c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
58d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
58e0: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
58f0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
5900: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
5910: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
5920: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
5930: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
5940: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
5950: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5960: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
5970: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
5980: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
5990: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
59a0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
59b0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
59c0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
59d0: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
59e0: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
59f0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
5a00: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
5a10: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
5a20: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
5a30: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
5a40: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
5a50: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
5a60: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
5a70: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
5a80: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
5a90: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
5aa0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
5ab0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
5ac0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
5ad0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
5ae0: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
5af0: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
5b00: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
5b10: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
5b20: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
5b30: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
5b40: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
5b50: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
5b60: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
5b70: 45 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28  E.# define isNT(
5b80: 29 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73  )  (1).#else.  s
5b90: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76  tatic int isNT(v
5ba0: 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71  oid){.    if( sq
5bb0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30  lite3_os_type==0
5bc0: 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53   ){.      OSVERS
5bd0: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a  IONINFOA sInfo;.
5be0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53        sInfo.dwOS
5bf0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
5c00: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
5c10: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73  .      osGetVers
5c20: 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a  ionExA(&sInfo);.
5c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73        sqlite3_os
5c40: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  _type = sInfo.dw
5c50: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
5c60: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
5c70: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d  T ? 2 : 1;.    }
5c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5c90: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a  te3_os_type==2;.
5ca0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5cb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
5cc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5cd0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
5ce0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
5cf0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
5d00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
5d10: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
5d20: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
5d30: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
5d40: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
5d50: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
5d60: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
5d70: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
5d80: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
5d90: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
5da0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
5db0: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
5dc0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
5dd0: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72  VALIDATE.  asser
5de0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
5df0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
5e00: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
5e10: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
5e20: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
5e30: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
5e40: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
5e50: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
5e60: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
5e70: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
5e80: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
5e90: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
5ea0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
5eb0: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
5ec0: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
5ed0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
5ee0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47       nBytes, osG
5ef0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
5f00: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
5f10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
5f20: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
5f30: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
5f40: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
5f50: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48  id *pPrior){.  H
5f60: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
5f70: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
5f80: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
5f90: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
5fa0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
5fb0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5fc0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
5fd0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
5fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
5ff0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
6000: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  TE.  assert ( os
6010: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
6020: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6030: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
6040: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
6050: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72   if( !pPrior ) r
6060: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e  eturn; /* Passin
6070: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72  g NULL to HeapFr
6080: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ee is undefined.
6090: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61   */.  if( !osHea
60a0: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c  pFree(hHeap, SQL
60b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
60c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b  LAGS, pPrior) ){
60d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
60e0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
60f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72  failed to HeapFr
6100: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ee block %p (%d)
6110: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
6120: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
6130: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
6140: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
6150: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
6160: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
6170: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
6180: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6190: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
61a0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
61b0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
61c0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
61d0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
61e0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
61f0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
6200: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
6210: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6220: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6230: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6240: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6250: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6260: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6270: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6280: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6290: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
62a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
62b0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
62c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
62d0: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
62e0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
62f0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
6300: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
6310: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6320: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
6330: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
6340: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
6350: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
6360: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6370: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
6380: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
6390: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
63a0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
63b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
63c0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
63d0: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
63e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
63f0: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
6400: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
6410: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
6420: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6430: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6440: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
6450: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
6480: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
6490: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
64a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
64b0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
64c0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
64d0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
64e0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
64f0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
6500: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
6510: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
6520: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
6530: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
6540: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
6550: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
6560: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
6570: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6580: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6590: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
65a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
65b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
65c0: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
65d0: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
65e0: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
65f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
6600: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
6610: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
6620: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
6630: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
6640: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6650: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
6660: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
6680: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6690: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
66a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
66b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
66c0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
66d0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
66e0: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
66f0: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
6700: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
6710: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
6720: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
6730: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
6740: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
6750: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
6760: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
6770: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
6780: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
6790: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
67a0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
67b0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
67c0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
67d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
67e0: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
67f0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d  nMemData->magic=
6800: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b  =WINMEM_MAGIC );
6810: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
6820: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
6830: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
6840: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
6850: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
6860: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
68a0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a  HEAP_INIT_SIZE,.
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
68e0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
68f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
6900: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
6910: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6920: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
6930: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
6940: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
6950: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75  e (%d), flags=%u
6960: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d  , initSize=%u, m
6970: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20  axSize=%u",.    
6980: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6990: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
69a0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
69b0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
69c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
69d0: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57  T_SIZE, SQLITE_W
69e0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
69f0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ZE);.      retur
6a00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6a10: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
6a20: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
6a30: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65  TRUE;.  }.  asse
6a40: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
6a50: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
6a60: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
6a70: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
6a80: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
6a90: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6aa0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
6ab0: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28  LIDATE.  assert(
6ac0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
6ad0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6ae0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6af0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
6b00: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
6b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
6b30: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
6b40: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6b50: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
6b60: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
6b70: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
6b80: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
6b90: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
6ba0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
6bb0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
6bc0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d  urn;.  if( pWinM
6bd0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
6be0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
6bf0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
6c00: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6c10: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6c20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6c30: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20  LOC_VALIDATE.   
6c40: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
6c50: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
6c60: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
6c70: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6c80: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
6c90: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
6ca0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6cb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
6cc0: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
6cd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
6ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6cf0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6d00: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6d10: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64   HeapDestroy (%d
6d20: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6d50: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
6d60: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
6d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
6d80: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6d90: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
6da0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
6db0: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
6dc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
6dd0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
6de0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
6df0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
6e00: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
6e10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6e20: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
6e30: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
6e40: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
6e50: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
6e60: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
6e70: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
6e80: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
6e90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
6ea0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
6eb0: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
6ec0: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
6ed0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
6ee0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
6ef0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
6f00: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
6f10: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
6f20: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
6f30: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
6f40: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
6f50: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
6f60: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
6f70: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
6f80: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
6f90: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
6fa0: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
6fb0: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
6fc0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
6fd0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
6fe0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
6ff0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
7000: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
7010: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
7020: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
7030: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
7040: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
7050: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
7060: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
7070: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
7080: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
7090: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
70a0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
70b0: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
70c0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
70d0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
70e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
70f0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
7100: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
7110: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
7120: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38  atic LPWSTR utf8
7130: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
7140: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
7150: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
7160: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
7170: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
7180: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
7190: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
71a0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
71b0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
71c0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
71d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
71e0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
71f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7200: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
7210: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
7220: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
7230: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
7240: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7250: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
7260: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
7270: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
7280: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
7290: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
72c0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
72d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
72e0: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
72f0: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
7300: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
7310: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
7320: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
7330: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
7340: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55  oft Unicode to U
7350: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
7360: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
7370: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
7380: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7390: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
73a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
73b0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
73c0: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
73d0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
73e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
73f0: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
7400: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
7410: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
7420: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
7430: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
7440: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7450: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
7460: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
7470: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
7480: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
7490: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
74a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
74b0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
74c0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
74d0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
74e0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
74f0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
7500: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
7530: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
7540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7550: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
7560: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
7570: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7580: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
7590: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
75a0: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
75b0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
75c0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
75d0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
75e0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
75f0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
7600: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
7610: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
7620: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
7630: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
7640: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
7650: 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e   LPWSTR mbcsToUn
7660: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
7670: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7680: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57  int nByte;.  LPW
7690: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  STR zMbcsFilenam
76a0: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
76b0: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
76c0: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
76d0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
76e0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
76f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
7700: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
7710: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a  name, -1, NULL,.
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
7750: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
7760: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7770: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c  ;.  }.  zMbcsFil
7780: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7790: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
77a0: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
77b0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
77c0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
77d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
77e0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
77f0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7800: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
7810: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
7820: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
7830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
7860: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
7870: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
7880: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
7890: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
78a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
78b0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
78c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
78d0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
78e0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
78f0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
7900: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
7910: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
7920: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
7930: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
7940: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
7950: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
7960: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
7970: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
7980: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d  char *unicodeToM
7990: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64  bcs(LPCWSTR zWid
79a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
79b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
79c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
79d0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
79e0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
79f0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
7a00: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
7a10: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7a20: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
7a30: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
7a40: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
7a50: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7a60: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
7a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
7a80: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7a90: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
7aa0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
7ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
7ad0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
7ae0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
7af0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
7b00: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
7b10: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
7b40: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7b50: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
7b60: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
7b70: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
7b80: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
7b90: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
7ba0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
7bb0: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
7bc0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
7bd0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
7be0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
7bf0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
7c00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7c10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
7c20: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
7c30: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
7c40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
7c50: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
7c60: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
7c70: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
7c80: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
7c90: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
7ca0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
7cb0: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
7cc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7cd0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
7ce0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
7cf0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
7d00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
7d10: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
7d20: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
7d30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
7d40: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
7d50: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
7d60: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
7d70: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
7d80: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
7d90: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7da0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7db0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
7dc0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
7dd0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
7de0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
7df0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
7e00: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
7e10: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
7e20: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
7e30: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
7e40: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
7e50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7e60: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
7e70: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d  bcs = unicodeToM
7e80: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
7e90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
7ea0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
7eb0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
7ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
7ed0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67  eturn value of g
7ee0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
7ef0: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
7f00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
7f10: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
7f20: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
7f30: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
7f40: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
7f50: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
7f60: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73  tatic int getLas
7f70: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
7f80: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
7f90: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
7fa0: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
7fb0: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
7fc0: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
7fd0: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
7fe0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
7ff0: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
8000: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
8010: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
8020: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
8030: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
8040: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
8050: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
8060: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
8070: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
8080: 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69    LPWSTR zTempWi
8090: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  de = NULL;.    d
80a0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
80b0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
80c0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
80d0: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
8100: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
8110: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
8140: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
8170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
8190: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20         (LPWSTR) 
81e0: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20  &zTempWide,.    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
8230: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
8240: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
8250: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
8260: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
8270: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8280: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
8290: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
82a0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
82b0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
82c0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
82d0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
82e0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
82f0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
8300: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
8310: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
8320: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
8330: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f  mpWide);.    }./
8340: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
8350: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8360: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
8370: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
8380: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
8390: 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
83a0: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
83b0: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
83c0: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
83d0: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
83e0: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
83f0: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
8400: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
8410: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
8420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8430: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
8440: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
8450: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
8460: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
8470: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
84a0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
84b0: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
84e0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
84f0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
8580: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
85d0: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
85e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
85f0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
8600: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
8610: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
8620: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
8630: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
8640: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
8650: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
8660: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
8670: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8680: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
8690: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
86a0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
86b0: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
86c0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
86d0: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
86e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
86f0: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
8700: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
8710: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
8720: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
8730: 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45  x%x (%u)", lastE
8740: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
8750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8760: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
8770: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
8780: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
8790: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
87a0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
87b0: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
87c0: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
87d0: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
87e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
87f0: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
8800: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8810: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8820: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
8830: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
8840: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
8850: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
8860: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
8870: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8880: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
8890: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
88a0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
88b0: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
88c0: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
88d0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
88e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
88f0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
8900: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
8910: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
8920: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
8930: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
8940: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61   .** FormatMessa
8950: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
8960: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
8970: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
8980: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
8990: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
89a0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
89b0: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
89c0: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
89d0: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
89e0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
89f0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
8a00: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
8a10: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
8a20: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
8a30: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
8a40: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f  and the the asso
8a50: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
8a60: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
8a70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
8a80: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
8a90: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
8aa0: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
8ab0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
8ac0: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
8ad0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
8ae0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
8af0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
8b00: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
8b10: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
8b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8b30: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
8b40: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
8b50: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
8b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8b70: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
8b80: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
8b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8ba0: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8bb0: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8bc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8bd0: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8be0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8c00: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8c10: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8c20: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8c30: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c50: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
8c60: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
8c70: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8ca0: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
8cb0: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
8cc0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
8cd0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
8ce0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
8cf0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
8d00: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
8d10: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
8d20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
8d30: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
8d40: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
8d50: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
8d60: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
8d70: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
8d80: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
8d90: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
8da0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
8db0: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
8dc0: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
8dd0: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
8de0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
8e00: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
8e10: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
8e20: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
8e30: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
8e40: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
8e50: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
8e60: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
8e70: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
8e80: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
8e90: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
8ea0: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
8eb0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
8ec0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
8ed0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
8ee0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
8ef0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
8f00: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
8f10: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
8f20: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
8f30: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
8f40: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
8f50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
8f60: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
8f70: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
8f80: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
8f90: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
8fa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
8fb0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
8fc0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
8fd0: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
8fe0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
8ff0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
9000: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
9010: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
9020: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
9030: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
9040: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
9050: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
9060: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
9070: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
9080: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
9090: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
90a0: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
90b0: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
90c0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
90d0: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
90e0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
90f0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
9100: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
9110: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
9120: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
9130: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
9140: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
9150: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
9160: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
9170: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9180: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
9190: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
91a0: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
91b0: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
91c0: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
91d0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
91e0: 20 20 20 20 6f 73 53 6c 65 65 70 28 77 69 6e 33      osSleep(win3
91f0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
9200: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
9210: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
9220: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9230: 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  }.  if( pError )
9240: 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
9250: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9260: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
9270: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
9280: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
9290: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65  atic void logIoe
92a0: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
92b0: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
92c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
92d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20  SQLITE_IOERR, . 
92e0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
92f0: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
9300: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20  ing conflict",. 
9310: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
9320: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
9330: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
9340: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
9350: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
9360: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
93b0: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
93c0: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
93d0: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  CE only..*/./*.*
93e0: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65  * Windows CE doe
93f0: 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  s not have a loc
9400: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
9410: 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a  n.  So create a.
9420: 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a  ** substitute..*
9430: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
9440: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
9450: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
9460: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
9470: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
9480: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
9490: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
94a0: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
94b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
94c0: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
94d0: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
94e0: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
94f0: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
9500: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
9510: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
9520: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
9530: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
9540: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
9550: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
9560: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
9570: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
9580: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
9590: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
95a0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
95b0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
95c0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
95d0: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
95e0: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
95f0: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
9600: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
9610: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
9620: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
9630: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
9640: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
9650: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
9660: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a    return &y;.}..
9670: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
9680: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
9690: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
96a0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
96b0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
96c0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
96d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
96e0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
96f0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
9700: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
9710: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
9720: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
9730: 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  rr = WaitForSing
9740: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
9750: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
9760: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
9770: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
9780: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
9790: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
97a0: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
97b0: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
97c0: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
97d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
97e0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
97f0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
9800: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
9810: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
9820: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
9830: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
9840: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
9850: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
9860: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65  ic BOOL winceCre
9870: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
9880: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
9890: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
98a0: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20    LPWSTR zTok;. 
98b0: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20   LPWSTR zName;. 
98c0: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
98d0: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75  UE;..  zName = u
98e0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
98f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
9900: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
9910: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
9920: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  */.    return FA
9930: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  LSE;.  }..  /* I
9940: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
9950: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
9960: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d    memset(&pFile-
9970: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  >local, 0, sizeo
9980: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
9990: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
99a0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
99b0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
99c0: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
99d0: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
99e0: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
99f0: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68  */.  zTok = osCh
9a00: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b  arLowerW(zName);
9a10: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a  .  for (;*zTok;z
9a20: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28  Tok++){.    if (
9a30: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a  *zTok == '\\') *
9a40: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a  zTok = '_';.  }.
9a50: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65  .  /* Create/ope
9a60: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65  n the named mute
9a70: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  x */.  pFile->hM
9a80: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d  utex = osCreateM
9a90: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
9aa0: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
9ab0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
9ac0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9ad0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
9ae0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
9af0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
9b00: 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e  E_ERROR, pFile->
9b10: 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63  lastErrno, "winc
9b20: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
9b30: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
9b40: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
9b50: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
9b60: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
9b70: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
9b80: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
9b90: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
9ba0: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
9bb0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
9bc0: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
9bd0: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
9be0: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
9bf0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
9c00: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
9c10: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
9c20: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
9c30: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
9c40: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
9c50: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
9c60: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
9c70: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
9c80: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
9c90: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
9ca0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
9cb0: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
9cc0: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
9cd0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
9ce0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
9d10: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
9d20: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
9d30: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9d60: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
9d70: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
9d80: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
9d90: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
9da0: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
9db0: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
9dc0: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
9dd0: 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61  */.  if (osGetLa
9de0: 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52  stError() == ERR
9df0: 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54  OR_ALREADY_EXIST
9e00: 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20  S){.    bInit = 
9e10: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  FALSE;.  }..  sq
9e20: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
9e30: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
9e40: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
9e50: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
9e60: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
9e70: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
9e80: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
9e90: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
9ea0: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
9eb0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
9ec0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
9ee0: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
9ef0: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
9f00: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
9f10: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
9f20: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
9f30: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
9f40: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
9f50: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
9f60: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68    if (!pFile->sh
9f70: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  ared){.      pFi
9f80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9f90: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9fa0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
9fb0: 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
9fc0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
9fd0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
9fe0: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
9ff0: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
a000: 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  );.      osClose
a010: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
a020: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
a030: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
a040: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
a050: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
a060: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
a070: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
a080: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
a090: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
a0a0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
a0b0: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20  d == NULL){.    
a0c0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
a0d0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
a0e0: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
a0f0: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
a100: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
a110: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
a120: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
a130: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
a140: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
a150: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
a160: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
a170: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
a180: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
a190: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
a1a0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
a1b0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
a1c0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
a1d0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
a1e0: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
a1f0: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
a200: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
a210: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
a220: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
a230: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
a240: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
a250: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
a260: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
a270: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
a280: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
a290: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
a2a0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
a2b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
a2c0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
a2d0: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
a2e0: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
a2f0: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
a300: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
a310: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
a320: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
a330: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
a340: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
a350: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
a360: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
a370: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
a380: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
a390: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
a3a0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
a3b0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
a3c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
a3d0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
a3e0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
a3f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a400: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
a410: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
a420: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
a430: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
a440: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
a450: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
a460: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
a470: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
a480: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
a490: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
a4a0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
a4b0: 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56   */.    osUnmapV
a4c0: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
a4d0: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73  >shared);.    os
a4e0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a4f0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20  e->hShared);..  
a500: 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74    /* Done with t
a510: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
a520: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
a530: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
a540: 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73  ;    .    osClos
a550: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
a560: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
a570: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
a580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
a590: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
a5a0: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
a5b0: 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  e() API of Windo
a5c0: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
a5d0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
a5e0: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45  ckFile(.  HANDLE
a5f0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
a600: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
a610: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
a620: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
a630: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
a640: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
a650: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
a660: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
a670: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
a680: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
a690: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
a6a0: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
a6b0: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
a6c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
a6d0: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
a6e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a6f0: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
a700: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
a710: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
a720: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
a730: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
a740: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
a750: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
a760: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
a770: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
a780: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
a790: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
a7a0: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
a7b0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
a7c0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
a7d0: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
a7e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
a7f0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
a800: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
a810: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
a820: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
a830: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
a840: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
a850: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
a860: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a870: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
a880: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a8a0: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
a8b0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
a8c0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
a8d0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
a8e0: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
a8f0: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
a900: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a910: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
a920: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
a930: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
a940: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
a950: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
a960: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
a970: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
a980: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
a990: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
a9a0: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
a9b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
a9c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
a9d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
a9e0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
a9f0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
aa00: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
aa10: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
aa20: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
aa30: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
aa40: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
aa50: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
aa60: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
aa70: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
aa80: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
aa90: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
aaa0: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
aab0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
aac0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
aad0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
aae0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
aaf0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
ab00: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
ab10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
ab20: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
ab30: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
ab40: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
ab50: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
ab60: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
ab70: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
ab80: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
ab90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
aba0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
abb0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
abc0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
abd0: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
abe0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
abf0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
ac00: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
ac10: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ac20: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
ac30: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
ac40: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ac50: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
ac60: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
ac70: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
ac80: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
ac90: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
aca0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
acb0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  UnlockFile(.  HA
acc0: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
acd0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
ace0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
acf0: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
ad00: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
ad10: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
ad20: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
ad30: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ad40: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
ad50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
ad60: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
ad70: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
ad80: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
ad90: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ada0: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
adb0: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
adc0: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
add0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ade0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
adf0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
ae00: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
ae10: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
ae20: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
ae30: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
ae40: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
ae50: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
ae60: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
ae70: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
ae80: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
ae90: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
aea0: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
aeb0: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
aec0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
aed0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
aee0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
aef0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
af00: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
af10: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
af20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
af30: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
af40: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
af50: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
af60: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
af70: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
af80: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
af90: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
afa0: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
afb0: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
afc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
afd0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
afe0: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
aff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
b000: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
b010: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
b020: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
b030: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
b040: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
b050: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
b060: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b070: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
b080: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
b090: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
b0a0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
b0b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
b0c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
b0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
b0e0: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
b0f0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
b100: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
b110: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
b120: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
b130: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
b140: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
b150: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b160: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
b170: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
b180: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
b190: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
b1a0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
b1b0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
b1c0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
b1d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
b1e0: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
b1f0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
b200: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
b210: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
b220: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
b230: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b240: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b250: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b260: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
b270: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
b280: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
b290: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
b2a0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
b2b0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
b2c0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
b2d0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
b2e0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
b2f0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
b300: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
b310: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
b320: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
b330: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
b340: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 57  ileEx() API of W
b350: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
b360: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
b370: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
b380: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
b390: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
b3a0: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
b3b0: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
b3c0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
b3d0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
b3e0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
b3f0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
b400: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
b410: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
b420: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
b430: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
b440: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
b450: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
b460: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
b470: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
b480: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
b490: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
b4a0: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
b4b0: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
b4c0: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
b4d0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
b4e0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
b4f0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
b500: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
b510: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b520: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
b530: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
b540: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
b550: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
b560: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
b570: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
b580: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
b590: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
b5a0: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
b5b0: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b600: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
b610: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
b620: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b670: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
b680: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
b690: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
b6a0: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
b6b0: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
b6c0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
b6d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b720: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
b730: 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
b740: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
b750: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
b760: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
b770: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
b780: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
b790: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
b7a0: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
b7b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
b7c0: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
b7d0: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
b7e0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
b7f0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b800: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
b810: 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
b820: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
b830: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
b840: 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68  eturn 0. .** Oth
b850: 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
b860: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
b870: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
b880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b890: 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46  seekWinFile(winF
b8a0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
b8b0: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
b8c0: 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  t){.  LONG upper
b8d0: 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
b8e0: 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
b8f0: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
b900: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
b910: 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b930: 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
b940: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
b950: 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
b960: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
b970: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b980: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
b990: 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
b9a0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
b9b0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
b9c0: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
b9d0: 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
b9e0: 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65  ror() */..  uppe
b9f0: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
ba00: 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
ba10: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
ba20: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
ba30: 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
ba40: 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
ba50: 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
ba60: 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
ba70: 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
ba80: 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
ba90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
baa0: 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
bab0: 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
bac0: 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
bad0: 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
bae0: 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
baf0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
bb00: 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
bb10: 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
bb20: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
bb30: 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
bb40: 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
bb50: 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
bb60: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
bb70: 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
bb80: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
bb90: 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  cured, it is als
bba0: 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
bbb0: 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
bbc0: 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
bbd0: 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
bbe0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
bbf0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
bc00: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
bc10: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
bc20: 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
bc30: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
bc40: 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
bc50: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
bc60: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
bc70: 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
bc80: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
bc90: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
bca0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
bcb0: 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
bcc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65              "see
bce0: 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65  kWinFile", pFile
bcf0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bd00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72  turn 1;.  }..  r
bd10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
bd20: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
bd30: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f  **.** It is repo
bd40: 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74  rted that an att
bd50: 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20  empt to close a 
bd60: 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d  handle might som
bd70: 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20  etimes.** fail. 
bd80: 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20   This is a very 
bd90: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73  unreasonable res
bda0: 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73  ult, but Windows
bdb0: 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a   is notorious.**
bdc0: 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61   for being unrea
bdd0: 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20  sonable so I do 
bde0: 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69  not doubt that i
bdf0: 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20  t might happen. 
be00: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65   If.** the close
be10: 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65   fails, we pause
be20: 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65   for 100 millise
be30: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67  conds and try ag
be40: 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79  ain.  As.** many
be50: 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54   as MX_CLOSE_ATT
be60: 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f  EMPT attempts to
be70: 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c   close the handl
be80: 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72  e are made befor
be90: 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61  e.** giving up a
bea0: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
beb0: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
bec0: 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  e MX_CLOSE_ATTEM
bed0: 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  PT 3.static int 
bee0: 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  winClose(sqlite3
bef0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
bf00: 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  t rc, cnt = 0;. 
bf10: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
bf20: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
bf30: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
bf40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
bf50: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
bf60: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
bf70: 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E %d\n", pFile->
bf80: 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72  h));.  do{.    r
bf90: 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
bfa0: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
bfb0: 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
bfc0: 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
bfd0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
bfe0: 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
bff0: 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
c000: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
c010: 50 54 20 26 26 20 28 6f 73 53 6c 65 65 70 28 31  PT && (osSleep(1
c020: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
c030: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
c040: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
c050: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
c060: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
c070: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
c080: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
c090: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
c0a0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
c0b0: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
c0c0: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
c0d0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
c0e0: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
c0f0: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
c100: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
c110: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
c120: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
c130: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
c140: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
c150: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
c160: 20 20 20 20 20 20 20 6f 73 53 6c 65 65 70 28 31         osSleep(1
c170: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
c180: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
c190: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
c1a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
c1b0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
c1c0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
c1d0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
c1e0: 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c  E(("CLOSE %d %s\
c1f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
c200: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
c210: 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  d"));.  OpenCoun
c220: 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72  ter(-1);.  retur
c230: 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
c240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77  .            : w
c250: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
c260: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f  E_IOERR_CLOSE, o
c270: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c290: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43             "winC
c2a0: 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lose", pFile->zP
c2b0: 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ath);.}../*.** R
c2c0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
c2d0: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
c2e0: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
c2f0: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
c300: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
c310: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
c320: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
c330: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
c340: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
c350: 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a  ic int winRead(.
c360: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
c370: 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  id,          /* 
c380: 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  File to read fro
c390: 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  m */.  void *pBu
c3a0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
c3b0: 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65    /* Write conte
c3c0: 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  nt into this buf
c3d0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  fer */.  int amt
c3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c400: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
c410: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
c420: 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f  4 offset       /
c430: 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
c440: 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a  at this offset *
c450: 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
c460: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
c470: 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
c480: 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
c490: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
c4a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c4b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
c4c0: 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
c4d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
c4e0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c500: 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
c510: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
c520: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
c530: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
c540: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
c550: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
c560: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
c570: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
c580: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
c590: 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
c5a0: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
c5b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c5c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
c5d0: 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
c5e0: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
c5f0: 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
c600: 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44 57 4f  d, 0) ){.    DWO
c610: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
c620: 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72 72    if( retryIoerr
c630: 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
c640: 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
c650: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
c660: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
c670: 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  no;.    return w
c680: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
c690: 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46  E_IOERR_READ, pF
c6a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
c6c0: 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
c6d0: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67  Path);.  }.  log
c6e0: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
c6f0: 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
c700: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
c710: 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
c720: 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
c730: 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
c740: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
c750: 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
c760: 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
c770: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c780: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
c790: 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  _READ;.  }..  re
c7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
c7c0: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
c7d0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
c7e0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c7f0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
c800: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
c810: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
c820: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
c830: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
c840: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c860: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
c870: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
c880: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
c890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c8a0: 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74  bytes to be writ
c8b0: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  ten */.  int amt
c8c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c8e0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
c8f0: 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rite */.  sqlite
c900: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
c910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
c920: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
c930: 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  e to begin writi
c940: 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ng at */.){.  in
c950: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c970: 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68   True if error h
c980: 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73 65  as occured, else
c990: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
c9a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
c9b0: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
c9c0: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
c9d0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
ca00: 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
ca10: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
ca20: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
ca30: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
ca40: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
ca50: 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
ca60: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
ca70: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
ca80: 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
ca90: 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20  RACE(("WRITE %d 
caa0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
cab0: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
cac0: 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d  ktype));..  rc =
cad0: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
cae0: 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
caf0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cb00: 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
cb10: 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
cb20: 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
cb30: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
cb40: 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
cb70: 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
cb80: 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
cb90: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
cba0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
cbb0: 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
cbc0: 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
cbd0: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
cbe0: 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
cbf0: 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
cc00: 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
cc10: 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
cc20: 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
cc30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
cc40: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
cc50: 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
cc60: 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 20  &nWrite, 0) ){. 
cc70: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
cc80: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
cc90: 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
cca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62  tinue;.        b
ccb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ccc0: 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d      if( nWrite<=
ccd0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
cce0: 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
ccf0: 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
cd00: 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
cd10: 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
cd20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cd30: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
cd40: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
cd50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
cd60: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
cd70: 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
cd80: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
cd90: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
cda0: 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
cdb0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
cdc0: 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
cdd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cde0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
cdf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
ce00: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
ce10: 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c  OERR_WRITE, pFil
ce20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
ce30: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
ce40: 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  rite", pFile->zP
ce50: 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
ce60: 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74     logIoerr(nRet
ce70: 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ry);.  }.  retur
ce80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ce90: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
cea0: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
ceb0: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
cec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ced0: 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
cee0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
cef0: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
cf00: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
cf10: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
cf20: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
cf30: 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
cf40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cf50: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
cf60: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
cf70: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
cf80: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
cf90: 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ile );..  OSTRAC
cfa0: 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E(("TRUNCATE %d 
cfb0: 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
cfc0: 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69  h, nByte));.  Si
cfd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
cfe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
cff0: 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20  R_TRUNCATE);..  
d000: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
d010: 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
d020: 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
d030: 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
d040: 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
d050: 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
d060: 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
d070: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
d080: 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
d090: 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
d0a0: 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
d0b0: 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
d0c0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
d0d0: 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
d0e0: 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
d0f0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
d100: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
d110: 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
d120: 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
d130: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
d140: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
d150: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
d160: 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
d170: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
d180: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
d190: 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
d1a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57  . */.  if( seekW
d1b0: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  inFile(pFile, nB
d1c0: 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
d1d0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
d1e0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
d1f0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
d200: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d210: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
d220: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
d230: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
d240: 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
d250: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
d260: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d270: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
d280: 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  or();.    rc = w
d290: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
d2a0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
d2b0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d2c0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d2d0: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
d2e0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
d2f0: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
d300: 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c  "TRUNCATE %d %ll
d310: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
d320: 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22  h, nByte, rc ? "
d330: 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
d340: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d360: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
d370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d380: 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
d390: 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
d3a0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
d3b0: 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
d3c0: 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
d3d0: 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
d3e0: 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
d3f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
d400: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
d410: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
d420: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
d430: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
d440: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
d450: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
d460: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
d470: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
d480: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
d490: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
d4a0: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
d4b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
d4c0: 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
d4d0: 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
d4e0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
d4f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
d500: 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
d510: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d520: 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
d530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
d540: 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
d550: 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
d560: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
d570: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
d580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
d590: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
d5a0: 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
d5b0: 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
d5c0: 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
d5d0: 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
d5e0: 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
d5f0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
d600: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
d610: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
d620: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
d630: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d640: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
d650: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
d660: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
d670: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
d680: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
d690: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
d6a0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
d6b0: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
d6c0: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
d6d0: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
d6e0: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
d6f0: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
d700: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
d710: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
d720: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
d730: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
d740: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d750: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
d760: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
d770: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
d780: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
d790: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
d7a0: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
d7b0: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
d7c0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
d7d0: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
d7e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
d7f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d800: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
d810: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
d820: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
d830: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
d840: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
d850: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
d860: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
d870: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
d880: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
d890: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
d8a0: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
d8b0: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
d8c0: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
d8d0: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
d8e0: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
d8f0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
d900: 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
d910: 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
d920: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
d930: 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
d940: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
d950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d960: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
d970: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d980: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d990: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
d9a0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
d9b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
d9c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d9d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
d9e0: 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d  winSync", pFile-
d9f0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
da00: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
da10: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
da20: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
da30: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
da40: 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
da50: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
da60: 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
da70: 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
da80: 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
da90: 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69  .  DWORD lowerBi
daa0: 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  ts;.  winFile *p
dab0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
dac0: 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
dad0: 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
dae0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
daf0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
db00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
db10: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
db20: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
db30: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
db40: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69  &upperBits);.  i
db50: 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
db60: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
db70: 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28  SIZE).     && ((
db80: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
db90: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
dba0: 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b 0a 20  O_ERROR) ).  {. 
dbb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
dbc0: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
dbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
dbe0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
dbf0: 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
dc00: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
dc10: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
dc20: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
dc30: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a  >zPath);.  }.  *
dc40: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
dc50: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
dc60: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
dc70: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53  Bits;.  return S
dc80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dc90: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
dca0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
dcb0: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
dcc0: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
dcd0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
dce0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
dcf0: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
dd00: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
dd10: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
dd20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
dd30: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
dd40: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
dd50: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
dd60: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
dd70: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
dd80: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
dd90: 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n9x or WinNT..*/
dda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
ddb0: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
ddc0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
ddd0: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
dde0: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
ddf0: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
de00: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
de10: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
de20: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
de30: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
de40: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
de50: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46   osLockFileEx(pF
de60: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45  ile->h, LOCKFILE
de70: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
de80: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
de90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41            0, SHA
dea0: 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76  RED_SIZE, 0, &ov
deb0: 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  lp);./* isNT() i
dec0: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
ded0: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
dee0: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
def0: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23   executed. .*/.#
df00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
df10: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
df20: 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73     int lk;.    s
df30: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
df40: 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
df50: 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  k);.    pFile->s
df60: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
df70: 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78  (short)((lk & 0x
df80: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
df90: 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20  D_SIZE - 1));.  
dfa0: 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69    res = osLockFi
dfb0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
dfc0: 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
dfd0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
dfe0: 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 1, 0);.#endi
dff0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 20  f.  }.  if( res 
e000: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  == 0 ){.    pFil
e010: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
e020: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
e030: 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
e040: 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65  to log a failure
e050: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a   to lock */.  }.
e060: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
e070: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
e080: 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
e090: 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c   int unlockReadL
e0a0: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
e0b0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
e0c0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
e0d0: 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  o;.  if( isNT() 
e0e0: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55  ){.    res = osU
e0f0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
e100: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
e110: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
e120: 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  , 0);./* isNT() 
e130: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
e140: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
e150: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
e160: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a  r executed. .*/.
e170: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e180: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
e190: 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f      res = osUnlo
e1a0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
e1b0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
e1c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
e1d0: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
e1e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
e1f0: 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
e200: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
e210: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
e220: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
e230: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
e240: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
e250: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
e260: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e270: 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
e280: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
e290: 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52          "unlockR
e2a0: 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
e2b0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72  >zPath);.  }.  r
e2c0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
e2d0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
e2e0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
e2f0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
e300: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
e310: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
e320: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
e330: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
e340: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
e350: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
e360: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
e370: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
e380: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
e390: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
e3a0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
e3b0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
e3c0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
e3d0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
e3e0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
e3f0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
e400: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
e410: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
e420: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
e430: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
e440: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
e450: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
e460: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
e470: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
e480: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
e490: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
e4a0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
e4b0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
e4c0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
e4d0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
e4e0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
e4f0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
e500: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
e510: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
e520: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
e530: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
e540: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
e550: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
e560: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
e570: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
e580: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e590: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
e5a0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
e5b0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
e5c0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
e5d0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
e5e0: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
e5f0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
e600: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
e610: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
e620: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
e630: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e640: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
e650: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
e660: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
e670: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
e680: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
e690: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
e6a0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e6b0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
e6c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e6d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e6e0: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
e6f0: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
e700: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
e710: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
e720: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
e730: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
e740: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
e750: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
e760: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
e770: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
e780: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
e790: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
e7a0: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
e7b0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
e7c0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
e7d0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
e7e0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
e7f0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
e800: 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
e810: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
e820: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
e830: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
e840: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
e850: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
e860: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c  cktype, pFile->l
e870: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
e880: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
e890: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
e8a0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
e8b0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
e8c0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
e8d0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
e8e0: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
e8f0: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
e900: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
e910: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
e920: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
e930: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
e940: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
e950: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
e960: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
e970: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
e980: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
e990: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e9a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
e9b0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
e9c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
e9d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
e9e0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
e9f0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
ea00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
ea10: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
ea20: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
ea30: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
ea40: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
ea50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
ea60: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
ea70: 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
ea80: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
ea90: 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
eaa0: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
eab0: 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
eac0: 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
ead0: 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
eae0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
eaf0: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
eb00: 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
eb10: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
eb20: 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
eb30: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
eb40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
eb50: 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c   if(   (pFile->l
eb60: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
eb70: 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c  ).     || (   (l
eb80: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
eb90: 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  VE_LOCK).       
eba0: 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    && (pFile->loc
ebb0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
ebc0: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
ebd0: 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
ebe0: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
ebf0: 26 26 20 28 72 65 73 20 3d 20 6f 73 4c 6f 63 6b  && (res = osLock
ec00: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
ec10: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
ec20: 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  1, 0))==0 ){.   
ec30: 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65     /* Try 3 time
ec40: 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e  s to get the pen
ec50: 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73  ding lock.  This
ec60: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f   is needed to wo
ec70: 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75  rk.      ** arou
ec80: 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73  nd problems caus
ec90: 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61  ed by indexing a
eca0: 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73  nd/or anti-virus
ecb0: 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20   software on.   
ecc0: 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79     ** Windows sy
ecd0: 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20  stems..      ** 
ece0: 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67  If you are using
ecf0: 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20   this code as a 
ed00: 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e  model for altern
ed10: 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20  ative VFSes, do 
ed20: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  not.      ** cop
ed30: 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67  y this retry log
ed40: 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63  ic.  It is a hac
ed50: 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57  k intended for W
ed60: 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20  indows only..   
ed70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52     */.      OSTR
ed80: 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20  ACE(("could not 
ed90: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  get a PENDING lo
eda0: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63  ck. cnt=%d\n", c
edb0: 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
edc0: 63 6e 74 20 29 20 6f 73 53 6c 65 65 70 28 31 29  cnt ) osSleep(1)
edd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
ede0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
edf0: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
ee00: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
ee10: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
ee20: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
ee30: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
ee40: 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
ee50: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ee60: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
ee70: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
ee80: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
ee90: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
eea0: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
eeb0: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
eec0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
eed0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
eee0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
eef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
ef00: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
ef10: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
ef20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
ef30: 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
ef40: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
ef50: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
ef60: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
ef70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
ef80: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
ef90: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
efa0: 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c   res = osLockFil
efb0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
efc0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
efd0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
efe0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
eff0: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
f000: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
f010: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
f020: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f030: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
f040: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
f050: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
f060: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
f070: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f080: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
f090: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
f0a0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
f0b0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
f0c0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
f0d0: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
f0e0: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
f0f0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
f100: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
f110: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
f120: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f130: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
f140: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
f150: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
f160: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
f170: 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c  unreadlock = %d\
f180: 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72  n", res));.    r
f190: 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28  es = osLockFile(
f1a0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f1b0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
f1c0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
f1d0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
f1e0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
f1f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
f200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f210: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f220: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f230: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72      OSTRACE(("er
f240: 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
f250: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20  , lastErrno));. 
f260: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
f270: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
f280: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
f290: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
f2a0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
f2b0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
f2c0: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
f2d0: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
f2e0: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
f2f0: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
f300: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f310: 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63  K ){.    osUnloc
f320: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f330: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
f340: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
f350: 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
f360: 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
f370: 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
f380: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
f390: 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
f3a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
f3b0: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
f3c0: 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
f3d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
f3e0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
f3f0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46  OSTRACE(("LOCK F
f400: 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20  AILED %d trying 
f410: 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25  for %d but got %
f420: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
f430: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
f440: 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
f450: 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ));.    pFile->l
f460: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
f470: 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
f480: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
f490: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
f4a0: 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
f4b0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
f4c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f4d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
f4e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
f4f0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
f500: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
f510: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
f520: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
f530: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
f540: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
f550: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
f560: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
f570: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
f580: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
f590: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f5a0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f5b0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sOut){.  int rc;
f5c0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
f5d0: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
f5e0: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
f5f0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
f600: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
f610: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
f620: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
f630: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
f640: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
f650: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
f660: 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  rc = 1;.    OSTR
f670: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
f680: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29  CK %d %d (local)
f690: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
f6a0: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
f6b0: 20 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c    rc = osLockFil
f6c0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
f6d0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
f6e0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
f6f0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63  ){.      osUnloc
f700: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f710: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
f720: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
f730: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
f740: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
f750: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
f760: 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
f770: 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20  ->h, rc));.  }. 
f780: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
f790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f7a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
f7b0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f7c0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f7d0: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
f7e0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
f7f0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
f800: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
f810: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
f820: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
f830: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
f840: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
f850: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
f860: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
f870: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
f880: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
f890: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
f8a0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
f8b0: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
f8c0: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
f8d0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
f8e0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
f8f0: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
f900: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
f910: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
f920: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
f930: 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
f940: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
f950: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
f960: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
f970: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
f980: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
f990: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
f9a0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
f9b0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
f9c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
f9d0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
f9e0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
f9f0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
fa00: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fa10: 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61  LOCK %d to %d wa
fa20: 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69  s %d(%d)\n", pFi
fa30: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
fa40: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
fa50: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
fa60: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
fa70: 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
fa80: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
fa90: 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
faa0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
fab0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   osUnlockFile(pF
fac0: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
fad0: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
fae0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
faf0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
fb00: 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
fb10: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
fb20: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
fb30: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
fb40: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
fb50: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
fb60: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
fb70: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
fb80: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
fb90: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fba0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fbb0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
fbc0: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
fbd0: 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
fbe0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
fbf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
fc00: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
fc10: 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f  CK ){.    osUnlo
fc20: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
fc30: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
fc40: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
fc50: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
fc60: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
fc70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fc80: 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
fc90: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
fca0: 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
fcb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55  _LOCK ){.    osU
fcc0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
fcd0: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
fce0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
fcf0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fd00: 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
fd10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fd20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
fd30: 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
fd40: 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
fd50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fd60: 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
fd70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
fd80: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
fd90: 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
fda0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fdb0: 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
fdc0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
fdd0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
fde0: 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
fdf0: 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
fe00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
fe10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fe20: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
fe30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
fe40: 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
fe50: 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
fe60: 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74  (int)pFile->last
fe70: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
fe80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fe90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
fea0: 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
feb0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
fec0: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
fed0: 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
fee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fef0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
ff00: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
ff10: 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
ff20: 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
ff30: 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
ff40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
ff50: 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
ff60: 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
ff70: 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
ff80: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
ff90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ffb0: 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
ffc0: 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
ffd0: 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
ffe0: 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
fff0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
10000 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
10010 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
10020 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
10030 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
10040 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
10050 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
10060 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
10070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
10080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10090 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
100a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
100b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
100c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
100d0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
100e0 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74      int bPersist
100f0 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a   = *(int*)pArg;.
10100 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69        if( bPersi
10110 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st<0 ){.        
10120 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
10130 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c  ile->bPersistWal
10140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10150 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50         pFile->bP
10160 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72  ersistWal = bPer
10170 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d  sist!=0;.      }
10180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
101a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
101b0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
101c0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
101d0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
101e0 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a  rintf("win32");.
101f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10200 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
10210 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
10220 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44  NTL_SYNC_OMITTED
10230 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
10240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10250 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
10260 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
10270 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20  _RETRY: {.      
10280 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70  int *a = (int*)p
10290 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Arg;.      if( a
102a0 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [0]>0 ){.       
102b0 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
102c0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
102d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
102e0 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52  0] = win32IoerrR
102f0 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  etry;.      }.  
10300 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29      if( a[1]>0 )
10310 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
10320 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
10330 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
10340 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
10350 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74   = win32IoerrRet
10360 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d  ryDelay;.      }
10370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
10390 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
103a0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
103b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
103c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
103d0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
103e0 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
103f0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
10400 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
10410 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
10420 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
10430 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
10440 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
10450 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
10460 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
10470 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
10480 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
10490 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
104a0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
104b0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
104c0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
104d0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
104e0 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
104f0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
10500 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
10510 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
10520 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
10530 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
10540 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
10550 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
10560 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73  _file *id){.  as
10570 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
10580 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 28   return (int)(((
10590 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 73 65  winFile*)id)->se
105a0 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  ctorSize);.}../*
105b0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
105c0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
105d0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
105e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
105f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
10600 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
10610 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 45  le *id){.  UNUSE
10620 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
10630 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10640 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
10650 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
10660 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
10670 4f 43 41 50 5f 5a 45 52 4f 5f 44 41 4d 41 47 45  OCAP_ZERO_DAMAGE
10680 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10690 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
106a0 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c   .** Windows wil
106b0 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
106c0 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
106d0 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
106e0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
106f0 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
10700 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
10710 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
10720 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
10730 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
10740 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
10750 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59  rity size..*/.SY
10760 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
10770 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  Info;../*.** Hel
10780 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
10790 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
107a0 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
107b0 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
107c0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
107d0 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
107e0 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
107f0 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
10800 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
10810 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
10820 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
10830 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
10840 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
10850 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
10860 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
10870 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
10880 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
10890 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
108a0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
108b0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
108c0 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
108d0 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
108e0 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
108f0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
10900 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
10910 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
10920 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
10930 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
10940 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10950 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
10960 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
10970 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
10980 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10990 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
109a0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
109b0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
109c0 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
109d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
109e0 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
109f0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10a00 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10a10 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
10a20 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
10a30 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
10a40 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
10a50 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
10a60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
10a70 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10a80 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10a90 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
10aa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
10ab0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
10ac0 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
10ad0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
10ae0 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
10af0 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
10b00 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
10b10 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
10b20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
10b30 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
10b40 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
10b50 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
10b60 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
10b70 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
10b80 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
10b90 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
10ba0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
10bb0 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
10bc0 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
10bd0 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
10be0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
10bf0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
10c00 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
10c10 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
10c20 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
10c30 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
10c40 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
10c50 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
10c60 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
10c70 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
10c80 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
10c90 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
10ca0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
10cb0 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
10cc0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
10cd0 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
10ce0 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
10cf0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
10d00 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
10d10 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
10d20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
10d30 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
10d40 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
10d50 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
10d60 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
10d70 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
10d80 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
10d90 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
10da0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
10db0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10dc0 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
10dd0 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
10de0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
10df0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
10e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
10e10 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
10e20 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
10e30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
10e40 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
10e50 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
10e60 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
10e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10e80 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
10e90 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
10ea0 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ec0 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
10ed0 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
10ee0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
10ef0 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
10f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10f10 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
10f20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
10f30 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
10f40 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
10f50 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
10f60 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
10f70 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
10f80 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
10f90 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
10fa0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fc0 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
10fd0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
10fe0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
10ff0 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
11000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
11010 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
11020 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
11030 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
11040 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
11050 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
11060 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
11070 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
11080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
11090 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
110a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
110b0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
110c0 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
110d0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
110e0 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
110f0 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
11100 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
11110 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
11120 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
11130 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
11140 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
11150 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
11160 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
11170 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
11180 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
11190 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
111a0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
111b0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
111c0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
111d0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
111e0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
111f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
11200 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
11210 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
11220 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
11230 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
11240 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
11250 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
11260 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
11270 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
11280 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
11290 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
112a0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
112b0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
112c0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
112d0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
112e0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
112f0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
11300 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
11310 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
11320 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
11330 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
11340 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
11350 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
11360 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
11370 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
11380 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
11390 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
113a0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
113b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
113c0 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
113d0 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
113e0 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
113f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
11400 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
11410 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
11420 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
11430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11440 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
11450 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
11460 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
11470 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
114a0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
114b0 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
114c0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
114d0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
114e0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
114f0 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
11500 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
11510 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
11520 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
11530 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
11540 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
11550 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
11560 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
11570 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
11580 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
11590 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
115a0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
115b0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
115c0 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
115d0 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
115e0 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
115f0 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
11600 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
11610 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
11620 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
11630 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
11640 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
11650 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
11660 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
11670 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
11680 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
11690 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
116a0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
116b0 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
116c0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
116d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
116e0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
116f0 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
11700 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11720 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
11730 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
11740 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41  k */.){.  OVERLA
11750 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f  PPED ovlp;.  DWO
11760 52 44 20 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e  RD dwFlags;.  in
11770 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
11780 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
11790 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
117a0 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
117b0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
117c0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
117d0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
117e0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
117f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
11800 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11810 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
11820 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
11830 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   );..  /* Initia
11840 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
11850 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
11860 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
11870 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
11880 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  TELY;.  if( lock
11890 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c  Type == _SHM_WRL
118a0 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
118b0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
118c0 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73  VE_LOCK;..  mems
118d0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
118e0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
118f0 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20  ;.  ovlp.Offset 
11900 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52 65  = ofst;..  /* Re
11910 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68  lease/Acquire th
11920 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
11930 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ock */.  if( loc
11940 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
11950 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  K ){.    rc = os
11960 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69  UnlockFileEx(pFi
11970 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20  le->hFile.h, 0, 
11980 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29  nByte, 0, &ovlp)
11990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
119a0 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  c = osLockFileEx
119b0 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  (pFile->hFile.h,
119c0 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79   dwFlags, 0, nBy
119d0 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20  te, 0, &ovlp);. 
119e0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d   }.  .  if( rc!=
119f0 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53   0 ){.    rc = S
11a00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
11a10 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
11a20 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74  stErrno =  osGet
11a30 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
11a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
11a50 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  Y;.  }..  OSTRAC
11a60 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20  E(("SHM-LOCK %d 
11a70 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22  %s %s 0x%08lx\n"
11a80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  , .           pF
11a90 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ile->hFile.h,.  
11aa0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
11ab0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
11ac0 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20  "failed",.      
11ad0 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f       lockType==_
11ae0 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c  SHM_UNLCK ? "Unl
11af0 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f  ockFileEx" : "Lo
11b00 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20  ckFileEx",.     
11b10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11b20 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74  tErrno));..  ret
11b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
11b40 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
11b50 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
11b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
11b70 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
11b80 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
11b90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
11ba0 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
11bb0 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
11bc0 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
11bd0 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
11be0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
11bf0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
11c00 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
11c10 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
11c20 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
11c30 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
11c40 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
11c50 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
11c60 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
11c70 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
11c80 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
11c90 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
11ca0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
11cb0 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
11cc0 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
11cd0 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
11ce0 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
11cf0 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f  ShmNode *p;.  BO
11d00 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74  OL bRc;.  assert
11d10 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
11d20 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77  d() );.  pp = &w
11d30 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
11d40 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70   while( (p = *pp
11d50 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
11d60 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
11d70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
11d80 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
11d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
11da0 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
11db0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11dc0 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
11dd0 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
11de0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
11df0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
11e00 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
11e10 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
11e20 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72  E pid-%d unmap r
11e30 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a  egion=%d %s\n",.
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
11e60 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
11e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11e80 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20     bRc ? "ok" : 
11e90 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
11ea0 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73      bRc = osClos
11eb0 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
11ec0 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
11ed0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
11ee0 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20  HM-PURGE pid-%d 
11ef0 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20  close region=%d 
11f00 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
11f10 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
11f20 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
11f30 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20  Id(), i,.       
11f40 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20            bRc ? 
11f50 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
11f60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11f70 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20   if( p->hFile.h 
11f80 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  != INVALID_HANDL
11f90 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
11fa0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
11fb0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
11fc0 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
11fd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
11fe0 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
11ff0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12000 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
12010 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
12020 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
12030 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
12040 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
12050 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28        winDelete(
12060 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
12070 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
12080 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
12090 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
120a0 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
120b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
120c0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
120d0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
120e0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
120f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12100 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
12110 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12120 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
12130 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
12140 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
12150 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
12160 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
12170 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
12180 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
12190 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
121a0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
121b0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
121c0 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
121d0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
121e0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
121f0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
12200 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
12210 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
12220 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
12230 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
12240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12250 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
12260 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
12270 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
12280 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
12290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
122a0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
122b0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
122c0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
122d0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
122e0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
122f0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
12300 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12330 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
12340 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
12350 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
12360 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
12370 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
12380 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
123b0 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
123c0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
123d0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
123e0 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
123f0 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
12400 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
12410 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
12420 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
12430 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
12440 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
12450 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
12460 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
12470 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
12480 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
12490 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
124a0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
124b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
124c0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  IOERR_NOMEM;.  m
124d0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
124e0 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65  of(*p));.  nName
124f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
12500 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
12510 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
12520 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
12530 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
12540 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20 69  Name + 15 );.  i
12550 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
12560 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12570 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12580 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
12590 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
125a0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
125b0 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pNew));.  pNew->
125c0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
125d0 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
125e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
125f0 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
12600 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
12610 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
12620 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c  h);.  sqlite3Fil
12630 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
12640 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69  zPath, pNew->zFi
12650 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20  lename); ..  /* 
12660 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
12670 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
12680 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
12690 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
126a0 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
126b0 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
126c0 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
126d0 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
126e0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
126f0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
12700 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
12710 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
12720 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
12730 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
12740 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
12750 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
12760 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
12770 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
12780 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
12790 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
127a0 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
127b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
127c0 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
127d0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
127e0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
127f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
12800 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
12810 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12820 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
12830 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
12840 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
12850 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
12860 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
12870 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
12880 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
12890 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
128a0 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
128b0 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
128c0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
128d0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70  pShmNode;..    p
128e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
128f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
12900 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
12910 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
12920 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
12930 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
12940 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
12950 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
12960 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
12970 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
12980 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
12990 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
129a0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
129b0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
129c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
129d0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
129e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
129f0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
12a00 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
12a10 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
12a20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
12a50 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
12a60 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
12a70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a  _OPEN_CREATE, /*
12a80 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   Mode flags */. 
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
12ab0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
12ac0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
12ad0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
12ae0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
12af0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
12b00 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
12b10 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
12b20 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
12b30 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
12b40 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
12b50 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
12b60 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
12b70 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
12b80 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
12b90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
12ba0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
12bb0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
12bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12bd0 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
12be0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
12bf0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
12c00 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
12c10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12c20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12c30 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
12c40 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
12c50 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
12c60 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
12c70 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d       "winOpenShm
12c80 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
12c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12ca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
12cc0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
12cd0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
12ce0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
12cf0 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  S, 1);.      rc 
12d00 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
12d10 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
12d20 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
12d30 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
12d40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
12d50 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
12d60 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
12d70 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
12d80 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
12d90 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
12da0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
12db0 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
12dc0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
12dd0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
12de0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
12df0 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
12e00 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
12e10 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
12e20 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
12e30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
12e40 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
12e50 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
12e60 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
12e70 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
12e80 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
12e90 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
12ea0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
12eb0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
12ec0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
12ed0 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
12ee0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
12ef0 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
12f00 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
12f10 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
12f20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
12f30 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
12f40 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
12f50 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
12f60 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
12f70 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
12f80 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
12f90 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
12fa0 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
12fb0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
12fc0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
12fd0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
12fe0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
12ff0 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
13000 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
13010 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
13020 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
13030 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
13040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13050 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
13060 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
13070 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
13080 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
13090 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
130a0 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
130b0 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d  MS, 1);.  winShm
130c0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
130d0 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54  s, 0);      /* T
130e0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
130f0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
13100 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
13110 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  _free(p);.  sqli
13120 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
13130 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
13140 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
13150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
13160 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
13170 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
13180 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
13190 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
131a0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
131b0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
131c0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
131d0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
131e0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
131f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
13200 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
13210 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
13220 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
13230 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
13240 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
13250 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
13260 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
13270 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
13280 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
13290 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
132a0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
132b0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
132c0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
132d0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
132e0 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
132f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
13300 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
13310 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
13320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
13330 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
13340 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
13350 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
13360 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
13370 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
13380 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
13390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
133a0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
133b0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
133c0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
133d0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
133e0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
133f0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
13400 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
13410 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13420 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
13430 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
13440 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
13450 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
13460 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
13470 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
13480 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
13490 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
134a0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
134b0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
134c0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
134d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
134e0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
134f0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
13500 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
13510 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
13520 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
13530 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
13540 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
13550 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
13560 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
13570 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
13580 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
13590 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
135a0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
135b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
135c0 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
135d0 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
135e0 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
135f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
13600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
13620 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
13630 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
13640 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
13650 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
13660 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
13670 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
13680 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13690 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
136a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
136b0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136d0 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
136e0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
136f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13720 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
13730 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
13740 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
13750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
13760 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
13770 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
13780 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
13790 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
137a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
137b0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
137c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
137d0 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
137e0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
137f0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
13800 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
13810 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
13820 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
13850 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
13860 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
13870 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
13880 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
13890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
138a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
138b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
138c0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
138d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
138f0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
13900 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
13910 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
13920 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
13930 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
13940 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
13950 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
13960 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
13970 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
13980 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
13990 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
139a0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
139b0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
139c0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
139d0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
139e0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
139f0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
13a00 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
13a10 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
13a20 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
13a30 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
13a40 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
13a50 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
13a60 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
13a70 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
13a80 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
13a90 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
13aa0 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
13ab0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
13ac0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
13ad0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13ae0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
13af0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
13b00 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
13b10 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
13b20 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
13b30 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
13b40 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
13b50 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
13b60 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
13b70 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
13b80 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
13b90 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
13ba0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
13bb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
13bc0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
13bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
13be0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
13bf0 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
13c00 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
13c10 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
13c20 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
13c30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
13c40 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
13c50 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
13c60 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
13c70 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
13c80 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
13c90 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
13ca0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
13cb0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
13cc0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
13cd0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
13ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
13cf0 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
13d00 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
13d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
13d30 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
13d40 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
13d50 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
13d60 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
13d70 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
13d80 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
13d90 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
13da0 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
13db0 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
13dc0 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
13dd0 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
13de0 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
13df0 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
13e00 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
13e10 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
13e20 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
13e30 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
13e40 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
13e50 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
13e60 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
13e70 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
13e80 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
13e90 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
13ea0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
13eb0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
13ec0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
13ed0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
13ee0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
13ef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13f00 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
13f10 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13f20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
13f30 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
13f40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
13f50 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
13f60 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
13f70 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
13f80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
13f90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13fa0 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
13fb0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
13fc0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
13fd0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
13fe0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
13ff0 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
14000 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
14010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
14040 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
14050 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
14060 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
14070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14080 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
14090 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
140a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
140b0 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
140c0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
140d0 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
140e0 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
140f0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
14100 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
14110 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
14120 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
14130 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
14140 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
14150 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
14160 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
14170 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
14180 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
14190 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
141a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
141b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
141c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
141d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
141e0 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
141f0 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
14200 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
14210 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
14220 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
14230 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
14240 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
14250 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
14260 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
14270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14280 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
14290 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
142a0 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  , _SHM_WRLCK, of
142b0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
142c0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
142d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
142e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
142f0 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
14300 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
14310 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
14320 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
14330 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
14340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14350 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
14360 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
14370 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
14380 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
14390 33 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20  3x,%03x %s\n",. 
143a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
143b0 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
143c0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
143d0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
143e0 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20  >exclMask,.     
143f0 20 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c        rc ? "fail
14400 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
14410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14420 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
14430 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
14440 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
14450 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
14460 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
14470 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
14480 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
14490 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
144a0 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
144b0 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
144c0 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
144d0 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
144e0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42  tic void winShmB
144f0 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
14500 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
14510 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14520 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
14530 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
14540 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
14550 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d  ER(fd);.  /* Mem
14560 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f  oryBarrier(); //
14570 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d   does not work -
14580 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68  - do not know wh
14590 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68  y not */.  winSh
145a0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
145b0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
145c0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  x();.}../*.** Th
145d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
145e0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
145f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
14600 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
14610 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
14620 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
14630 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
14640 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
14650 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
14660 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
14670 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
14680 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
14690 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
146a0 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
146b0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
146c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
146d0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
146e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
146f0 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
14700 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
14710 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
14720 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d  he isWrite param
14730 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
14740 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
14750 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
14760 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
14770 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
14780 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
14790 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
147a0 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
147b0 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
147c0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
147d0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
147e0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
147f0 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  ** isWrite is no
14800 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
14810 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
14820 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
14830 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
14840 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
14850 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
14860 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
14870 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
14880 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
14890 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
148a0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
148b0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
148c0 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
148d0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
148e0 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
148f0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
14900 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
14910 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
14920 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
14930 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
14940 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
14950 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
14960 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
14970 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
14980 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
14990 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
149a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
149b0 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
149c0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
149d0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
149e0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
149f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
14a00 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
14a10 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
14a40 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
14a50 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
14a60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14a70 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
14a80 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
14a90 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
14aa0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
14ab0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
14ac0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
14ad0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
14ae0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
14af0 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62   winShm *p = pDb
14b00 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53  Fd->pShm;.  winS
14b10 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
14b20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14b30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
14b40 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  p ){.    rc = wi
14b50 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
14b60 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
14b70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14b80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14b90 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
14ba0 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65  ;.  }.  pShmNode
14bb0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
14bc0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14bd0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
14be0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
14bf0 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
14c00 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
14c10 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
14c20 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
14c30 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
14c40 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
14c50 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65      struct ShmRe
14c60 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20  gion *apNew;    
14c70 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52         /* New aR
14c80 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
14c90 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
14ca0 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
14cb0 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
14cc0 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
14cd0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
14ce0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20  ite3_int64 sz;  
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
14d10 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  of wal-index fil
14d20 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  e */..    pShmNo
14d30 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
14d40 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a  zRegion;..    /*
14d50 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
14d60 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
14d70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
14d80 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
14d90 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68  space..    ** Ch
14da0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
14db0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
14dc0 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
14dd0 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
14de0 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  is.    ** large 
14df0 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
14e00 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
14e10 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a  region)..    */.
14e20 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
14e30 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
14e40 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
14e50 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
14e60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14e70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
14e80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14e90 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
14ea0 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
14eb0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
14ec0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
14ed0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
14ee0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
14ef0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
14f00 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
14f10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
14f20 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
14f30 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
14f40 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
14f50 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
14f60 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
14f70 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
14f80 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
14f90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
14fa0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
14fb0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
14fc0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
14fd0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
14fe0 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
14ff0 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
15000 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
15010 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
15020 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
15030 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
15040 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
15050 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
15060 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
15070 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
15080 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
15090 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
150a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
150b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
150c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
150d0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
150e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
150f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15100 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20    "winShmMap2", 
15110 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
15120 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
15130 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
15140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
15150 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
15160 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
15170 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
15180 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
15190 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
151a0 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69   (struct ShmRegi
151b0 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  on *)sqlite3_rea
151c0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
151d0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c  hmNode->aRegion,
151e0 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
151f0 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20  eof(apNew[0]).  
15200 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
15210 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
15220 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
15230 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
15240 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
15250 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
15260 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  ->aRegion = apNe
15270 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  w;..    while( p
15280 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
15290 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
152a0 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152c0 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68  * file-mapping h
152d0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76  andle */.      v
152e0 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20  oid *pMap = 0;  
152f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
15300 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  pped memory regi
15310 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20  on */.     .    
15320 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
15330 65 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53 68  eFileMapping(pSh
15340 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
15350 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
15360 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
15370 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
15380 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4f        );.      O
15390 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
153a0 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20 72   pid-%d create r
153b0 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25  egion=%d nbyte=%
153c0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
153d0 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
153e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
153f0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
15400 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
15420 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
15430 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
15440 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
15450 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
15460 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
15470 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
15480 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
15490 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
154a0 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
154b0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
154c0 72 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 4d  rity;.        pM
154d0 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
154e0 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f  File(hMap, FILE_
154f0 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
15500 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
15510 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65         0, iOffse
15520 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
15530 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
15540 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
15550 20 20 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54    );.        OST
15560 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70  RACE(("SHM-MAP p
15570 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f 6e  id-%d map region
15580 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73 69  =%d offset=%d si
15590 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ze=%d %s\n",.   
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
155b0 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
155c0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
155d0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
155e0 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
155f0 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
15600 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
15610 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
15620 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
15630 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
15640 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
15650 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15660 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
15670 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
15680 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
15690 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
156a0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
156b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
156c0 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d  ShmMap3", pDbFd-
156d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
156e0 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c   if( hMap ) osCl
156f0 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b  oseHandle(hMap);
15700 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
15710 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
15720 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   }..      pShmNo
15730 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
15740 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70  Node->nRegion].p
15750 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20  Map = pMap;.    
15760 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
15770 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
15780 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d  egion].hMap = hM
15790 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
157a0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
157b0 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
157c0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
157d0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
157e0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  Region ){.    in
157f0 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67  t iOffset = iReg
15800 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
15810 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
15820 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
15830 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
15840 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
15850 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  y;.    char *p =
15860 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
15870 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
15880 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
15890 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
158a0 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20  OffsetShift];.  
158b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
158c0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
158d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
158e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
158f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15900 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
15910 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
15920 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
15930 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
15940 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
15950 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
15960 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
15970 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
15980 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
15990 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
159a0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
159b0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
159c0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
159d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
159f0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
15a00 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
15a80 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
15a90 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
15aa0 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
15ab0 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
15ac0 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
15ad0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
15ae0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
15af0 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
15b00 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20   {.  2,         
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
15b30 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
15b60 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
15b90 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
15bc0 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
15bf0 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
15c20 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
15c50 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
15c80 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
15cb0 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
15cc0 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
15cd0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
15ce0 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
15cf0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d10 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
15d20 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
15d50 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
15d60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
15d70 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
15d80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
15d90 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
15dc0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
15df0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
15e00 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
15e10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
15e20 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
15e30 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
15e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
15e50 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  mUnmap */.};../*
15e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
15eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ec0 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
15ed0 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
15ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
15f00 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
15f10 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
15f20 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
15f30 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
15f40 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
15f50 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  t..*/../*.** Con
15f60 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
15f70 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
15f80 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
15f90 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
15fa0 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
15fb0 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
15fc0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
15fd0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
15fe0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
15ff0 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
16000 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
16010 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
16020 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
16030 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
16040 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
16050 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
16060 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
16070 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
16080 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
16090 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
160a0 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
160b0 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
160c0 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
160d0 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
160e0 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
160f0 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20  ecuted. .*/.#if 
16100 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
16110 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
16120 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
16130 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
16140 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  to_mbcs(zFilenam
16150 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  e);.#endif.  }. 
16160 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
16170 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
16180 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
16190 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
161a0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
161b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
161c0 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
161d0 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  f must be big en
161e0 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20  ough to.** hold 
161f0 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  at pVfs->mxPathn
16200 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ame characters..
16210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
16220 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
16230 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
16240 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
16250 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
16260 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
16270 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
16280 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
16290 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
162a0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
162b0 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63  size_t i, j;.  c
162c0 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41  har zTempPath[MA
162d0 58 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a  X_PATH+1];..  /*
162e0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
162f0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
16300 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
16310 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
16320 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
16330 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
16340 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
16350 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
16360 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
16370 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
16380 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
16390 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
163a0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
163b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
163c0 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
163d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
163e0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
163f0 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
16400 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
16410 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65  directory);.  }e
16420 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
16430 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
16440 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
16450 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48  idePath[MAX_PATH
16460 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70  ];.    osGetTemp
16470 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33  PathW(MAX_PATH-3
16480 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  0, zWidePath);. 
16490 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63     zMulti = unic
164a0 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
164b0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
164c0 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
164d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
164e0 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
164f0 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75  pPath, "%s", zMu
16500 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
16510 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
16520 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16540 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
16550 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
16560 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
16570 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
16580 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
16590 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
165a0 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
165b0 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
165c0 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
165d0 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
165e0 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
165f0 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
16600 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
16610 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
16620 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
16630 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
16640 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
16650 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
16660 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
16670 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41    osGetTempPathA
16680 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
16690 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
166a0 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
166b0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
166c0 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
166d0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
166e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
166f0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
16700 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
16710 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
16720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
16730 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
16740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16750 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
16760 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16770 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
16780 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
16790 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
167a0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
167b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
167c0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
167d0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
167e0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
167f0 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53  .  if( (sqlite3S
16800 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
16810 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  h) + sqlite3Strl
16820 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
16830 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
16840 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  17) >= nBuf ){. 
16850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16860 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
16870 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c  or(i=sqlite3Strl
16880 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
16890 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
168a0 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
168b0 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
168c0 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  [i] = 0;..  sqli
168d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
168e0 66 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20  f-17, zBuf,.    
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16900 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50  %s\\"SQLITE_TEMP
16910 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
16920 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
16930 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16940 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
16950 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
16960 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
16970 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
16980 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
16990 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
169a0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
169b0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
169c0 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
169d0 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
169e0 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
169f0 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a  ("TEMP FILENAME:
16a00 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a   %s\n", zBuf));.
16a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16a20 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  OK; .}../*.** Op
16a30 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  en a file..*/.st
16a40 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
16a50 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
16a60 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  *pVfs,        /*
16a70 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
16a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
16a90 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
16aa0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
16ab0 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
16ac0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
16ad0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
16ae0 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e   SQLite file han
16af0 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
16b00 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
16b10 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
16b20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
16b30 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
16b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
16b50 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73  tus return flags
16b60 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20   */.){.  HANDLE 
16b70 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  h;.  DWORD lastE
16b80 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77  rrno;.  DWORD dw
16b90 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20  DesiredAccess;. 
16ba0 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f   DWORD dwShareMo
16bb0 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72  de;.  DWORD dwCr
16bc0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
16bd0 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  n;.  DWORD dwFla
16be0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
16bf0 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = 0;.#if SQLITE_
16c00 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69  OS_WINCE.  int i
16c10 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69  sTemp = 0;.#endi
16c20 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  f.  winFile *pFi
16c30 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
16c40 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  d;.  void *zConv
16c50 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  erted;          
16c60 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
16c70 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a  in OS encoding *
16c80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
16c90 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zUtf8Name = zNam
16ca0 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69  e; /* Filename i
16cb0 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67  n UTF-8 encoding
16cc0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   */.  int cnt = 
16cd0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  0;..  /* If argu
16ce0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
16cf0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
16d00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
16d10 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
16d20 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
16d30 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
16d40 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
16d50 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
16d60 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
16d70 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b  mpname[MAX_PATH+
16d80 31 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65  1];     /* Buffe
16d90 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  r used to create
16da0 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a   temp filename *
16db0 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
16dc0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
16dd0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
16de0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
16df0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
16e00 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
16e10 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
16e20 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
16e30 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
16e40 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
16e50 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
16e60 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
16e70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16e80 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
16e90 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
16ea0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
16eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
16ec0 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
16ed0 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
16ee0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16ef0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69  OPEN_CREATE);.#i
16f00 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
16f10 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
16f20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
16f30 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
16f40 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69  ;.#endif.  int i
16f50 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
16f60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16f70 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a  EN_READWRITE);..
16f80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
16f90 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e   int isOpenJourn
16fa0 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  al = (isCreate &
16fb0 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
16fc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
16fd0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
16fe0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
16ff0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
17000 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
17010 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
17020 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e  EN_WAL.  ));.#en
17030 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  dif..  /* Check 
17040 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
17050 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
17060 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
17070 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
17080 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
17090 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
170a0 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
170b0 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
170c0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
170d0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
170e0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
170f0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
17100 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
17110 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
17120 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
17130 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
17140 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
17150 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
17160 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
17170 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
17180 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
17190 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
171a0 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
171b0 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
171c0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
171d0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
171e0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
171f0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
17200 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
17210 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
17220 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
17230 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
17240 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
17250 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
17260 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
17270 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
17280 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
17290 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
172a0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
172b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
172c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
172d0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
172e0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
172f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
17300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
17310 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
17320 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
17330 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
17340 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
17350 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
17360 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
17370 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
17380 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
17390 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
173a0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
173b0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
173c0 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
173d0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
173e0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
173f0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
17400 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
17410 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
17420 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
17430 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
17440 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
17450 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
17460 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
17470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
17480 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
17490 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
174a0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
174b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
174c0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
174d0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
174e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
174f0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
17500 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
17510 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
17520 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
17530 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
17540 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
17550 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53   id!=0 );.  UNUS
17560 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
17570 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20  s);..  pFile->h 
17580 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
17590 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66  _VALUE;..  /* If
175a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
175b0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
175c0 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
175d0 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20  enerate a .  ** 
175e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
175f0 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f  ame to use .  */
17600 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
17610 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
17620 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
17630 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  penJournal);.   
17640 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
17650 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54  e(MAX_PATH+1, zT
17660 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
17670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17680 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17690 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  c;.    }.    zUt
176a0 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d  f8Name = zTmpnam
176b0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  e;.  }..  /* Con
176c0 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
176d0 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
176e0 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
176f0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
17700 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
17710 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
17720 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
17730 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17740 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
17750 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
17760 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
17770 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
17780 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
17790 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
177a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
177b0 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
177c0 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
177d0 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
177e0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
177f0 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
17800 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
17810 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
17820 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
17830 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
17840 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
17850 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
17860 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
17870 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
17880 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
17890 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
178a0 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
178b0 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
178c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
178d0 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
178e0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
178f0 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
17900 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
17910 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
17920 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
17930 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
17940 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
17950 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
17960 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
17970 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
17980 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
17990 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
179a0 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
179b0 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
179c0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
179d0 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
179e0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
179f0 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
17a00 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
17a10 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
17a20 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
17a30 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
17a40 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
17a50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
17a60 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
17a70 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
17a80 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
17a90 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
17aa0 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
17ab0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
17ac0 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
17ad0 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17b00 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
17b10 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
17b40 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
17b50 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
17b60 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
17b70 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
17b80 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
17b90 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
17ba0 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
17bb0 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
17bc0 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
17bd0 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
17be0 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
17bf0 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
17c00 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
17c10 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
17c20 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
17c30 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
17c40 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
17c50 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
17c60 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e  endif..  if( isN
17c70 54 28 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  T() ){.    while
17c80 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
17c90 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
17ca0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
17cd0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
17d00 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
17d30 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
17d60 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
17d70 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
17da0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17dd0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
17de0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
17df0 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
17e00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
17e10 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
17e20 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
17e30 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
17e40 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e  the ANSI version
17e50 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
17e60 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
17e70 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
17e80 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
17e90 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
17ea0 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
17eb0 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
17ec0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
17ed0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  0.  }else{.    w
17ee0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
17ef0 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52  ateFileA((LPCSTR
17f00 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
17f30 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
17f60 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
17f90 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
17fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
17fd0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
18000 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
18010 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e    retryIoerr(&cn
18040 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
18050 7b 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  {}.#endif.  }.. 
18060 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
18070 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
18080 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73  N %d %s 0x%lx %s
18090 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
180a0 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73   h, zName, dwDes
180b0 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20  iredAccess, .   
180c0 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c          h==INVAL
180d0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
180e0 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
180f0 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49  "));..  if( h==I
18100 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
18110 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LUE ){.    pFile
18120 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
18130 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
18140 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
18150 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d  CANTOPEN, pFile-
18160 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e  >lastErrno, "win
18170 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65  Open", zUtf8Name
18180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18190 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
181a0 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
181b0 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
181c0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65  sive ){.      re
181d0 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66  turn winOpen(pVf
181e0 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20  s, zName, id, . 
181f0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c              ((fl
18200 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags|SQLITE_OPEN_
18210 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49  READONLY)&~(SQLI
18220 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
18230 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
18240 52 49 54 45 29 29 2c 20 70 4f 75 74 46 6c 61 67  RITE)), pOutFlag
18250 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
18260 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18270 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
18280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
18290 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
182a0 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
182b0 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f  ite ){.      *pO
182c0 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
182d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
182e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
182f0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
18300 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
18310 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
18320 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
18330 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65  0, sizeof(*pFile
18340 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ));.  pFile->pMe
18350 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
18360 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  hod;.  pFile->h 
18370 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  = h;.  pFile->la
18380 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
18390 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  OR;.  pFile->pVf
183a0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
183b0 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70  e->pShm = 0;.  p
183c0 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
183d0 61 6d 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65  ame;.  pFile->se
183e0 63 74 6f 72 53 69 7a 65 20 3d 20 67 65 74 53 65  ctorSize = getSe
183f0 63 74 6f 72 53 69 7a 65 28 70 56 66 73 2c 20 7a  ctorSize(pVfs, z
18400 55 74 66 38 4e 61 6d 65 29 3b 0a 0a 23 69 66 20  Utf8Name);..#if 
18410 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
18420 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
18430 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
18440 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
18450 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65         && !wince
18460 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
18470 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20  , pFile).  ){.  
18480 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
18490 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
184a0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
184b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
184c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
184d0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  T;.  }.  if( isT
184e0 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
184f0 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
18500 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
18510 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
18520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
18530 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
18540 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74    }..  OpenCount
18550 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
18560 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
18570 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
18580 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
18590 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65  that Windows doe
185a0 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
185b0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
185c0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
185d0 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
185e0 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
185f0 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
18600 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
18610 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
18620 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
18630 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
18640 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
18650 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
18660 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73  whatever it does
18670 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74  .  While this ot
18680 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
18690 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  olding the.** fi
186a0 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c  le open, we will
186b0 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   be unable to de
186c0 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72  lete it.  To wor
186d0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a  k around this.**
186e0 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c   problem, we del
186f0 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  ay 100 milliseco
18700 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64  nds and try to d
18710 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70  elete again.  Up
18720 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49  .** to MX_DELETI
18730 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65  ON_ATTEMPTs dele
18740 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72  tion attempts ar
18750 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76  e run before giv
18760 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65  ing.** up and re
18770 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
18780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18790 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
187a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
187b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
187c0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
187d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
187e0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
187f0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
18800 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
18810 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
18820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
18830 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
18840 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
18850 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
18860 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
18870 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
18880 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
18890 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
188a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
188b0 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
188c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
188d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
188e0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43  RR_DELETE);.  zC
188f0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
18900 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
18910 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
18920 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
18930 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18940 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
18950 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
18960 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  ) ){.    rc = 1;
18970 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65  .    while( osGe
18980 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
18990 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e  (zConverted)!=IN
189a0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
189b0 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
189c0 20 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65    (rc = osDelete
189d0 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
189e0 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f  ))==0 && retryIo
189f0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
18a00 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63  rrno) ){}.    rc
18a10 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f   = rc ? SQLITE_O
18a20 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  K : SQLITE_ERROR
18a30 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
18a40 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
18a50 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
18a60 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
18a70 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
18a80 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69  e the ANSI versi
18a90 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
18aa0 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
18ab0 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
18ac0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
18ad0 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
18ae0 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
18af0 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
18b00 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
18b10 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
18b20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69   rc = 1;.    whi
18b30 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  le( osGetFileAtt
18b40 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
18b50 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  ted)!=INVALID_FI
18b60 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
18b70 0a 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20  .         (rc = 
18b80 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43  osDeleteFileA(zC
18b90 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26  onverted))==0 &&
18ba0 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
18bb0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
18bc0 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20  }.    rc = rc ? 
18bd0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
18be0 54 45 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66  TE_ERROR;.#endif
18bf0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
18c00 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
18c10 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
18c20 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45  RR_DELETE, lastE
18c30 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
18c40 20 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20     "winDelete", 
18c50 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65  zFilename);.  }e
18c60 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72  lse{.    logIoer
18c70 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  r(cnt);.  }.  sq
18c80 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
18c90 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43  erted);.  OSTRAC
18ca0 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c  E(("DELETE \"%s\
18cb0 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  " %s\n", zFilena
18cc0 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65  me, (rc ? "faile
18cd0 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20  d" : "ok" )));. 
18ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18cf0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
18d00 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61  xistance and sta
18d10 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
18d20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18d30 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
18d40 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
18d50 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
18d60 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
18d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
18d80 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
18d90 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
18da0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
18db0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
18dc0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
18dd0 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
18de0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
18df0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
18e00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
18e10 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
18e20 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
18e30 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
18e40 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f   lastErrno;.  vo
18e50 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
18e60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
18e70 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
18e80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
18e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18ea0 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a  R_ACCESS; );.  z
18eb0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
18ec0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
18ed0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
18ee0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
18ef0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18f00 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
18f10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
18f20 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
18f30 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
18f40 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
18f50 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
18f60 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
18f70 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
18f80 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
18f90 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
18fa0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
18fb0 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
18fc0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
18ff0 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20  ExInfoStandard, 
19000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
19020 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65  AttrData)) && re
19030 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
19040 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
19050 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19060 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
19070 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19080 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
19090 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
190a0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
190b0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
190c0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
190d0 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
190e0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
190f0 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
19100 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
19110 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
19120 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
19130 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
19140 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
19150 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
19160 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
19170 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19180 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
19190 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
191a0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
191b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
191c0 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
191d0 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
191e0 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno!=ERROR_FILE
191f0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
19200 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
19210 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  r(SQLITE_IOERR_A
19220 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f  CCESS, lastErrno
19230 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a  , "winAccess", z
19240 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
19250 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19260 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
19270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19280 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
19290 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
192a0 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
192b0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
192c0 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
192d0 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
192e0 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
192f0 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
19300 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
19310 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
19320 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
19330 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
19340 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
19350 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
19360 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
19370 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
19380 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
19390 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
193a0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
193b0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
193c0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
193d0 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
193e0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
193f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
19400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
19410 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
19420 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
19430 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
19440 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
19450 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
19460 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
19470 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
19480 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
19490 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
194a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
194b0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
194c0 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
194d0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
194e0 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
194f0 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
19500 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
19510 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
19520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19530 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
19540 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
19550 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
19560 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
19570 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
19580 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
19590 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
195a0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
195b0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
195c0 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
195d0 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
195e0 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
195f0 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
19600 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
19610 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
19620 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
19630 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
19640 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
19650 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
19660 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
19670 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
19680 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
19690 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
196a0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
196b0 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
196c0 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
196d0 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
196e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
196f0 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
19700 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
19710 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19730 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
19740 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  .){.  .#if defin
19750 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
19760 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19770 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
19780 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
19790 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
197a0 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e  l);.  cygwin_con
197b0 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f  v_to_full_win32_
197c0 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20  path(zRelative, 
197d0 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zFull);.  return
197e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
197f0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
19800 53 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61  S_WINCE.  Simula
19810 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
19820 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
19830 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19840 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f  ETER(nFull);.  /
19850 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
19860 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
19870 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
19880 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
19890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
198a0 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
198b0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
198c0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
198d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
198e0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
198f0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
19900 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
19910 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
19920 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
19930 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
19940 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  r *zOut;..  /* I
19950 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
19960 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
19970 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
19980 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
19990 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
199a0 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
199b0 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
199c0 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
199d0 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
199e0 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74  0]=='/' && sqlit
199f0 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74  e3Isalpha(zRelat
19a00 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61  ive[1]) && zRela
19a10 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a  tive[2]==':' ){.
19a20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
19a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
19a40 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
19a50 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
19a60 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
19a70 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
19a80 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
19a90 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
19aa0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
19ab0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
19ac0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
19ad0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
19ae0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
19af0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
19b00 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
19b10 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
19b20 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
19b30 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
19b40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19b60 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
19b70 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
19b80 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
19b90 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
19ba0 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
19bb0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
19bc0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
19bd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19be0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
19bf0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
19c00 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
19c10 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
19c20 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
19c30 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
19c40 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a  , 0, 0, 0) + 3;.
19c50 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
19c60 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
19c70 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
19c80 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
19c90 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
19ca0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
19cb0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
19cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19cd0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
19ce0 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61  .    osGetFullPa
19cf0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
19d00 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
19d10 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
19d20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19d30 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
19d40 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
19d50 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  oUtf8(zTemp);.  
19d60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19d70 54 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  Temp);./* isNT()
19d80 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
19d90 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
19da0 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
19db0 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  er executed. .**
19dc0 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20   Since the ANSI 
19dd0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
19de0 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
19df0 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
19e00 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
19e10 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
19e20 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
19e30 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
19e40 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
19e50 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
19e60 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
19e70 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
19e80 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
19e90 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
19ea0 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
19eb0 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
19ec0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
19ed0 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
19ee0 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
19ef0 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
19f00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19f10 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
19f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19f30 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
19f40 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75 6c    }.    osGetFul
19f50 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
19f60 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  *)zConverted, nB
19f70 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
19f80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19f90 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
19fa0 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
19fb0 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
19fc0 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
19fd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
19fe0 6d 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  mp);.#endif.  }.
19ff0 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20    if( zOut ){.  
1a000 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1a010 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  tf(pVfs->mxPathn
1a020 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  ame, zFull, "%s"
1a030 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
1a040 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
1a050 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a060 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1a070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a080 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1a090 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
1a0a0 2a 2a 20 47 65 74 20 74 68 65 20 73 65 63 74 6f  ** Get the secto
1a0b0 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 65  r size of the de
1a0c0 76 69 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  vice used to sto
1a0d0 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73  re.** file..*/.s
1a0e0 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63  tatic int getSec
1a0f0 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c  torSize(.    sql
1a100 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
1a110 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a120 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a  zRelative     /*
1a130 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65   UTF-8 file name
1a140 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62   */.){.  DWORD b
1a150 79 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20  ytesPerSector = 
1a160 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1a170 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a  ECTOR_SIZE;.  /*
1a180 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63   GetDiskFreeSpac
1a190 65 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  e is not support
1a1a0 65 64 20 75 6e 64 65 72 20 57 49 4e 43 45 20 2a  ed under WINCE *
1a1b0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
1a1c0 57 49 4e 43 45 0a 20 20 55 4e 55 53 45 44 5f 50  WINCE.  UNUSED_P
1a1d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1a1e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a1f0 45 52 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23  ER(zRelative);.#
1a200 65 6c 73 65 0a 20 20 63 68 61 72 20 7a 46 75 6c  else.  char zFul
1a210 6c 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31  lpath[MAX_PATH+1
1a220 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ];.  int rc;.  D
1a230 57 4f 52 44 20 64 77 52 65 74 20 3d 20 30 3b 0a  WORD dwRet = 0;.
1a240 20 20 44 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b    DWORD dwDummy;
1a250 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e  ..  /*.  ** We n
1a260 65 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 66  eed to get the f
1a270 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 20 6f 66  ull path name of
1a280 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
1a290 6f 20 67 65 74 20 74 68 65 20 64 72 69 76 65 20  o get the drive 
1a2a0 6c 65 74 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75  letter to look u
1a2b0 70 20 74 68 65 20 73 65 63 74 6f 72 0a 20 20 2a  p the sector.  *
1a2c0 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53  * size..  */.  S
1a2d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1a2e0 6e 69 67 6e 28 31 29 3b 0a 20 20 73 71 6c 69 74  nign(1);.  sqlit
1a2f0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1a300 6c 6f 63 28 29 3b 0a 20 20 72 63 20 3d 20 77 69  loc();.  rc = wi
1a310 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  nFullPathname(pV
1a320 66 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d  fs, zRelative, M
1a330 41 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61  AX_PATH, zFullpa
1a340 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  th);.  sqlite3En
1a350 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1a360 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1a370 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69  orBenign(0);.  i
1a380 66 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f  f( rc == SQLITE_
1a390 4f 4b 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69  OK ).  {.    voi
1a3a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1a3b0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
1a3c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1a3d0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
1a3e0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1a3f0 61 6d 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a  ame(zFullpath);.
1a400 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
1a410 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1a420 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1a430 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
1a440 4e 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NT() ){.        
1a450 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20  /* trim path to 
1a460 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72  just drive refer
1a470 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ence */.        
1a480 4c 50 57 53 54 52 20 70 20 3d 20 7a 43 6f 6e 76  LPWSTR p = zConv
1a490 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66  erted;.        f
1a4a0 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20  or(;*p;p++){.   
1a4b0 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d         if( *p ==
1a4c0 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20   '\\' ){.       
1a4d0 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a       *p = '\0';.
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a4f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1a500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a510 20 64 77 52 65 74 20 3d 20 6f 73 47 65 74 44 69   dwRet = osGetDi
1a520 73 6b 46 72 65 65 53 70 61 63 65 57 28 28 4c 50  skFreeSpaceW((LP
1a530 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1a540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a        &dwDummy,.
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63      &bytesPerSec
1a5a0 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
1a5d0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29         &dwDummy)
1a600 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a610 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70         /* trim p
1a620 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76  ath to just driv
1a630 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20  e reference */. 
1a640 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d         char *p =
1a650 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72   (char *)zConver
1a660 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ted;.        for
1a670 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20  (;*p;p++){.     
1a680 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27       if( *p == '
1a690 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
1a6a0 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20     *p = '\0';.  
1a6b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a6c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
1a6e0 77 52 65 74 20 3d 20 6f 73 47 65 74 44 69 73 6b  wRet = osGetDisk
1a6f0 46 72 65 65 53 70 61 63 65 41 28 28 63 68 61 72  FreeSpaceA((char
1a700 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a730 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 26 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c  &bytesPerSector,
1a770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20     &dwDummy);.  
1a7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1a7e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1a7f0 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ted);.    }.    
1a800 69 66 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20  if( !dwRet ){.  
1a810 20 20 20 20 62 79 74 65 73 50 65 72 53 65 63 74      bytesPerSect
1a820 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  or = SQLITE_DEFA
1a830 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1a840 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a850 66 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  f.  return (int)
1a860 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b   bytesPerSector;
1a870 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   .}..#ifndef SQL
1a880 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1a890 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
1a8a0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
1a8b0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
1a8c0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
1a8d0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
1a8e0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
1a8f0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
1a900 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
1a910 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
1a920 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
1a930 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
1a940 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
1a950 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
1a960 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
1a970 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
1a980 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
1a990 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
1a9a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
1a9b0 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
1a9c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
1a9d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1a9e0 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
1a9f0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1aa00 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1aa10 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
1aa20 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
1aa30 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1aa40 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1aa50 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1aa60 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   0;.  }.  if( is
1aa70 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20  NT() ){.    h = 
1aa80 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  osLoadLibraryW((
1aa90 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1aaa0 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  ed);./* isNT() i
1aab0 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
1aac0 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
1aad0 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
1aae0 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
1aaf0 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65  ince the ANSI ve
1ab00 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
1ab10 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
1ab20 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
1ab30 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
1ab40 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
1ab50 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
1ab60 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
1ab70 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1ab80 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
1ab90 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
1aba0 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43  braryA((char*)zC
1abb0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
1abc0 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  f.  }.  sqlite3_
1abd0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1abe0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
1abf0 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
1ac00 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
1ac10 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1ac20 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1ac30 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
1ac40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1ac50 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72  fs);.  getLastEr
1ac60 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
1ac70 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
1ac80 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69  BufOut);.}.stati
1ac90 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  c void (*winDlSy
1aca0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
1acb0 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
1acc0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
1acd0 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b  zSymbol))(void){
1ace0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1acf0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
1ad00 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
1ad10 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72  d))osGetProcAddr
1ad20 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61  essA((HANDLE)pHa
1ad30 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
1ad40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
1ad50 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
1ad60 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
1ad70 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
1ad80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1ad90 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69  Vfs);.  osFreeLi
1ada0 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
1adb0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
1adc0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
1add0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1ade0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
1adf0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
1ae00 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
1ae10 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
1ae20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
1ae30 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
1ae40 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
1ae50 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
1ae60 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
1ae70 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
1ae80 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
1ae90 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
1aea0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
1aeb0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1aec0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1aed0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
1aee0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1aef0 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
1af00 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1af10 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
1af20 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
1af30 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
1af40 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
1af50 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
1af60 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
1af70 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
1af80 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
1af90 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
1afa0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
1afb0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
1afc0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
1afd0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
1afe0 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
1aff0 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
1b000 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
1b010 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
1b020 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
1b030 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
1b040 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
1b050 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
1b060 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
1b070 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20  {.    DWORD cnt 
1b080 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
1b090 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
1b0a0 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
1b0b0 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
1b0c0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
1b0d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
1b0e0 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
1b0f0 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  R)<=nBuf-n ){.  
1b100 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
1b110 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65  i;.    osQueryPe
1b120 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
1b130 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&i);.    memcpy
1b140 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73  (&zBuf[n], &i, s
1b150 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e  izeof(i));.    n
1b160 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20   += sizeof(i);. 
1b170 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1b180 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
1b190 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
1b1a0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
1b1b0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1b1c0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  time slept..*/.s
1b1d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65  tatic int winSle
1b1e0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
1b1f0 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73  pVfs, int micros
1b200 65 63 29 7b 0a 20 20 6f 73 53 6c 65 65 70 28 28  ec){.  osSleep((
1b210 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
1b220 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
1b230 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1b240 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
1b250 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
1b260 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
1b270 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1b280 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
1b290 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
1b2a0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1b2b0 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
1b2c0 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
1b2d0 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
1b2e0 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
1b2f0 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
1b300 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
1b310 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
1b320 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1b330 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
1b340 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
1b350 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
1b360 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
1b370 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
1b380 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
1b390 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
1b3a0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
1b3b0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
1b3c0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
1b3d0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
1b3e0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
1b3f0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
1b400 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
1b410 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
1b420 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
1b430 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
1b440 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
1b450 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
1b460 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
1b470 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
1b480 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
1b490 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
1b4a0 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
1b4b0 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
1b4c0 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
1b4d0 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
1b4e0 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
1b4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b500 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b510 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
1b520 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
1b530 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1b540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b550 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
1b560 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
1b570 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
1b580 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
1b590 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
1b5a0 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
1b5b0 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
1b5c0 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
1b5d0 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
1b5e0 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
1b5f0 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
1b600 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
1b610 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
1b620 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
1b630 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1b640 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
1b650 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
1b660 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
1b670 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
1b680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1b690 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
1b6a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
1b6b0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
1b6c0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
1b6d0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
1b6e0 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
1b6f0 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
1b700 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
1b710 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
1b720 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1b730 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
1b740 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71  lue = .      (sq
1b750 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
1b760 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
1b770 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
1b780 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
1b790 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a  t64)294967296;..
1b7a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1b7b0 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
1b7c0 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79   time;.  osGetSy
1b7d0 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
1b7e0 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
1b7f0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
1b800 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
1b810 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
1b820 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  (!osSystemTimeTo
1b830 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26  FileTime(&time,&
1b840 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ft)){.    return
1b850 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b860 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74   }.#else.  osGet
1b870 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
1b880 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
1b890 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  dif..  *piNow = 
1b8a0 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
1b8b0 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   +.            (
1b8c0 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
1b8d0 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
1b8e0 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75  me)*max32BitValu
1b8f0 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
1b900 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
1b910 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65  t64)ft.dwLowDate
1b920 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69  Time)/(sqlite3_i
1b930 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66  nt64)10000;..#if
1b940 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b950 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
1b960 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
1b970 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
1b980 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
1b990 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1b9a0 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
1b9b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
1b9c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1b9d0 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Vfs);.  return S
1b9e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b9f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
1ba00 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
1ba10 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
1ba20 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
1ba30 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
1ba40 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
1ba50 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
1ba60 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
1ba70 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
1ba80 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
1ba90 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
1baa0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1bab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bac0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73  winCurrentTime(s
1bad0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bae0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
1baf0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1bb00 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20  lite3_int64 i;. 
1bb10 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74   rc = winCurrent
1bb20 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20  TimeInt64(pVfs, 
1bb30 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29  &i);.  if( !rc )
1bb40 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69  {.    *prNow = i
1bb50 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d  /86400000.0;.  }
1bb60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bb70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ./*.** The idea 
1bb80 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
1bb90 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65  ction works like
1bba0 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
1bbb0 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  f.** GetLastErro
1bbc0 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65  r() and FormatMe
1bbd0 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f  ssage() on Windo
1bbe0 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64  ws (or errno and
1bbf0 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
1bc00 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72   on Unix). After
1bc10 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1bc20 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a  urned by an OS.*
1bc30 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69  * function, SQLi
1bc40 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
1bc50 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66  nction with zBuf
1bc60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
1bc70 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66  a buffer of nBuf
1bc80 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c   bytes. The OS l
1bc90 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75  ayer should popu
1bca0 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66  late the.** buff
1bcb0 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65  er with a nul-te
1bcc0 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65  rminated UTF-8 e
1bcd0 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73  ncoded error mes
1bce0 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69  sage.** describi
1bcf0 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65  ng the last IO e
1bd00 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63  rror to have occ
1bd10 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  urred within the
1bd20 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65   calling.** thre
1bd30 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
1bd40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1bd50 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
1bd60 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
1bd70 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c  fer,.** it shoul
1bd80 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20  d be truncated. 
1bd90 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1bda0 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f   of xGetLastErro
1bdb0 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  r.** is zero if 
1bdc0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
1bdd0 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
1bde0 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
1bdf0 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
1be00 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
1be10 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49  as truncated). I
1be20 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  f non-zero is re
1be30 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  turned,.** then 
1be40 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1be50 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ary to include t
1be60 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  he nul-terminato
1be70 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  r character.** i
1be80 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
1be90 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73  fer..**.** Not s
1bea0 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f  upplying an erro
1beb0 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68  r message will h
1bec0 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65  ave no adverse e
1bed0 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69  ffect.** on SQLi
1bee0 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74  te. It is fine t
1bef0 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d  o have an implem
1bf00 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65  entation that ne
1bf10 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ver.** returns a
1bf20 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a  n error message:
1bf30 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65  .**.**   int xGe
1bf40 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
1bf50 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1bf60 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1bf70 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65  uf){.**     asse
1bf80 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27  rt(zBuf[0]=='\0'
1bf90 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  );.**     return
1bfa0 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a   0;.**   }.**.**
1bfb0 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65   However if an e
1bfc0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
1bfd0 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c  supplied, it wil
1bfe0 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65  l be incorporate
1bff0 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69  d.** by sqlite i
1c000 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nto the error me
1c010 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20  ssage available 
1c020 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e  to the user usin
1c030 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  g.** sqlite3_err
1c040 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20  msg(), possibly 
1c050 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73  making IO errors
1c060 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67   easier to debug
1c070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c080 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28  winGetLastError(
1c090 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c0a0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
1c0b0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
1c0c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1c0d0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74  s);.  return get
1c0e0 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
1c0f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
1c100 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f  Buf, zBuf);.}../
1c110 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1c120 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65  and deinitialize
1c130 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
1c140 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
1c150 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c160 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20  os_init(void){. 
1c170 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
1c180 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20  vfs winVfs = {. 
1c190 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
1c1a0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
1c1b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
1c1c0 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
1c1d0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
1c1e0 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20     MAX_PATH,    
1c1f0 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
1c200 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
1c230 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20    "win32",      
1c240 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
1c250 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
1c260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1c270 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
1c280 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
1c290 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
1c2a0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
1c2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
1c2c0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
1c2d0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
1c2e0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
1c2f0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
1c300 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
1c310 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
1c320 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
1c330 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
1c340 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
1c350 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
1c360 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
1c370 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
1c380 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
1c390 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
1c3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
1c3b0 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
1c3c0 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
1c3d0 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
1c3e0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c400 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
1c410 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
1c420 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
1c430 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
1c440 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
1c450 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
1c460 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
1c470 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
1c480 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
1c490 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
1c4a0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
1c4b0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
1c4c0 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
1c4d0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
1c4e0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
1c4f0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
1c500 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
1c510 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
1c520 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  };..  /* Double-
1c530 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
1c540 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
1c550 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
1c560 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
1c570 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
1c580 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
1c590 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
1c5a0 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
1c5b0 63 61 6c 6c 29 3d 3d 36 30 20 29 3b 0a 0a 23 69  call)==60 );..#i
1c5c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c5d0 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d  T_WAL.  /* get m
1c5e0 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61  emory map alloca
1c5f0 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79  tion granularity
1c600 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69   */.  memset(&wi
1c610 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  nSysInfo, 0, siz
1c620 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29  eof(SYSTEM_INFO)
1c630 29 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  );.  osGetSystem
1c640 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
1c650 29 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53  );.  assert(winS
1c660 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1c670 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e  ionGranularity >
1c680 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73   0);.#endif..  s
1c690 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1c6a0 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
1c6b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c6c0 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c  _OK; .}..int sql
1c6d0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
1c6e0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
1c6f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
1c700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
1c710 49 4e 20 2a 2f 0a                                IN */.