/ Hex Artifact Content
Login

Artifact e3d3d3e26b65a35d4293d753137a58510bd3299b:


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 4d  mmon.h"../*.** M
02a0: 61 63 72 6f 20 74 6f 20 66 69 6e 64 20 74 68 65  acro to find the
02b0: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74 77 6f 20   minimum of two 
02c0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e 0a  numeric values..
02d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23  */.#ifndef MIN.#
02e0: 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29   define MIN(x,y)
02f0: 20 28 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79   ((x)<(y)?(x):(y
0300: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0310: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
0320: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
0330: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
0340: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
0350: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
0360: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
0370: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
0380: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
0390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
03a0: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
03b0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
03c0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
03d0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
03e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
03f0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0400: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
0410: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
0420: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
0430: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
0440: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
0450: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0460: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0480: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
0490: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
04a0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
04b0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
04c0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
04d0: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
04e0: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43  y */../*.** WinC
04f0: 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73  E lacks native s
0500: 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20  upport for file 
0510: 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61  locking so we ha
0520: 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a  ve to fake it.**
0530: 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20   with some code 
0540: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23  of our own..*/.#
0550: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
0560: 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  CE.typedef struc
0570: 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20  t winceLock {.  
0580: 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20  int nReaders;   
0590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
05a0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62   reader locks ob
05b0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
05c0: 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   bPending;      
05d0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70  /* Indicates a p
05e0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
05f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0600: 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65  .  BOOL bReserve
0610: 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  d;     /* Indica
0620: 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  tes a reserved l
0630: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0640: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0650: 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f  bExclusive;    /
0660: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65  * Indicates an e
0670: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61  xclusive lock ha
0680: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0690: 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a  */.} winceLock;.
06a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
06b0: 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74  e winFile struct
06c0: 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73  ure is a subclas
06d0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
06e0: 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  e* specific to t
06f0: 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74  he win32.** port
0700: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
0710: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0720: 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65   winFile winFile
0730: 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  ;.struct winFile
0740: 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74   {.  const sqlit
0750: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
0760: 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73  Method; /*** Mus
0770: 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a  t be first ***/.
0780: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0790: 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Vfs;      /* The
07a0: 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65   VFS used to ope
07b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
07c0: 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
07d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
07e0: 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  le for accessing
07f0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
0800: 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  8 locktype;     
0810: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
0820: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
0830: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69   held on this fi
0840: 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68  le */.  short sh
0850: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20  aredLockByte;   
0860: 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73  /* Randomly chos
0870: 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20  en byte used as 
0880: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  a shared lock */
0890: 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b  .  u8 ctrlFlags;
08a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
08b0: 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c  ags.  See WINFIL
08c0: 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44  E_* below */.  D
08d0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
08e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
08f0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
0900: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0910: 72 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ror */.  winShm 
0920: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
0930: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
0940: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
0950: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
0960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
0970: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
0980: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
0990: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
09a0: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
09b0: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
09c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
09d0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
09e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
09f0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
0a00: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
0a10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
0a20: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
0a30: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
0a40: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
0a50: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
0a60: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
0a70: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
0a80: 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c  ock */  .  HANDL
0a90: 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20  E hShared;      
0aa0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
0ab0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64  ory segment used
0ac0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a   for locking */.
0ad0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61    winceLock loca
0ae0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63  l;        /* Loc
0af0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74  ks obtained by t
0b00: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
0b10: 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  winFile */.  win
0b20: 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20  ceLock *shared; 
0b30: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
0b40: 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72  hared lock memor
0b50: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20  y for the file  
0b60: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
0b70: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0b80: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
0b90: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
0ba0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
0bb0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
0bc0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
0bd0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
0be0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
0bf0: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
0c00: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
0c10: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
0c20: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
0c30: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
0c40: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
0c50: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
0c60: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
0c70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0c80: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
0c90: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
0cb0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
0cc0: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
0cd0: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
0ce0: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
0cf0: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
0d00: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
0d10: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
0d20: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
0d30: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
0d40: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
0d50: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
0d60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
0d70: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
0d80: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
0d90: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
0da0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
0db0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
0dc0: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
0dd0: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
0de0: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
0df0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
0e00: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
0e10: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
0e20: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
0e30: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
0e40: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
0e50: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
0e60: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
0e70: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
0e80: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
0e90: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
0ea0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
0eb0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f00: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
0f10: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
0f20: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
0f30: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
0f40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
0f50: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
0f60: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
0f70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
0f80: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
0f90: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
0fa0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
0fb0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
0fc0: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
0fd0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
0fe0: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
0ff0: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
1000: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
1010: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
1020: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
1030: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
1040: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
1050: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
1060: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
1070: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
1080: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
10e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f0: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
1100: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1110: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
1120: 45 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23  EATE    (TRUE).#
1130: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1140: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
1150: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1160: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1170: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1180: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
1190: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
11a0: 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65  _INIT_SIZE.#  de
11b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
11c0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
11d0: 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   ((SQLITE_DEFAUL
11e0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20  T_CACHE_SIZE) * 
11f0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
1220: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1230: 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23  ZE) + 4194304).#
1240: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1250: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
1260: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1270: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1280: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1290: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
12a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
12b0: 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66  _MAX_SIZE.#  def
12c0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
12d0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20  _HEAP_MAX_SIZE  
12e0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (0).#endif../*. 
12f0: 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67  * The extra flag
1300: 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c  s to use in call
1310: 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68  s to the Win32 h
1320: 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20  eap APIs.  This 
1330: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20  value may be. * 
1340: 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66  zero for the def
1350: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20  ault behavior.. 
1360: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1370: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
1380: 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  GS.#  define SQL
1390: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
13a0: 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e  LAGS     (0).#en
13b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  dif../*.** The w
13c0: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
13d0: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
13e0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
13f0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
1400: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
1410: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
1420: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
1430: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1440: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
1450: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
1460: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
1470: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
1480: 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69  agic;    /* Magi
1490: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
14a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
14b0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
14c0: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
14d0: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
14e0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
14f0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
1500: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
1510: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
1520: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
1530: 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  own)? */.};..#if
1540: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
1550: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
1560: 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a       0x42b2830b.
1570: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73  #endif..static s
1580: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
1590: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20   win_mem_data = 
15a0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
15b0: 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c  .  WINMEM_MAGIC,
15c0: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
15d0: 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65  FALSE.};..#ifnde
15e0: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
15f0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
1600: 69 63 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  ic() assert( win
1610: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d  _mem_data.magic=
1620: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a  =WINMEM_MAGIC ).
1630: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
1640: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
1650: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
1660: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
1670: 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68  ) win_mem_data.h
1680: 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69  Heap..static voi
1690: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
16a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
16b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
16c0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
16d0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
16e0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
16f0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
1700: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
1710: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
1720: 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20  oid *p);.static 
1730: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
1740: 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63  p(int n);.static
1750: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
1760: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
1770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1780: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
1790: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f   *pAppData);..co
17a0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
17b0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
17c0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
17d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
17f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1800: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1810: 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20  e is (normally) 
1820: 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76  set once and nev
1830: 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  er changes.** th
1840: 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65  ereafter.  It re
1850: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68  cords whether th
1860: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1870: 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f  em is Win9x.** o
1880: 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30  r WinNT..**.** 0
1890: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
18a0: 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  stem unknown..**
18b0: 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   1:   Operating 
18c0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e  system is Win9x.
18d0: 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69  .** 2:   Operati
18e0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
18f0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  NT..**.** In ord
1900: 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  er to facilitate
1910: 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69   testing on a Wi
1920: 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20  nNT system, the 
1930: 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20  test fixture.** 
1940: 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74  can manually set
1950: 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31   this value to 1
1960: 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39   to emulate Win9
1970: 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23  8 behavior..*/.#
1980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1990: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  T.int sqlite3_os
19a0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65  _type = 0;.#else
19b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
19c0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
19d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
19e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
19f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1a00: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
1a10: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1a20: 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  I.#endif..#if SQ
1a30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1a40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54   SQLITE_OS_WINNT
1a50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
1a60: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1a70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1a80: 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  IDE.#endif..#ifn
1a90: 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64  def SYSCALL.#  d
1aa0: 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71  efine SYSCALL sq
1ab0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
1ac0: 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  r.#endif../*.** 
1ad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ae0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
1af0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20  n Windows CE or 
1b00: 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20  WinRT.. */..#if 
1b10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1b20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1b30: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41  RT.#  define osA
1b40: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
1b50: 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a         1.#endif.
1b60: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
1b70: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
1b80: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
1b90: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
1ba0: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
1bb0: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
1bc0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
1bd0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
1be0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
1bf0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
1c00: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
1c10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1c20: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
1c30: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
1c40: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
1c50: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
1c60: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
1c70: 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63   struct win_sysc
1c80: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
1c90: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
1ca0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1cb0: 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20   the sytem call 
1cc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
1cd0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
1ce0: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
1cf0: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
1d00: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
1d10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
1d20: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
1d30: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
1d40: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
1d50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1d60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
1d70: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
1d80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1da0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
1db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1dc0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1dd0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1e10: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
1e20: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
1e30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1e40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1e50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1e60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1e70: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
1e80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1e90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ea0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1eb0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
1ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
1ed0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
1ee0: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
1ef0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
1f00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1f10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1f20: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1f40: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
1f50: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
1f60: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
1f70: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
1f80: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
1f90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fa0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
1fb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1fc0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
1fd0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
1fe0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
1ff0: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
2000: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2010: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
2020: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2030: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2060: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
2070: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
2080: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
2090: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
20a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
20b0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
20c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
20d0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
20e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
20f0: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
2100: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
2110: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
2120: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2140: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2150: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
2160: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
2170: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2180: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
2190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
21a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
21b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
21c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21f0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2200: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
2210: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
2220: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
2230: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
2240: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
2250: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
2260: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
2270: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
2280: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2290: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
22a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
22b0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
22d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
22e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
22f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
2300: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
2310: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2320: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2330: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2340: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2350: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
2360: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2370: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
2380: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
2390: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
23a0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
23b0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
23c0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
23d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
23e0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
23f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2400: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
2410: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
2420: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2430: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
2440: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
2450: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2460: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
2470: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
24a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
24b0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
24c0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
24d0: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
24e0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
24f0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
2500: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
2510: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2520: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2540: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2550: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2560: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
2570: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
2580: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
2590: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
25a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
25b0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
25c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
25d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
25f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2600: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
2610: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
2620: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
2630: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
2640: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
2650: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
2660: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2670: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2680: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2690: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
26a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
26b0: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
26d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
26e0: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
26f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2700: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2710: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2720: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2730: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
2740: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
2750: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
2760: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2780: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2790: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
27b0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
27c0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
27d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
27e0: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
27f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2800: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2820: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2830: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
2840: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
2850: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
2860: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
2870: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2880: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
2890: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
28a0: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
28b0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
28c0: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
28d0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
28e0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
28f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2910: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2920: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
2930: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
2940: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
2950: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
2960: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
2970: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 30  IME))aSyscall[10
2980: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2990: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
29a0: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
29b0: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
29c0: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
29d0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
29e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
29f0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
2a00: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
2a10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2a30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2a40: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
2a50: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
2a60: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2a70: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2a80: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
2a90: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  E))aSyscall[11].
2aa0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2ab0: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
2ac0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
2ad0: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
2ae0: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
2af0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
2b00: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
2b10: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
2b20: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  DLE))aSyscall[12
2b30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2b40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b50: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2b60: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2b70: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
2b80: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
2b90: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
2ba0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2bb0: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2bc0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2bd0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2bf0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c00: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
2c10: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
2c20: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
2c30: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
2c40: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2c50: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2c60: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
2c70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2c80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2c90: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
2ca0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
2cb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2cc0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
2cd0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
2ce0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
2cf0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
2d00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2d30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
2d40: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
2d50: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
2d60: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
2d70: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
2d80: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
2d90: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2da0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
2db0: 0a 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ..  { "FreeLibra
2dc0: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
2dd0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
2de0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
2df0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2e00: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
2e10: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
2e20: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
2e30: 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [15].pCurrent)..
2e40: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
2e50: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
2e60: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
2e70: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
2e80: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2e90: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2ea0: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
2eb0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
2ec0: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
2ed0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
2ee0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
2ef0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2f00: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2f10: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2f20: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
2f30: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
2f40: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
2f50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
2f60: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2f70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2fa0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
2fb0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2fc0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2fd0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
2fe0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
2ff0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
3000: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  RD))aSyscall[17]
3010: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3020: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
3030: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
3040: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3050: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3060: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
3070: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
3080: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3090: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
30a0: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
30b0: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
30c0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
30d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3100: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
3110: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
3120: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3130: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
3140: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
3150: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
3160: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3170: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3180: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3190: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
31a0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
31b0: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
31c0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
31d0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
31e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
31f0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
3200: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3210: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3220: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3230: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3240: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3250: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
3260: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
3270: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3280: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3290: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
32a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
32b0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
32c0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
32d0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
32e0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
32f0: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
3300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
3310: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3320: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3360: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3370: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
3380: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
3390: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
33a0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
33b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
33c0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
33d0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
33e0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
33f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3400: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
3410: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3420: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3430: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3460: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
3470: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
3480: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3490: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
34a0: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
34b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
34c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70  ))aSyscall[21].p
34d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
34e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
34f0: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
3500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3510: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
3520: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
3530: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3540: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
3550: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3560: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3570: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3580: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3590: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
35a0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
35b0: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
35c0: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
35d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
35e0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
35f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3600: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3610: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3620: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
3630: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
3640: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
3650: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3660: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
3670: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3680: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3690: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
36a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
36b0: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
36c0: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
36d0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
36e0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
36f0: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
3700: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
3710: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3720: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
3730: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3740: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3750: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3760: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
3770: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
3780: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
3790: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
37a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
37b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
37c0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
37d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
37e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
37f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3800: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
3810: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
3820: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
3830: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
3840: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
3850: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
3860: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
3870: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
3880: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3890: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
38a0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
38b0: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
38c0: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
38d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
38e0: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
38f0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3900: 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47  WINCE.  /* The G
3910: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29  etProcAddressA()
3920: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
3930: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
3940: 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b  ndows CE. */.  {
3950: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
3960: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
3970: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
3980: 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30 20  essA,         0 
3990: 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c  },.#else.  /* Al
39a0: 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20  l other Windows 
39b0: 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74  platforms expect
39c0: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
39d0: 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61  ) to take.  ** a
39e0: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65  n ANSI string re
39f0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
3a00: 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67  _UNICODE setting
3a10: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
3a20: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
3a30: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
3a40: 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20 20  rocAddress,     
3a50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3a60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
3a70: 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41  rocAddressA ((FA
3a80: 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48  RPROC(WINAPI*)(H
3a90: 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20  MODULE, \.      
3aa0: 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61    LPCSTR))aSysca
3ab0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
3ac0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3ad0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53  _WINRT.  { "GetS
3ae0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
3af0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3b00: 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  etSystemInfo,   
3b10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3b20: 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  se.  { "GetSyste
3b30: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3b40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3b70: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
3b80: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
3b90: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
3ba0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
3bb0: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
3bc0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
3bd0: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  me",           (
3be0: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
3bf0: 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  mTime,          
3c00: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3c10: 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28  sGetSystemTime (
3c20: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
3c30: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
3c40: 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65  scall[28].pCurre
3c50: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
3c60: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47  _OS_WINCE.  { "G
3c70: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
3c80: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
3c90: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  L)GetSystemTimeA
3ca0: 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  sFileTime, 0 },.
3cb0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79  #else.  { "GetSy
3cc0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3cd0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d00: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3d10: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
3d20: 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  eTime ((VOID(WIN
3d30: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
3d40: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
3d50: 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65  scall[29].pCurre
3d60: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3d70: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3d80: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3d90: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
3da0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3db0: 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20  GetTempPathA,   
3dc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3dd0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  lse.  { "GetTemp
3de0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
3df0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
3e30: 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44  empPathA ((DWORD
3e40: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
3e50: 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  LPSTR))aSyscall[
3e60: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
3e70: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3e80: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3e90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3ea0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
3eb0: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
3ec0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3ed0: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
3ee0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3ef0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
3f00: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3f10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3f40: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
3f50: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
3f60: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
3f70: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
3f80: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
3f90: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3fa0: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
3fb0: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
3fc0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
3fd0: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
3fe0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3ff0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
4000: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4010: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4040: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
4050: 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  unt ((DWORD(WINA
4060: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4070: 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74  all[32].pCurrent
4080: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4090: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
40a0: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65  ANSI).  { "GetVe
40b0: 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20  rsionExA",      
40c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
40d0: 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20  tVersionExA,    
40e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40f0: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
4100: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
4110: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4140: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
4150: 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57  sionExA ((BOOL(W
4160: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
4170: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
4180: 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  FOA))aSyscall[33
4190: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
41a0: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
41c0: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41e0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
41f0: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
4200: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4210: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4220: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4230: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[34].pCurrent)
4240: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4250: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
4260: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
4270: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4280: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
4290: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
42a0: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
42b0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
42c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
42f0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
4300: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
4310: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
4320: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
4330: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
4340: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
4350: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4360: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
4370: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
4380: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4390: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
43a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43b0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
43c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
43d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4400: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
4410: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
4420: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
4430: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
4440: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
4450: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
4460: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4470: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
4480: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4490: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
44a0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
44b0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
44c0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d  ID))aSyscall[37]
44d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
44e0: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
44f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4500: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4520: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
4530: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
4540: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
4550: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
4560: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4570: 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70  ))aSyscall[38].p
4580: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
4590: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
45a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
45b0: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
45c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
45d0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
45e0: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
45f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4600: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4610: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
4620: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  39].pCurrent)..#
4630: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4640: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
4650: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
4660: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
4670: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
4680: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4690: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
46a0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
46b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
46e0: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
46f0: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
4700: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4710: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
4720: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
4730: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4740: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4750: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4760: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4770: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
4780: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
4790: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
47a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
47b0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
47d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4800: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
4810: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
4820: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
4830: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
4840: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4850: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4870: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4880: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
4890: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
48a0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
48b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
48c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
48d0: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
48e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
48f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4900: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4910: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4920: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
4930: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
4940: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4950: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
4960: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4970: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
4980: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
4990: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
49a0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
49b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
49c0: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
49d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
49e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a00: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4a10: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
4a20: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
4a30: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
4a40: 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72  yscall[43].pCurr
4a50: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4a60: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
4a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4a80: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4aa0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4ad0: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
4ae0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4af0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4b20: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
4b30: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
4b40: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4b50: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
4b60: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4b70: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
4b80: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
4b90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
4ba0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4bb0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4bd0: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
4be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
4bf0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
4c00: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4c10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c20: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c40: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
4c50: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
4c60: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
4c70: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
4c80: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4c90: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4ca0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
4cb0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
4cc0: 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[45].pCurrent)
4cd0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
4ce0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4cf0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
4d00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4d10: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
4d20: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ile,           0
4d30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
4d40: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
4d50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4d70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4d80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4d90: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20  osMapViewOfFile 
4da0: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
4db0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4dc0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4dd0: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
4de0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
4df0: 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69  ent)..  { "Multi
4e00: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c  ByteToWideChar",
4e10: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75       (SYSCALL)Mu
4e20: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
4e30: 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  r,     0 },..#de
4e40: 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65  fine osMultiByte
4e50: 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74  ToWideChar ((int
4e60: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
4e70: 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c  WORD,LPCSTR,int,
4e80: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4e90: 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b    int))aSyscall[
4ea0: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  47].pCurrent).. 
4eb0: 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d   { "QueryPerform
4ec0: 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53  anceCounter", (S
4ed0: 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66  YSCALL)QueryPerf
4ee0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20  ormanceCounter, 
4ef0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4f00: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
4f10: 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57  Counter ((BOOL(W
4f20: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
4f30: 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
4f40: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  *))aSyscall[48].
4f50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4f60: 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20  ReadFile",      
4f70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f80: 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20  LL)ReadFile,    
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4fa0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ..#define osRead
4fb0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
4fc0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f  PI*)(HANDLE,LPVO
4fd0: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
4fe0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
4ff0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
5000: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
5010: 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46  ..  { "SetEndOfF
5020: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5030: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64   (SYSCALL)SetEnd
5040: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
5050: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5060: 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20   osSetEndOfFile 
5070: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5080: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
5090: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
50a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
50b0: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
50c0: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
50d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
50e0: 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20  FilePointer,    
50f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5100: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5110: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
5120: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5150: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
5160: 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28  Pointer ((DWORD(
5170: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5180: 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20  LONG,PLONG, \.  
5190: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
51a0: 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65  scall[51].pCurre
51b0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
51c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
51d0: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
51e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
51f0: 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  L)Sleep,        
5200: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5210: 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70  #else.  { "Sleep
5220: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5230: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5260: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c  if..#define osSl
5270: 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50  eep ((VOID(WINAP
5280: 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63  I*)(DWORD))aSysc
5290: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
52a0: 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69  )..  { "SystemTi
52b0: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20  meToFileTime",  
52c0: 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65    (SYSCALL)Syste
52d0: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c  mTimeToFileTime,
52e0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
52f0: 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  e osSystemTimeTo
5300: 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28  FileTime ((BOOL(
5310: 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53  WINAPI*)(CONST S
5320: 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20  YSTEMTIME*, \.  
5330: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
5340: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
5350: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5370: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
5380: 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  RT.  { "UnlockFi
5390: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
53a0: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
53b0: 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  kFile,          
53c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
53d0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
53f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5420: 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  ndef osUnlockFil
5430: 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f  e.#define osUnlo
5440: 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  ckFile ((BOOL(WI
5450: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5460: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5470: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5480: 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70  ))aSyscall[54].p
5490: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
54a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
54b0: 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINCE.  { "Unloc
54c0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
54d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
54e0: 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  lockFileEx,     
54f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5500: 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  e.  { "UnlockFil
5510: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
5520: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5550: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
5560: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
5570: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5580: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5590: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
55a0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
55b0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
55c0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
55d0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
55e0: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
55f0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
5600: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5610: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
5620: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
5630: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
5640: 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74  all[56].pCurrent
5650: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
5660: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
5670: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
5680: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
5690: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
56a0: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
56b0: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
56c0: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
56d0: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
56e0: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
56f0: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
5700: 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70  ))aSyscall[57].p
5710: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
5720: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
5730: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5740: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
5750: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5760: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
5770: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
5780: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
5790: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
57a0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
57b0: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
57c0: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
57d0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
57e0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
57f0: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
5800: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
5810: 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20  reateEventExW,  
5820: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5830: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  se.  { "CreateEv
5840: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
5850: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5880: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
5890: 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44  eEventExW ((HAND
58a0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
58b0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
58c0: 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  S,LPCWSTR, \.   
58d0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
58e0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70  ))aSyscall[59].p
58f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5900: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5910: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
5920: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
5930: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
5940: 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20  ngleObject,     
5950: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5960: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
5970: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
5980: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5990: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
59a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
59b0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
59c0: 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57  Object ((DWORD(W
59d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
59e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
59f0: 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43  )aSyscall[60].pC
5a00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5a10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5a20: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
5a30: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
5a40: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
5a50: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
5a60: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
5a70: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
5a80: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
5a90: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5aa0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5ab0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5ac0: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
5ad0: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
5ae0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5af0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5b00: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
5b10: 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  61].pCurrent)..#
5b20: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5b30: 4e 43 45 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NCE.  { "SetFile
5b40: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
5b50: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
5b60: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
5b70: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5b80: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
5b90: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
5ba0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5bd0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
5be0: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
5bf0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5c00: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
5c10: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
5c20: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
5c30: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
5c40: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
5c50: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5c60: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
5c70: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
5c80: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
5c90: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
5ca0: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
5cb0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
5cc0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
5cd0: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5d00: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
5d10: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
5d20: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
5d30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
5d40: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
5d50: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
5d60: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
5d70: 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75  aSyscall[63].pCu
5d80: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
5d90: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5da0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  "MapViewOfFileFr
5db0: 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43  omApp",    (SYSC
5dc0: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
5dd0: 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d  eFromApp,    0 }
5de0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
5df0: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
5e00: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
5e10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5e20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5e30: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5e40: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
5e50: 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49  mApp ((LPVOID(WI
5e60: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c  NAPI*)(HANDLE,UL
5e70: 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20  ONG,ULONG64, \. 
5e80: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
5e90: 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72  Syscall[64].pCur
5ea0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
5eb0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5ec0: 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20  CreateFile2",   
5ed0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5ee0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20  LL)CreateFile2, 
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5f00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
5f10: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
5f20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5f40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5f50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
5f60: 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e  reateFile2 ((HAN
5f70: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
5f80: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
5f90: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5fa0: 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f    LPCREATEFILE2_
5fb0: 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
5fc0: 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 35  ERS))aSyscall[65
5fd0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5fe0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
5ff0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
6000: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
6010: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63  (SYSCALL)LoadPac
6020: 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20  kagedLibrary,   
6030: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6040: 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69   "LoadPackagedLi
6050: 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53  brary",     (SYS
6060: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6080: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6090: 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65  ne osLoadPackage
60a0: 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55  dLibrary ((HMODU
60b0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
60c0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
60d0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
60e0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
60f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
6100: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
6110: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
6120: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
6130: 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20  kCount64,       
6140: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6150: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  { "GetTickCount6
6160: 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  4",          (SY
6170: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6190: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
61a0: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
61b0: 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47  nt64 ((ULONGLONG
61c0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
61d0: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
61e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
61f0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6200: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
6210: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
6220: 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73  ALL)GetNativeSys
6230: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d  temInfo,     0 }
6240: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6250: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
6260: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6270: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6280: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6290: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
62a0: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
62b0: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
62c0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
62d0: 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53  PSYSTEM_INFO))aS
62e0: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
62f0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
6300: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6310: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75  AS_ANSI).  { "Ou
6320: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
6330: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
6340: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
6350: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
6360: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
6370: 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20  DebugStringA",  
6380: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
63b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
63c0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20  putDebugStringA 
63d0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
63e0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
63f0: 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [69].pCurrent)..
6400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6410: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
6420: 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  E).  { "OutputDe
6430: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
6440: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
6450: 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20  tDebugStringW,  
6460: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6470: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
6480: 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  tringW",      (S
6490: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
64c0: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
64d0: 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44  ugStringW ((VOID
64e0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
64f0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e  R))aSyscall[70].
6500: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6510: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c  GetProcessHeap",
6520: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6530: 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61  LL)GetProcessHea
6540: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
6550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
6560: 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e  rocessHeap ((HAN
6570: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  DLE(WINAPI*)(VOI
6580: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e  D))aSyscall[71].
6590: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
65a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
65b0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
65c0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
65d0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
65e0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
65f0: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
6600: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
6610: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
6620: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6640: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6650: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
6660: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28  appingFromApp ((
6670: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
6680: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
6690: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
66a0: 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c  RIBUTES,ULONG,UL
66b0: 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61  ONG64,LPCWSTR))a
66c0: 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72  Syscall[72].pCur
66d0: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
66e0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
66f0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
6700: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
6710: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
6720: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
6730: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
6740: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
6750: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
6760: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6770: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
6780: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
6790: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
67a0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
67b0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
67c0: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
67d0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
67e0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
67f0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6800: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
6810: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
6820: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
6830: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
6840: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
6850: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
6860: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
6870: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6880: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
6890: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
68a0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
68b0: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
68c0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
68d0: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
68e0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
68f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
6900: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
6910: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
6920: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
6930: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
6940: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
6950: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
6960: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
6970: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
6980: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
6990: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
69a0: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
69b0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
69c0: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
69d0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
69e0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
69f0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
6a00: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
6a10: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
6a20: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
6a30: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
6a40: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
6a50: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
6a60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6a70: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
6a80: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
6a90: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
6aa0: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
6ab0: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
6ac0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
6ad0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6ae0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
6af0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
6b00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
6b10: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
6b20: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
6b30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
6b40: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
6b50: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
6b60: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
6b70: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
6b80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
6b90: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
6ba0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6bb0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
6bc0: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
6bd0: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
6be0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
6bf0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
6c00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
6c10: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
6c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6c40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6c50: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
6c60: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
6c70: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
6c80: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
6c90: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
6ca0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
6cb0: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
6cc0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
6cd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
6ce0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
6cf0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
6d00: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
6d10: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
6d20: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
6d30: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
6d40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6d50: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
6d60: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
6d70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
6d80: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
6d90: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
6da0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
6db0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
6dc0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
6dd0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
6de0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
6df0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
6e00: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
6e10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6e20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6e30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
6e40: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
6e50: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
6e60: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
6e70: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
6e80: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
6e90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
6ea0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
6eb0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
6ec0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
6ed0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
6ee0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
6ef0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
6f00: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
6f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
6f20: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
6f30: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
6f40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
6f50: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
6f60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6f70: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
6f80: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
6f90: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
6fa0: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
6fb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
6fc0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
6fd0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
6fe0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
6ff0: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
7000: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7010: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
7020: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
7030: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
7040: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
7050: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
7060: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7070: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
7080: 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69  utputs the speci
7090: 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69  fied (ANSI) stri
70a0: 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ng to the Win32 
70b0: 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20  debugger.** (if 
70c0: 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a  available)..*/..
70d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
70e0: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63  32_write_debug(c
70f0: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
7100: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
7110: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
7120: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
7130: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
7140: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
7150: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
7160: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
7170: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
7180: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
7190: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
71a0: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
71b0: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
71c0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
71d0: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
71e0: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
71f0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7200: 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   );.#if defined(
7210: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7220: 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69  _ANSI).  if( nMi
7230: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
7240: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
7250: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
7260: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
7270: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
7280: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f  uf, nMin);.    o
7290: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
72a0: 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20  ngA(zDbgBuf);.  
72b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74  }else{.    osOut
72c0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
72d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66  zBuf);.  }.#elif
72e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
72f0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
7300: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
7310: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
7320: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
7330: 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42  .  if ( osMultiB
7340: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20  yteToWideChar(. 
7350: 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69           osAreFi
7360: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
7370: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
7380: 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  , 0, zBuf,.     
7390: 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53       nMin, (LPWS
73a0: 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49  TR)zDbgBuf, SQLI
73b0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
73c0: 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48  _SIZE/sizeof(WCH
73d0: 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72  AR))<=0 ){.    r
73e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f  eturn;.  }.  osO
73f0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7400: 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42  W((LPCWSTR)zDbgB
7410: 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
7420: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
7430: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
7440: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
7450: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
7460: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
7470: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
7480: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7490: 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66  r, "%s", zDbgBuf
74a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
74b0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
74c0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
74d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
74e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
74f0: 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20  outine suspends 
7500: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
7510: 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  ad for at least 
7520: 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e  ms.** millisecon
7530: 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75  ds.  This is equ
7540: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57  ivalent to the W
7550: 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74  in32 Sleep() int
7560: 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53  erface..*/.#if S
7570: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73  QLITE_OS_WINRT.s
7580: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65  tatic HANDLE sle
7590: 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65  epObj = NULL;.#e
75a0: 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ndif..void sqlit
75b0: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44  e3_win32_sleep(D
75c0: 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  WORD millisecond
75d0: 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s){.#if SQLITE_O
75e0: 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73  S_WINRT.  if ( s
75f0: 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b  leepObj==NULL ){
7600: 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
7610: 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  osCreateEventExW
7620: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45  (NULL, NULL, CRE
7630: 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c  ATE_EVENT_MANUAL
7640: 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20  _RESET,.        
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 20 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e          SYNCHRON
7670: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  IZE);.  }.  asse
7680: 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  rt( sleepObj!=NU
7690: 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f  LL );.  osWaitFo
76a0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
76b0: 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73  sleepObj, millis
76c0: 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a  econds, FALSE);.
76d0: 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28  #else.  osSleep(
76e0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23  milliseconds);.#
76f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
7700: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
7710: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
7720: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
7730: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
7740: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
7750: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
7760: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
7770: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
7780: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
7790: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
77a0: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
77b0: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
77c0: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
77d0: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
77e0: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
77f0: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
7800: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
7810: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
7820: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
7830: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
7840: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
7850: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
7860: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
7870: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
7880: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
7890: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
78a0: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
78b0: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
78c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
78d0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
78e0: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
78f0: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
7900: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
7910: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
7920: 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73  INRT.# define is
7930: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
7940: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
7950: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
7960: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
7970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
7980: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
7990: 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64  o;.      sInfo.d
79a0: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
79b0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
79c0: 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56  o);.      osGetV
79d0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
79e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
79f0: 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f  _os_type = sInfo
7a00: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56  .dwPlatformId==V
7a10: 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33  ER_PLATFORM_WIN3
7a20: 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20  2_NT ? 2 : 1;.  
7a30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
7a40: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d  qlite3_os_type==
7a50: 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  2;.  }.#endif /*
7a60: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7a70: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
7a80: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
7a90: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
7aa0: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e  Bytes of memory.
7ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7ac0: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
7ad0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
7ae0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
7af0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
7b00: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
7b10: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
7b20: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
7b30: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
7b40: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
7b50: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
7b60: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
7b70: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
7b80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
7b90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
7ba0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28  DATE).  assert (
7bb0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
7bc0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
7bd0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
7be0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
7bf0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
7c00: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
7c10: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
7c20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
7c30: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
7c40: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
7c50: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
7c60: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
7c70: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
7c80: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
7c90: 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  s (%d), heap=%p"
7ca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7cb0: 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c    nBytes, osGetL
7cc0: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
7cd0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
7ce0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7cf0: 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e  .** Free memory.
7d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7d10: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
7d20: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44  *pPrior){.  HAND
7d30: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
7d40: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
7d50: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
7d60: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
7d70: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
7d80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
7d90: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
7da0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
7db0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7dc0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
7dd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
7de0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
7df0: 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64  rt ( osHeapValid
7e00: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
7e10: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7e20: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
7e30: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
7e40: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
7e50: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
7e60: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
7e70: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
7e80: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
7e90: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
7ea0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
7eb0: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
7ec0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
7ed0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
7ee0: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
7ef0: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
7f00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7f10: 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74     pPrior, osGet
7f20: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
7f30: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
7f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
7f50: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  the size of an e
7f60: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
7f70: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
7f80: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
7f90: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
7fa0: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
7fb0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
7fc0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
7fd0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
7fe0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
7ff0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
8000: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
8010: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8020: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
8030: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
8040: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
8050: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
8060: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
8070: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
8080: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
8090: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
80a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
80b0: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
80c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
80d0: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
80e0: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
80f0: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
8100: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
8110: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8120: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
8130: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
8140: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
8150: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
8160: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8170: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
8180: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
8190: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
81a0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
81b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
81c0: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
81d0: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
81e0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
81f0: 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65      pPrior ? "He
8200: 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65  apReAlloc" : "He
8210: 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73  apAlloc", nBytes
8220: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
8230: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
8240: 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70      (void*)hHeap
8250: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8260: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
8270: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
8280: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c  n outstanding al
8290: 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74  location, in byt
82a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
82b0: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
82c0: 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20  d *p){.  HANDLE 
82d0: 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20  hHeap;.  SIZE_T 
82e0: 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  n;..  winMemAsse
82f0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
8300: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
8310: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
8320: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8330: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
8340: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8350: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
8360: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
8370: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8380: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
8390: 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  E).  assert ( os
83a0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
83b0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
83c0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
83d0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  L) );.#endif.  i
83e0: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
83f0: 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69  ;.  n = osHeapSi
8400: 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ze(hHeap, SQLITE
8410: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8420: 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  S, p);.  if( n==
8430: 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20  (SIZE_T)-1 ){.  
8440: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
8450: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
8460: 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20  led to HeapSize 
8470: 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68  block %p (%d), h
8480: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
8490: 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65           p, osGe
84a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
84b0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20  oid*)hHeap);.   
84c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
84d0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a   return (int)n;.
84e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75  }../*.** Round u
84f0: 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65  p a request size
8500: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c   to the next val
8510: 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  id allocation si
8520: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
8530: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
8540: 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e  int n){.  return
8550: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   n;.}../*.** Ini
8560: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
8570: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ule..*/.static i
8580: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
8590: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
85a0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69   winMemData *pWi
85b0: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d  nMemData = (winM
85c0: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74  emData *)pAppDat
85d0: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  a;..  if( !pWinM
85e0: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20  emData ) return 
85f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8600: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
8610: 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d  ata->magic==WINM
8620: 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23 69 66  EM_MAGIC );..#if
8630: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
8640: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
8650: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
8660: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
8670: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70  ->hHeap ){.    p
8680: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
8690: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
86a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
86b0: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
86f0: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20  P_INIT_SIZE,.   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
8730: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a  HEAP_MAX_SIZE);.
8740: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
8750: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
8760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
8770: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
8780: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
8790: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
87a0: 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69  %d), flags=%u, i
87b0: 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53  nitSize=%u, maxS
87c0: 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20 20  ize=%u",.       
87d0: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
87e0: 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  r(), SQLITE_WIN3
87f0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20  2_HEAP_FLAGS,.  
8800: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
8810: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
8820: 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  IZE, SQLITE_WIN3
8830: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
8840: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8850: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8860: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
8870: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55  ta->bOwned = TRU
8880: 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  E;.    assert( p
8890: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
88a0: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  ed );.  }.#else.
88b0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
88c0: 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63  Heap = osGetProc
88d0: 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28  essHeap();.  if(
88e0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
88f0: 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Heap ){.    sqli
8900: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
8910: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66  OMEM,.        "f
8920: 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63  ailed to GetProc
8930: 65 73 73 48 65 61 70 20 28 25 64 29 22 2c 20 6f  essHeap (%d)", o
8940: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
8950: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8960: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
8970: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
8980: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
8990: 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d  assert( !pWinMem
89a0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
89b0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
89c0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
89d0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
89e0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
89f0: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
8a00: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
8a10: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
8a20: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
8a30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
8a40: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
8a50: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
8a60: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
8a70: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
8a80: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8a90: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
8aa0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
8ab0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8ac0: 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   Deinitialize th
8ad0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
8ae0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
8af0: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
8b00: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
8b10: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
8b20: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
8b30: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
8b40: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
8b50: 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  a ) return;.  if
8b60: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
8b70: 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  Heap ){.    asse
8b80: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
8b90: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
8ba0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
8bb0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
8bc0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
8bd0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
8be0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
8bf0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
8c00: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
8c10: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
8c20: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8c30: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
8c40: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57  endif.    if( pW
8c50: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
8c60: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  d ){.      if( !
8c70: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57  osHeapDestroy(pW
8c80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
8c90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
8ca0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
8cb0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
8cc0: 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25  o HeapDestroy (%
8cd0: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
8d00: 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d  (), (void*)pWinM
8d10: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a  emData->hHeap);.
8d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
8d30: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
8d40: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
8d50: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
8d60: 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a  ->hHeap = NULL;.
8d70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70    }.}../*.** Pop
8d80: 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65  ulate the low-le
8d90: 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  vel memory alloc
8da0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70  ation function p
8db0: 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71  ointers in.** sq
8dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
8dd0: 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72  g.m with pointer
8de0: 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65  s to the routine
8df0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20  s in this file. 
8e00: 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  The.** arguments
8e10: 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f   specify the blo
8e20: 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
8e30: 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  manage..**.** Th
8e40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
8e50: 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
8e60: 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61  ite3_config(), a
8e70: 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20  nd therefore.** 
8e80: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
8e90: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
8ea0: 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f   (it is not)..*/
8eb0: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
8ec0: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
8ed0: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76  te3MemGetWin32(v
8ee0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
8ef0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
8f00: 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d  _methods winMemM
8f10: 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77  ethods = {.    w
8f20: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20  inMemMalloc,.   
8f30: 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20   winMemFree,.   
8f40: 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a   winMemRealloc,.
8f50: 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a      winMemSize,.
8f60: 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75      winMemRoundu
8f70: 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69  p,.    winMemIni
8f80: 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75  t,.    winMemShu
8f90: 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f  tdown,.    &win_
8fa0: 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20  mem_data.  };.  
8fb0: 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65  return &winMemMe
8fc0: 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73  thods;.}..void s
8fd0: 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61  qlite3MemSetDefa
8fe0: 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ult(void){.  sql
8ff0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
9000: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
9010: 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57  , sqlite3MemGetW
9020: 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69  in32());.}.#endi
9030: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
9040: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
9050: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
9060: 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  -8 string to Mic
9070: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28  rosoft Unicode (
9080: 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a  UTF-16?). .**.**
9090: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
90a0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
90b0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
90c0: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  rom malloc..*/.s
90d0: 74 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66  tatic LPWSTR utf
90e0: 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
90f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
9100: 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
9110: 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
9120: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
9130: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
9140: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
9150: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
9160: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
9170: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
9180: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9190: 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  }.  zWideFilenam
91a0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
91b0: 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  oc( nChar*sizeof
91c0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
91d0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
91e0: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
91f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9200: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
9210: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
9220: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
9230: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
9240: 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
9270: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
9280: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9290: 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
92a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
92b0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
92c0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
92d0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
92e0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
92f0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
9300: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
9310: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
9320: 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ed string is.** 
9330: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
9340: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
9350: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
9360: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50  unicodeToUtf8(LP
9370: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
9380: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
9390: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
93a0: 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  name;..  nByte =
93b0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
93c0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
93d0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
93e0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
93f0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
9400: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
9410: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
9420: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
9430: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
9440: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
9450: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9460: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
9470: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
9480: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
9490: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
94a0: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
94b0: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
94e0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
94f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9500: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
9510: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
9520: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9530: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
9540: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
9550: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
9560: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
9570: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
9580: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
9590: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
95a0: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
95b0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
95c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
95d0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
95e0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
95f0: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
9600: 63 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55  c LPWSTR mbcsToU
9610: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
9620: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
9630: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50   int nByte;.  LP
9640: 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61  WSTR zMbcsFilena
9650: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
9660: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
9670: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
9680: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
9690: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
96a0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
96b0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
96c0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
96d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
9700: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
9710: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9720: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69  0;.  }.  zMbcsFi
9730: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
9740: 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73  _malloc( nByte*s
9750: 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e  izeof(zMbcsFilen
9760: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
9770: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d   zMbcsFilename==
9780: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9790: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
97a0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
97b0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
97c0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
97d0: 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  1, zMbcsFilename
97e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20    nByte);.  if( 
9810: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
9820: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62  sqlite3_free(zMb
9830: 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  csFilename);.   
9840: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
9850: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9860: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
9870: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
9880: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
9890: 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65  de to multi-byte
98a0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
98b0: 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  g, based on the.
98c0: 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63  ** user's ANSI c
98d0: 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  odepage..**.** S
98e0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
98f0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
9900: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9910: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
9920: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
9930: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
9940: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
9950: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
9960: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
9970: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
9980: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
9990: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
99a0: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
99b0: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
99c0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
99d0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
99e0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
99f0: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
9a00: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
9a10: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
9a20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
9a30: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
9a40: 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
9a50: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
9a60: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
9a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
9a80: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
9a90: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
9aa0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
9ab0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
9ac0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30       nByte, 0, 0
9af0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
9b00: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
9b10: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
9b20: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
9b30: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
9b40: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
9b50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
9b60: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
9b70: 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ter string to UT
9b80: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
9b90: 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  old the.** retur
9ba0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
9bb0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
9bc0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
9bd0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
9be0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
9bf0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
9c00: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
9c10: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
9c20: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
9c30: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
9c40: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
9c50: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
9c60: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
9c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9c80: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
9c90: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
9ca0: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
9cb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
9cc0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
9cd0: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
9ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
9cf0: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
9d00: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
9d10: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
9d20: 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74  hold the .** ret
9d30: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
9d40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
9d50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
9d60: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
9d70: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
9d80: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
9d90: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
9da0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  ar *zFilenameMbc
9db0: 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  s;.  LPWSTR zTmp
9dc0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
9dd0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
9de0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
9df0: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
9e00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9e10: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
9e20: 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Mbcs = unicodeTo
9e30: 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Mbcs(zTmpWide);.
9e40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9e50: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
9e60: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  rn zFilenameMbcs
9e70: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
9e80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
9e90: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  getLastErrorMsg.
9ea0: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
9eb0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
9ec0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
9ed0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
9ee0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
9ef0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
9f00: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
9f10: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61  static int getLa
9f20: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
9f30: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
9f40: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
9f50: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
9f60: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
9f70: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
9f80: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
9f90: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
9fa0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
9fb0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
9fc0: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
9fd0: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
9fe0: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
9ff0: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
a000: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
a010: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
a020: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
a030: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
a040: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
a050: 6d 70 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b  mpWide[MAX_PATH+
a060: 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d  1]; /* NOTE: Som
a070: 65 77 68 61 74 20 61 72 62 69 74 72 61 72 79 2e  ewhat arbitrary.
a080: 20 2a 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20   */.    dwLen = 
a090: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
a0a0: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
a0b0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
a0e0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
a0f0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
a140: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41            MAX_PA
a1b0: 54 48 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TH,.            
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
a1e0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
a1f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
a200: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
a210: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
a220: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
a230: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
a260: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
a290: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
a2a0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
a2f0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a330: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
a340: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a380: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
a390: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
a3a0: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
a3b0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
a3c0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
a3d0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
a3e0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
a3f0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
a400: 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
a410: 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
a420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
a430: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
a440: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
a450: 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66  WINRT.      /* f
a460: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
a470: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
a480: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
a490: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
a4a0: 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29  lFree(zTempWide)
a4b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
a4c0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a4d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
a4e0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
a4f0: 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a   *zTemp = NULL;.
a500: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
a510: 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52  rmatMessageA(FOR
a520: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
a530: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
a560: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
a570: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
a5a0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
a5b0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53              (LPS
a640: 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20  TR) &zTemp,.    
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a660: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
a690: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
a6a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
a6b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
a6c0: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
a6d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a6e0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
a6f0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
a700: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
a710: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
a720: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
a730: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
a740: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
a750: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
a760: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
a770: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
a780: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
a790: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
a7a0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
a7b0: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
a7c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
a7d0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
a7e0: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
a7f0: 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72  x (%u)", lastErr
a800: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
a810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
a820: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
a830: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
a840: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
a850: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
a860: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
a870: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
a880: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
a890: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
a8a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a8b0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
a8c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
a8d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a8e0: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
a8f0: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
a900: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
a910: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
a920: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
a930: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a940: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
a950: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
a960: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
a970: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
a980: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
a990: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
a9a0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
a9b0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
a9c0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
a9d0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
a9e0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
a9f0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a  quivalent from .
aa00: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
aa10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
aa20: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
aa30: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
aa40: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
aa50: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
aa60: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
aa70: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
aa80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
aa90: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
aaa0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
aab0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
aac0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
aad0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
aae0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
aaf0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
ab00: 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69  d the the associ
ab10: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
ab20: 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a   path, if any..*
ab30: 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67  /.#define winLog
ab40: 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20  Error(a,b,c,d)  
ab50: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
ab60: 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e  ne(a,b,c,d,__LIN
ab70: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
ab80: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
ab90: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
aba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
abb0: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
abc0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44  rror code */.  D
abd0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abf0: 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72  * Win32 last err
ac00: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
ac10: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
ac20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
ac30: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
ac40: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
ac50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
ac60: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
ac70: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
ac80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
ac90: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
aca0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
acb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
acc0: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
acd0: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
ace0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
acf0: 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20  zMsg[500];      
ad00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75             /* Hu
ad10: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72  man readable err
ad20: 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  or text */.  int
ad30: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
ad60: 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a  .  zMsg[0] = 0;.
ad70: 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73    getLastErrorMs
ad80: 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a  g(lastErrno, siz
ad90: 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29  eof(zMsg), zMsg)
ada0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ;.  assert( errc
adb0: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
adc0: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
add0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
ade0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69   for(i=0; zMsg[i
adf0: 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ] && zMsg[i]!='\
ae00: 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  r' && zMsg[i]!='
ae10: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d  \n'; i++){}.  zM
ae20: 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  sg[i] = 0;.  sql
ae30: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
ae40: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e  ,.      "os_win.
ae50: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
ae60: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
ae70: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
ae80: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
ae90: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
aea0: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
aeb0: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
aec0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
aed0: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
aee0: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
aef0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
af00: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
af10: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
af20: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
af30: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
af40: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
af50: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
af60: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
af70: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
af80: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
af90: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
afa0: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
afb0: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
afc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
afd0: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
afe0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
aff0: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
b000: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
b010: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
b020: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
b030: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
b040: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
b050: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
b060: 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f  atic int win32Io
b070: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
b080: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
b090: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
b0a0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
b0b0: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
b0c0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
b0d0: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  DELAY;../*.** If
b0e0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72   a ReadFile() or
b0f0: 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72   WriteFile() err
b100: 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b  or occurs, invok
b110: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
b120: 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  * to see if it s
b130: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64  hould be retried
b140: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74  .  Return TRUE t
b150: 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e  o retry.  Return
b160: 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76   FALSE.** to giv
b170: 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72  e up with an err
b180: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
b190: 74 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74  t retryIoerr(int
b1a0: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
b1b0: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
b1c0: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
b1d0: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
b1e0: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f  pnRetry>=win32Io
b1f0: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
b200: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
b210: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
b220: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
b230: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  n 0;.  }.  if( e
b240: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  ==ERROR_ACCESS_D
b250: 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65  ENIED ||.      e
b260: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f  ==ERROR_LOCK_VIO
b270: 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20  LATION ||.      
b280: 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47  e==ERROR_SHARING
b290: 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20  _VIOLATION ){.  
b2a0: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
b2b0: 73 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  sleep(win32Ioerr
b2c0: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
b2d0: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
b2e0: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
b2f0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
b300: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
b310: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
b320: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b330: 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
b340: 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
b350: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
b360: 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74  oid logIoerr(int
b370: 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20   nRetry){.  if( 
b380: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
b390: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b3a0: 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22  _IOERR, .      "
b3b0: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
b3c0: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
b3d0: 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77  nflict",.      w
b3e0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
b3f0: 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74  lay*nRetry*(nRet
b400: 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20  ry+1)/2.    );. 
b410: 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45   }.}..#if SQLITE
b420: 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a  _OS_WINCE./*****
b430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b470: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63  ****.** This sec
b480: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f  tion contains co
b490: 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c  de for WinCE onl
b4a0: 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64  y..*/./*.** Wind
b4b0: 6f 77 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20  ows CE does not 
b4c0: 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65  have a localtime
b4d0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f  () function.  So
b4e0: 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73 75 62   create a.** sub
b4f0: 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63  stitute..*/.#inc
b500: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
b510: 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
b520: 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
b530: 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
b540: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
b550: 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
b560: 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
b570: 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
b580: 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
b590: 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
b5a0: 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
b5b0: 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
b5c0: 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
b5d0: 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
b5e0: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
b5f0: 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
b600: 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
b610: 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
b620: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
b630: 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
b640: 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
b650: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
b660: 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
b670: 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
b680: 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
b690: 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
b6a0: 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
b6b0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
b6c0: 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
b6d0: 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
b6e0: 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
b6f0: 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
b700: 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
b710: 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
b720: 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
b730: 72 6e 20 26 79 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn &y;.}..#defin
b740: 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  e HANDLE_TO_WINF
b750: 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a  ILE(a) (winFile*
b760: 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69  )&((char*)a)[-(i
b770: 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46  nt)offsetof(winF
b780: 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41  ile,h)]../*.** A
b790: 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e  cquire a lock on
b7a0: 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f   the handle h.*/
b7b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
b7c0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48  ceMutexAcquire(H
b7d0: 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f  ANDLE h){.   DWO
b7e0: 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20  RD dwErr;.   do 
b7f0: 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f  {.     dwErr = o
b800: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
b810: 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45  ject(h, INFINITE
b820: 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64  );.   } while (d
b830: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a  wErr != WAIT_OBJ
b840: 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21  ECT_0 && dwErr !
b850: 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44  = WAIT_ABANDONED
b860: 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  );.}./*.** Relea
b870: 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72  se a lock acquir
b880: 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78  ed by winceMutex
b890: 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65  Acquire().*/.#de
b8a0: 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52  fine winceMutexR
b8b0: 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73  elease(h) Releas
b8c0: 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a  eMutex(h)../*.**
b8d0: 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65   Create the mute
b8e0: 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d  x and shared mem
b8f0: 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
b900: 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65  king in the file
b910: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
b920: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42  File.*/.static B
b930: 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c  OOL winceCreateL
b940: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
b950: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
b960: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50  le *pFile){.  LP
b970: 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57  WSTR zTok;.  LPW
b980: 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 42 4f 4f  STR zName;.  BOO
b990: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
b9a0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54  .  zName = utf8T
b9b0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
b9c0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
b9d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
b9e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
b9f0: 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b     return FALSE;
ba00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
ba10: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
ba20: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
ba30: 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
ba40: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
ba50: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
ba60: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
ba70: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
ba80: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
ba90: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
baa0: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
bab0: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
bac0: 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
bad0: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
bae0: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
baf0: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
bb00: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
bb10: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
bb20: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
bb30: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
bb40: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
bb50: 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
bb60: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
bb70: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
bb80: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
bb90: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
bba0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
bbb0: 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
bbc0: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
bbd0: 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ROR, pFile->last
bbe0: 45 72 72 6e 6f 2c 20 22 77 69 6e 63 65 43 72 65  Errno, "winceCre
bbf0: 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65  ateLock1", zFile
bc00: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
bc10: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
bc20: 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45      return FALSE
bc30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
bc40: 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65  ire the mutex be
bc50: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20  fore continuing 
bc60: 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  */.  winceMutexA
bc70: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
bc80: 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53  utex);.  .  /* S
bc90: 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
bca0: 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
bcb0: 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
bcc0: 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
bcd0: 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65  re .  ** case-se
bce0: 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64  nsitive, take ad
bcf0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20  vantage of that 
bd00: 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74  by uppercasing t
bd10: 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20  he mutex name.  
bd20: 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61  ** and using tha
bd30: 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20  t as the shared 
bd40: 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65  filemapping name
bd50: 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55  ..  */.  osCharU
bd60: 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  pperW(zName);.  
bd70: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
bd80: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
bd90: 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
bda0: 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
bdb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
bde0: 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
bdf0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20          zName); 
be30: 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c   ..  /* Set a fl
be40: 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
be50: 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73  s we're the firs
be60: 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  t to create the 
be70: 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20  memory so it .  
be80: 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  ** must be zero-
be90: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
bea0: 20 69 66 20 28 6f 73 47 65 74 4c 61 73 74 45 72   if (osGetLastEr
beb0: 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f 41  ror() == ERROR_A
bec0: 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a  LREADY_EXISTS){.
bed0: 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53      bInit = FALS
bee0: 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
bef0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a  3_free(zName);..
bf00: 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65    /* If we succe
bf10: 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74  eded in making t
bf20: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
bf30: 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e   handle, map it.
bf40: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
bf50: 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20 20 70  >hShared){.    p
bf60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
bf70: 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
bf80: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
bf90: 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20  ->hShared, .    
bfa0: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41           FILE_MA
bfb0: 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f  P_READ|FILE_MAP_
bfc0: 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a  WRITE, 0, 0, siz
bfd0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
bfe0: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69  .    /* If mappi
bff0: 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65  ng failed, close
c000: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
c010: 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72  ry handle and er
c020: 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ase it */.    if
c030: 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   (!pFile->shared
c040: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
c050: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
c060: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
c070: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
c080: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
c090: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c0b0: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32  winceCreateLock2
c0c0: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
c0d0: 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
c0e0: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
c0f0: 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d);.      pFile-
c100: 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b  >hShared = NULL;
c110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c120: 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   If shared memor
c130: 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  y could not be c
c140: 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f  reated, then clo
c150: 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  se the mutex and
c160: 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20 28 70   fail */.  if (p
c170: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 3d  File->hShared ==
c180: 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69 6e 63   NULL){.    winc
c190: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
c1a0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
c1b0: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
c1c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
c1d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
c1e0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
c1f0: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
c200: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
c210: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
c220: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
c230: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
c240: 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20  f (bInit) {.    
c250: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
c260: 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
c270: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
c280: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
c290: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
c2a0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
c2b0: 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  RUE;.}../*.** De
c2c0: 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f  stroy the part o
c2d0: 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64  f winFile that d
c2e0: 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20  eals with wince 
c2f0: 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  locks.*/.static 
c300: 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f  void winceDestro
c310: 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  yLock(winFile *p
c320: 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69  File){.  if (pFi
c330: 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
c340: 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
c350: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
c360: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
c370: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
c380: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
c390: 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75  wing blocks shou
c3a0: 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65  ld probably asse
c3b0: 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65  rt in debug mode
c3c0: 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20  , but they.     
c3d0: 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70    are to cleanup
c3e0: 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63   in case any loc
c3f0: 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e  ks remained open
c400: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
c410: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
c420: 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
c430: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
c440: 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s --;.    }.    
c450: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
c460: 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20  .bReserved){.   
c470: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
c480: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
c490: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
c4a0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
c4b0: 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
c4c0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
c4d0: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
c4e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
c4f0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
c500: 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
c510: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
c520: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
c530: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
c540: 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e   De-reference an
c550: 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79  d close our copy
c560: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d   of the shared m
c570: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a  emory handle */.
c580: 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f      osUnmapViewO
c590: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61  fFile(pFile->sha
c5a0: 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  red);.    osClos
c5b0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
c5c0: 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
c5d0: 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
c5e0: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
c5f0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
c600: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20  ile->hMutex);   
c610: 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e   .    osCloseHan
c620: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
c630: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
c640: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
c650: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69  }.}../* .** An i
c660: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
c670: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20   the LockFile() 
c680: 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
c690: 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
c6a0: 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69  BOOL winceLockFi
c6b0: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
c6c0: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
c6d0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
c6e0: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
c6f0: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
c700: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
c710: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
c720: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
c730: 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  sToLockHigh.){. 
c740: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
c750: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
c760: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
c770: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
c780: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
c790: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
c7a0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
c7b0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
c7c0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
c7d0: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
c7e0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
c7f0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
c800: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
c810: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
c820: 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20  ;..  /* Wanting 
c830: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
c840: 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  k? */.  if (dwFi
c850: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
c860: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
c870: 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75  ST.       && nNu
c880: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
c890: 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
c8a0: 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20  HARED_SIZE){.   
c8b0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
c8c0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20  ed->nReaders == 
c8d0: 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72  0 && pFile->shar
c8e0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
c8f0: 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69  = 0){.       pFi
c900: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
c910: 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20  lusive = TRUE;. 
c920: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
c930: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
c940: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65  TRUE;.       bRe
c950: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
c960: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
c970: 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f  t a read-only lo
c980: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
c990: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
c9a0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
c9b0: 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20  ED_FIRST &&.    
c9c0: 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66         nNumberOf
c9d0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
c9e0: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
c9f0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
ca00: 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20  clusive == 0){. 
ca10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
ca20: 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  l.nReaders ++;. 
ca30: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
ca40: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
ca50: 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46  = 1){.        pF
ca60: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
ca70: 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
ca80: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
ca90: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
caa0: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70  }..  /* Want a p
cab0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a  ending lock? */.
cac0: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
cad0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
cae0: 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54  WORD)PENDING_BYT
caf0: 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79  E && nNumberOfBy
cb00: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
cb10: 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
cb20: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
cb30: 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
cb40: 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
cb50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
cb60: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
cb70: 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
cb80: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
cb90: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
cba0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
cbb0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
cbc0: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
cbd0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
cbe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
cbf0: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
cc00: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
cc10: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
cc20: 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
cc30: 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  ED_BYTE && nNumb
cc40: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
cc50: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
cc60: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
cc70: 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29  >bReserved == 0)
cc80: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
cc90: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
cca0: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
ccb0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
ccc0: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
ccd0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
cce0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
ccf0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
cd00: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
cd10: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
cd20: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
cd30: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
cd40: 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69   of the UnlockFi
cd50: 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  le API of Window
cd60: 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
cd70: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
cd80: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
cd90: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
cda0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
cdb0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
cdc0: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
cdd0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
cde0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
cdf0: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
ce00: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ce10: 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  High.){.  winFil
ce20: 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c  e *pFile = HANDL
ce30: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46  E_TO_WINFILE(phF
ce40: 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65  ile);.  BOOL bRe
ce50: 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20  turn = FALSE;.. 
ce60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
ce70: 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  R(dwFileOffsetHi
ce80: 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gh);.  UNUSED_PA
ce90: 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
cea0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
ceb0: 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
cec0: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
ced0: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
cee0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
cef0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
cf00: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
cf10: 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e  eader lock or an
cf20: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
cf30: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
cf40: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
cf50: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29  RD)SHARED_FIRST)
cf60: 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  {.    /* Did we 
cf70: 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
cf80: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69  e lock? */.    i
cf90: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
cfa0: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
cfb0: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
cfc0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
cfd0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
cfe0: 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ARED_SIZE);.    
cff0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
d000: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
d010: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
d020: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
d030: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
d040: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
d050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d060: 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65  Did we just have
d070: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20   a reader lock? 
d080: 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  */.    else if (
d090: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
d0a0: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73  aders){.      as
d0b0: 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
d0c0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
d0d0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
d0e0: 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f  SIZE || nNumberO
d0f0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
d100: 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70  w == 1);.      p
d110: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
d120: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
d130: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
d140: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
d150: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
d160: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
d170: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
d180: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
d190: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
d1a0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
d1b0: 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
d1c0: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
d1d0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
d1e0: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
d1f0: 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65  G_BYTE && nNumbe
d200: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
d210: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
d220: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
d230: 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
d240: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
d250: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
d260: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
d270: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
d280: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
d290: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
d2a0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
d2b0: 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
d2c0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
d2d0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
d2e0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
d2f0: 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e  SERVED_BYTE && n
d300: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
d310: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
d320: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
d330: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
d340: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
d350: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
d360: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
d370: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
d380: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
d390: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
d3a0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
d3b0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
d3c0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
d3d0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
d3e0: 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
d3f0: 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
d400: 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
d410: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
d420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
d460: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d470: 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
d480: 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
d490: 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
d4a0: 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
d4b0: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
d4c0: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
d4d0: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
d4e0: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
d4f0: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
d500: 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
d510: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
d520: 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
d530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
d540: 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
d550: 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
d560: 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
d570: 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
d580: 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
d590: 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
d5a0: 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
d5b0: 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
d5c0: 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
d5d0: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
d5e0: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
d5f0: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
d600: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
d610: 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
d620: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
d630: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
d640: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
d650: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
d660: 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
d670: 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
d680: 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
d690: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
d6a0: 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
d6b0: 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
d6c0: 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
d6d0: 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
d6e0: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
d6f0: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
d700: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
d710: 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
d720: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
d730: 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
d740: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
d750: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
d760: 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
d770: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
d780: 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
d790: 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
d7a0: 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
d7b0: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
d7c0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
d7d0: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
d7e0: 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
d7f0: 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
d800: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
d810: 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
d820: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
d830: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
d840: 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
d850: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
d860: 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
d870: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
d880: 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
d890: 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
d8a0: 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
d8b0: 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
d8c0: 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
d8d0: 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d8f0: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
d900: 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
d910: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
d920: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
d930: 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
d940: 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
d950: 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
d960: 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
d970: 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
d980: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
d990: 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
d9a0: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
d9b0: 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
d9c0: 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
d9d0: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
d9e0: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
d9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
da00: 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  lockFile(*phFile
da10: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
da20: 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
da30: 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
da50: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
da60: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a  .#endif.}../****
da70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
daa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
dac0: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72   next group of r
dad0: 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e  outines implemen
dae0: 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  t the I/O method
daf0: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  s specified.** b
db00: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  y the sqlite3_io
db10: 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e  _methods object.
db20: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
db30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
db70: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63  ../*.** Some Mic
db80: 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
db90: 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
dba0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
dbb0: 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  f INVALID_SET_FI
dbc0: 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66  LE_POINTER.# def
dbd0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  ine INVALID_SET_
dbe0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44  FILE_POINTER ((D
dbf0: 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a  WORD)-1).#endif.
dc00: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
dc10: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
dc20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
dc30: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
dc40: 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
dc50: 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69  ment to offset i
dc60: 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  Offset within th
dc70: 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  e file. If succe
dc80: 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e  ssful, return 0.
dc90: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
dca0: 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  set pFile->lastE
dcb0: 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  rrno and return 
dcc0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
dcd0: 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46  tic int seekWinF
dce0: 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
dcf0: 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
dd00: 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20  4 iOffset){.#if 
dd10: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
dd20: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
dd30: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
dd40: 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20     /* Most sig. 
dd50: 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
dd60: 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20  ffset */.  LONG 
dd70: 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20  lowerBits;      
dd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
dd90: 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ast sig. 32 bits
dda0: 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
ddb0: 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b  /.  DWORD dwRet;
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
dde0: 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
ddf0: 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44  Pointer() */.  D
de00: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de20: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
de30: 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
de40: 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69  () */..  upperBi
de50: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
de60: 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
de70: 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
de80: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
de90: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
dea0: 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
deb0: 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
dec0: 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
ded0: 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
dee0: 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e   dword .  ** con
def0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65  taining the lowe
df00: 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65  r 32-bits of the
df10: 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74   new file-offset
df20: 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c  . Or, if it fail
df30: 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72  s,.  ** it retur
df40: 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ns INVALID_SET_F
df50: 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77  ILE_POINTER. How
df60: 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  ever according t
df70: 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e  o MSDN, .  ** IN
df80: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
df90: 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
dfa0: 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
dfb0: 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
dfc0: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
dfd0: 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61  ther an error ha
dfe0: 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  s actually occur
dff0: 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
e000: 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
e010: 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72   .  ** GetLastEr
e020: 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77  ror()..  */.  dw
e030: 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
e040: 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c  ointer(pFile->h,
e050: 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70   lowerBits, &upp
e060: 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47  erBits, FILE_BEG
e070: 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52  IN);..  if( (dwR
e080: 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
e090: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20  FILE_POINTER.   
e0a0: 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
e0b0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
e0c0: 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
e0d0: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
e0e0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
e0f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
e100: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
e110: 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
e120: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
e130: 20 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69           "seekWi
e140: 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  nFile", pFile->z
e150: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
e160: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n 1;.  }..  retu
e170: 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn 0;.#else.  /*
e180: 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62  .  ** Same as ab
e190: 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
e1a0: 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
e1b0: 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57  tion works for W
e1c0: 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41  inRT..  */..  LA
e1d0: 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20  RGE_INTEGER x;  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1f0: 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20   The new offset 
e200: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20  */.  BOOL bRet; 
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
e230: 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c  turned by SetFil
e240: 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a  ePointerEx() */.
e250: 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20  .  x.QuadPart = 
e260: 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20  iOffset;.  bRet 
e270: 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
e280: 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78  erEx(pFile->h, x
e290: 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  , 0, FILE_BEGIN)
e2a0: 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a  ;..  if(!bRet){.
e2b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e2c0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
e2d0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
e2e0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e2f0: 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
e300: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
e310: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65 6b             "seek
e320: 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  WinFile", pFile-
e330: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74  >zPath);.    ret
e340: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  urn 1;.  }..  re
e350: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
e360: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
e370: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  file..**.** It i
e380: 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20  s reported that 
e390: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c  an attempt to cl
e3a0: 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67  ose a handle mig
e3b0: 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ht sometimes.** 
e3c0: 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61  fail.  This is a
e3d0: 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62   very unreasonab
e3e0: 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57  le result, but W
e3f0: 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69  indows is notori
e400: 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67  ous.** for being
e410: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f   unreasonable so
e420: 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20   I do not doubt 
e430: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61  that it might ha
e440: 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65  ppen.  If.** the
e450: 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65   close fails, we
e460: 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d   pause for 100 m
e470: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
e480: 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a  try again.  As.*
e490: 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f  * many as MX_CLO
e4a0: 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d  SE_ATTEMPT attem
e4b0: 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  pts to close the
e4c0: 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65   handle are made
e4d0: 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e   before.** givin
e4e0: 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  g up and returni
e4f0: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
e500: 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45  #define MX_CLOSE
e510: 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69  _ATTEMPT 3.stati
e520: 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73  c int winClose(s
e530: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e540: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20  {.  int rc, cnt 
e550: 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  = 0;.  winFile *
e560: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
e570: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
e580: 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
e590: 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
e5a0: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
e5b0: 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70  ("CLOSE %d\n", p
e5c0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b  File->h));.  do{
e5d0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73  .    rc = osClos
e5e0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
e5f0: 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61  );.    /* Simula
e600: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b  teIOError( rc=0;
e610: 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54   cnt=MX_CLOSE_AT
e620: 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d  TEMPT; ); */.  }
e630: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
e640: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45  ++cnt < MX_CLOSE
e650: 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c  _ATTEMPT && (sql
e660: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
e670: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
e680: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
e690: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
e6a0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
e6b0: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
e6c0: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
e6d0: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
e6e0: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
e6f0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
e700: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
e710: 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
e720: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
e730: 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
e740: 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
e750: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
e760: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
e770: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
e780: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
e790: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
e7a0: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
e7b0: 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
e7c0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
e7d0: 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69  );  /* Wait a li
e7e0: 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69  ttle before tryi
e7f0: 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ng again */.    
e800: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
e810: 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  ee(pFile->zDelet
e820: 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23  eOnClose);.  }.#
e830: 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
e840: 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22  ("CLOSE %d %s\n"
e850: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f  , pFile->h, rc ?
e860: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
e870: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ));.  if( rc ){.
e880: 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
e890: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
e8a0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65  ounter(-1);.  re
e8b0: 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
e8c0: 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
e8d0: 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  : winLogError(SQ
e8e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
e8f0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
e900: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
e920: 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d  inClose", pFile-
e930: 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >zPath);.}../*.*
e940: 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
e950: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
e960: 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
e970: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
e980: 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
e990: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
e9a0: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
e9b0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
e9c0: 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
e9d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
e9e0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
e9f0: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
ea00: 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20  /* File to read 
ea10: 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  from */.  void *
ea20: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
ea30: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
ea40: 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
ea50: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
ea60: 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
ea70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ea80: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
ea90: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
eaa0: 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
eab0: 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
eac0: 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
ead0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c  t */.){.#if !SQL
eae0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f  ITE_OS_WINCE.  O
eaf0: 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
eb00: 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  pped;          /
eb10: 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
eb20: 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65   ReadFile. */.#e
eb30: 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
eb40: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
eb50: 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
eb60: 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
eb70: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
eb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
eb90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
eba0: 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
ebb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
ebc0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ebe0: 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
ebf0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
ec00: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
ec10: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
ec20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
ec30: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
ec40: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
ec50: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
ec60: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
ec70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
ec80: 49 4e 43 45 0a 20 20 69 66 28 20 73 65 65 6b 57  INCE.  if( seekW
ec90: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  inFile(pFile, of
eca0: 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
ecb0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
ecc0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f  .  }.  while( !o
ecd0: 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
ece0: 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
ecf0: 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c  nRead, 0) ){.#el
ed00: 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65  se.  memset(&ove
ed10: 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65  rlapped, 0, size
ed20: 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
ed30: 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
ed40: 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
ed50: 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
ed60: 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  f);.  overlapped
ed70: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
ed80: 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
ed90: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
eda0: 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
edb0: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
edc0: 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
edd0: 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  d, &overlapped) 
ede0: 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65  &&.         osGe
edf0: 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52  tLastError()!=ER
ee00: 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29  ROR_HANDLE_EOF )
ee10: 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f  {.#endif.    DWO
ee20: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
ee30: 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72 72    if( retryIoerr
ee40: 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
ee50: 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
ee60: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
ee70: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
ee80: 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  no;.    return w
ee90: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
eea0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46  E_IOERR_READ, pF
eeb0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
eed0: 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
eee0: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67  Path);.  }.  log
eef0: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
ef00: 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
ef10: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
ef20: 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
ef30: 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
ef40: 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
ef50: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
ef60: 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
ef70: 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
ef80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ef90: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
efa0: 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  _READ;.  }..  re
efb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
efc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
efd0: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
efe0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
eff0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f000: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
f010: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
f020: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
f030: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
f040: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
f050: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f070: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
f080: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
f090: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
f0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f0b0: 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74  bytes to be writ
f0c0: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  ten */.  int amt
f0d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f0f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
f100: 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rite */.  sqlite
f110: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
f120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f130: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
f140: 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  e to begin writi
f150: 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ng at */.){.  in
f160: 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f180: 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68   True if error h
f190: 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73 65  as occured, else
f1a0: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
f1b0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
f1c0: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
f1d0: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
f1e0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
f210: 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
f220: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
f230: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
f240: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
f250: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
f260: 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
f270: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
f280: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
f290: 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
f2a0: 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20  RACE(("WRITE %d 
f2b0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
f2c0: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
f2d0: 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
f2e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
f2f0: 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65  rc = seekWinFile
f300: 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b  (pFile, offset);
f310: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
f320: 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66  #else.  {.#endif
f330: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
f340: 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41  WINCE.    OVERLA
f350: 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
f360: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
f370: 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
f380: 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
f390: 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
f3a0: 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
f3b0: 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
f3c0: 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
f3d0: 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
f3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f3f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
f400: 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
f410: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
f420: 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
f430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
f440: 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
f450: 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
f460: 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
f470: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
f480: 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
f490: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
f4a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
f4b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
f4c0: 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74  WINCE.    memset
f4d0: 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
f4e0: 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
f4f0: 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61  ED));.    overla
f500: 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
f510: 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
f520: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f  ffffffff);.    o
f530: 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
f540: 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
f550: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
f560: 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
f570: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65  ..    while( nRe
f580: 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  m>0 ){.#if SQLIT
f590: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20  E_OS_WINCE.     
f5a0: 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
f5b0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
f5c0: 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
f5d0: 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
f5e0: 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
f5f0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
f600: 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
f610: 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
f620: 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
f630: 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72 72    if( retryIoerr
f640: 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
f650: 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
f660: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
f670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f680: 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a  f( nWrite<=0 ){.
f690: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
f6a0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f6b0: 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or();.        br
f6c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
f6d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
f6e0: 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  E.      offset +
f6f0: 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
f700: 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
f710: 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
f720: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
f730: 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
f740: 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
f750: 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
f760: 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
f770: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  ;.#endif.      a
f780: 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem += nWrite;. 
f790: 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72       nRem -= nWr
f7a0: 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ite;.    }.    i
f7b0: 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  f( nRem>0 ){.   
f7c0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f7d0: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
f7e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
f7f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
f800: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20  rc ){.    if(   
f810: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
f820: 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  no==ERROR_HANDLE
f830: 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20  _DISK_FULL ).   
f840: 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e      || ( pFile->
f850: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
f860: 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20  _DISK_FULL )){. 
f870: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f880: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
f890: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
f8a0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f8b0: 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d  RR_WRITE, pFile-
f8c0: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
f8d0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69           "winWri
f8e0: 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
f8f0: 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
f900: 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79   logIoerr(nRetry
f910: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f920: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f930: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
f940: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
f950: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
f960: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54  .static int winT
f970: 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
f980: 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
f990: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
f9a0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
f9b0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
f9c0: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
f9d0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f9e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa00: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20  Return code for 
fa10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
fa20: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
fa30: 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  e );..  OSTRACE(
fa40: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
fa50: 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
fa60: 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75   nByte));.  Simu
fa70: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
fa80: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
fa90: 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f 2a  TRUNCATE);..  /*
faa0: 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
fab0: 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
fac0: 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
fad0: 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
fae0: 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
faf0: 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
fb00: 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
fb10: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
fb20: 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
fb30: 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
fb40: 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
fb50: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
fb60: 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
fb70: 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
fb80: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
fb90: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
fba0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
fbb0: 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
fbc0: 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
fbd0: 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
fbe0: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
fbf0: 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  }..  /* SetEndOf
fc00: 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e  File() returns n
fc10: 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63  on-zero when suc
fc20: 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f  cessful, or zero
fc30: 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20   when it fails. 
fc40: 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e  */.  if( seekWin
fc50: 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  File(pFile, nByt
fc60: 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  e) ){.    rc = w
fc70: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
fc80: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
fc90: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
fca0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
fcb0: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c   "winTruncate1",
fcc0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
fcd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f    }else if( 0==o
fce0: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46  sSetEndOfFile(pF
fcf0: 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70  ile->h) ){.    p
fd00: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fd10: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
fd20: 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  ();.    rc = win
fd30: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
fd40: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
fd50: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fd60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
fd70: 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
fd80: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
fd90: 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  }..  OSTRACE(("T
fda0: 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20  RUNCATE %d %lld 
fdb0: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
fdc0: 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22 66 61   nByte, rc ? "fa
fdd0: 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
fde0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fdf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
fe00: 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
fe10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
fe20: 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
fe30: 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
fe40: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
fe50: 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
fe60: 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
fe70: 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72  ccuring at the r
fe80: 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69  ight times..*/.i
fe90: 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
fea0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73  count = 0;.int s
feb0: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
fec0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
fed0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
fee0: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
fef0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
ff00: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
ff10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
ff20: 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28  tic int winSync(
ff30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ff40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69  , int flags){.#i
ff50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  fndef SQLITE_NO_
ff60: 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  SYNC.  /*.  ** U
ff70: 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51  sed only when SQ
ff80: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
ff90: 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20  not defined..   
ffa0: 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65  */.  BOOL rc;.#e
ffb0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
ffc0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65  d(NDEBUG) || !de
ffd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f  fined(SQLITE_NO_
ffe0: 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28  SYNC) || \.    (
fff0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
10000 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
10010 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20  SQLITE_DEBUG)). 
10020 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68   /*.  ** Used wh
10030 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  en SQLITE_NO_SYN
10040 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  C is not defined
10050 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65   and by the asse
10060 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a  rt() and/or.  **
10070 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f   OSTRACE() macro
10080 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69  s..   */.  winFi
10090 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
100a0 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a  File*)id;.#else.
100b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
100c0 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  ER(id);.#endif..
100d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
100e0 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  );.  /* Check th
100f0 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
10100 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
10110 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
10120 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
10130 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
10140 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
10150 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
10160 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
10170 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54  FULL.  );..  OST
10180 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c  RACE(("SYNC %d l
10190 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
101a0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
101b0 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e  type));..  /* Un
101c0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
101d0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
101e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
101f0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
10200 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
10210 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
10220 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
10230 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
10240 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
10250 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
10260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
10270 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ULL );..#ifndef 
10280 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e  SQLITE_TEST.  UN
10290 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
102a0 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69  lags);.#else.  i
102b0 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  f( (flags&0x0F)=
102c0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
102d0 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
102e0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
102f0 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
10300 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
10310 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
10320 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
10330 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
10340 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
10350 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
10360 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
10370 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
10380 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10390 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  _OK;.#else.  rc 
103a0 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  = osFlushFileBuf
103b0 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
103c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
103d0 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
103e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
103f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
10410 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10420 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10430 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
10440 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10450 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46  _IOERR_FSYNC, pF
10460 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
10480 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  nSync", pFile->z
10490 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Path);.  }.#endi
104a0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  f.}../*.** Deter
104b0 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
104c0 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
104d0 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
104e0 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69  ic int winFileSi
104f0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
10500 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
10510 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69  64 *pSize){.  wi
10520 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10530 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
10540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10550 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  K;..  assert( id
10560 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
10570 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
10580 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
10590 41 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  AT);.#if SQLITE_
105a0 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
105b0 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
105c0 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
105d0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
105e0 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
105f0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
10600 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
10640 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
10650 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
10660 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
10670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10680 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10690 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
106a0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
106b0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
106c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
106d0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
106e0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
106f0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
10700 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
10710 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
10720 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
10730 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
10740 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
10750 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
10760 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
10770 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
10780 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
10790 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
107a0 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
107b0 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
107c0 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
107d0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
107e0 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
107f0 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
10800 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
10810 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
10820 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10830 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
10840 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
10850 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
10860 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
10870 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10880 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
10890 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
108a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
108b0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
108c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
108d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
108e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
108f0 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  .** LOCKFILE_FAI
10900 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73  L_IMMEDIATELY is
10910 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f   undefined on so
10920 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  me Windows syste
10930 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c  ms..*/.#ifndef L
10940 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
10950 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e  EDIATELY.# defin
10960 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  e LOCKFILE_FAIL_
10970 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65  IMMEDIATELY 1.#e
10980 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f  ndif..#ifndef LO
10990 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
109a0 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c  _LOCK.# define L
109b0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
109c0 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a  E_LOCK 2.#endif.
109d0 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ./*.** Historica
109e0 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20  lly, SQLite has 
109f0 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f  used both the Lo
10a00 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46  ckFile and LockF
10a10 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e  ileEx functions.
10a20 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63  .** When the Loc
10a30 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77  kFile function w
10a40 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20  as used, it was 
10a50 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20  always expected 
10a60 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64  to fail.** immed
10a70 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f  iately if the lo
10a80 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
10a90 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c  obtained.  Also,
10aa0 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63   it always expec
10ab0 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e  ted to.** obtain
10ac0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10ad0 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73  ck.  These flags
10ae0 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74   are used with t
10af0 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  he LockFileEx fu
10b00 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65  nction.** and re
10b10 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65  flect those expe
10b20 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66  ctations; theref
10b30 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64  ore, they should
10b40 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e   not be changed.
10b50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10b60 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
10b70 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
10b80 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
10b90 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49     (LOCKFILE_FAI
10ba0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20  L_IMMEDIATELY | 
10bb0 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43      LOCKFILE_EXC
10be0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e  LUSIVE_LOCK).#en
10bf0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65  dif../*.** Curre
10c00 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76  ntly, SQLite nev
10c10 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63  er calls the Loc
10c20 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
10c30 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67   without wanting
10c40 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
10c50 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  fail immediately
10c60 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   if the lock can
10c70 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
10c80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10c90 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
10ca0 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  AGS.# define SQL
10cb0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
10cc0 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46  LAGS (LOCKFILE_F
10cd0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29  AIL_IMMEDIATELY)
10ce0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
10cf0 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20  cquire a reader 
10d00 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65  lock..** Differe
10d10 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20  nt API routines 
10d20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e  are called depen
10d30 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
10d40 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69  or not this.** i
10d50 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54  s Win9x or WinNT
10d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d70 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  getReadLock(winF
10d80 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
10d90 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
10da0 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
10db0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
10dc0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
10dd0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
10de0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
10df0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
10e00 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
10e10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50  .    **       AP
10e20 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20  I LockFileEx..  
10e30 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77    */.    res = w
10e40 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46  inceLockFile(&pF
10e50 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
10e60 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  IRST, 0, 1, 0);.
10e70 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20  #else.    res = 
10e80 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
10e90 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
10ea0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20  CKFILEEX_FLAGS, 
10eb0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ed0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
10ee0 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  ZE, 0);.#endif. 
10ef0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
10f00 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
10f10 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
10f20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
10f30 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
10f40 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
10f50 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
10f60 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
10f70 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
10f80 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
10f90 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
10fa0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
10fb0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
10fc0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
10ff0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
11000 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
11010 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
11020 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
11030 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11040 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11050 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
11060 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
11070 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
11080 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
11090 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
110a0 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
110b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c  /.static int unl
110c0 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  ockReadLock(winF
110d0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
110e0 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20  nt res;.  DWORD 
110f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28  lastErrno;.  if(
11100 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
11110 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
11120 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
11130 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
11140 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
11150 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
11160 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
11170 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
11180 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
11190 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
111a0 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
111b0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
111c0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
111d0 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d  ndif.  if( res==
111e0 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f  0 && ((lastErrno
111f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
11200 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f  r())!=ERROR_NOT_
11210 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70  LOCKED) ){.    p
11220 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11230 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
11240 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11250 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11260 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11270 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11280 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b   "unlockReadLock
11290 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
112a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
112b0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  es;.}../*.** Loc
112c0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
112d0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
112e0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
112f0 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
11300 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
11310 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
11320 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
11330 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
11340 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
11350 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
11360 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
11370 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
11380 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
11390 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
113a0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
113b0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
113c0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
113d0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
113e0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
113f0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
11400 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11410 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11420 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11430 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
11440 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
11450 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
11460 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
11470 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
11480 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
11490 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
114a0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
114b0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
114c0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
114d0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
114e0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
114f0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
11500 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11510 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11520 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11530 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
11540 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11550 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
11560 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
11570 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11580 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
11590 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55   lock.  The winU
115a0 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a  nlock() routine.
115b0 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f  ** erases all lo
115c0 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20  cks at once and 
115d0 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64  returns us immed
115e0 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e  iately to lockin
115f0 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74  g level 0..** It
11600 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
11610 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f   to lower the lo
11620 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20  cking level one 
11630 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20  step at a time. 
11640 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20   You.** must go 
11650 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b  straight to lock
11660 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a  ing level 0..*/.
11670 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
11680 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11690 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
116a0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
116b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20  QLITE_OK;    /* 
116c0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
116d0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a   subroutines */.
116e0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
116f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
11700 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20  lt of a Windows 
11710 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69  lock call */.  i
11720 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20  nt newLocktype; 
11730 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69        /* Set pFi
11740 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20  le->locktype to 
11750 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
11760 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e exiting */.  i
11770 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
11780 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66  k = 0;/* True if
11790 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50   we acquired a P
117a0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73  ENDING lock this
117b0 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69   time */.  winFi
117c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
117d0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
117e0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
117f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72  _ERROR;..  asser
11800 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53  t( id!=0 );.  OS
11810 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20  TRACE(("LOCK %d 
11820 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
11830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
11840 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
11850 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11860 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
11870 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  ockByte));..  /*
11880 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
11890 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
118a0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
118b0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
118c0 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
118d0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
118e0 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
118f0 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
11900 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
11910 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
11920 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
11930 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
11940 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11950 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
11960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11970 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
11980 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
11990 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
119a0 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
119b0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
119c0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
119d0 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
119e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
119f0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
11a00 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
11a10 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
11a20 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
11a30 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
11a40 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
11a50 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
11a60 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
11a70 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
11a80 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
11a90 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
11aa0 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
11ab0 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
11ac0 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
11ad0 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
11ae0 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
11af0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
11b00 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
11b10 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
11b20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
11b30 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20  cktype;.  if(   
11b40 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
11b50 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ==NO_LOCK).     
11b60 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65  || (   (locktype
11b70 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
11b80 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
11b90 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
11ba0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a  RESERVED_LOCK)).
11bb0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
11bc0 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
11bd0 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
11be0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
11bf0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
11c00 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
11c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
11c40 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
11c50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
11c60 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
11c70 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
11c80 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
11c90 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
11ca0 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
11cb0 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
11cc0 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
11cd0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
11ce0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
11cf0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
11d00 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
11d10 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
11d20 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
11d30 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
11d40 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
11d50 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
11d60 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
11d70 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
11d80 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
11d90 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
11da0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
11db0 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61  "could not get a
11dc0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63   PENDING lock. c
11dd0 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b  nt=%d\n", cnt));
11de0 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
11df0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
11e00 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
11e10 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
11e20 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
11e30 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c   !res ){.      l
11e40 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
11e50 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
11e60 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
11e70 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f  uire a shared lo
11e80 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
11e90 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
11ea0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
11eb0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
11ec0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
11ed0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
11ee0 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
11ef0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  e);.    if( res 
11f00 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
11f10 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
11f20 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
11f30 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
11f40 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
11f50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11f60 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
11f70 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  ERVED lock.  */.
11f80 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
11f90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
11fa0 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
11fb0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
11fc0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
11fd0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
11fe0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
11ff0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
12000 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
12010 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
12020 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
12030 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
12040 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
12050 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
12060 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
12070 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
12080 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
12090 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
120a0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
120b0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
120c0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
120d0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
120e0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
120f0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
12100 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
12110 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
12120 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
12130 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
12140 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
12150 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
12160 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
12170 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12180 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
12190 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
121a0 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
121b0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
121c0 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c  unreadlock = %d\
121d0 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72  n", res));.    r
121e0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
121f0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
12200 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
12210 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
12220 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12230 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
12240 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
12250 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
12260 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
12270 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
12280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
12290 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
122a0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
122b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72 72     OSTRACE(("err
122c0 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c  or-code = %d\n",
122d0 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20   lastErrno));.  
122e0 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28      getReadLock(
122f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
12300 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
12310 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
12320 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
12330 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
12340 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
12350 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
12360 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
12370 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
12380 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
12390 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
123a0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
123b0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
123c0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
123d0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
123e0 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
123f0 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
12400 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12410 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
12420 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
12430 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
12440 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
12450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12460 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
12470 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
12480 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67  FAILED %d trying
12490 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20   for %d but got 
124a0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
124b0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
124c0 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70  type, newLocktyp
124d0 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e));.    pFile->
124e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
124f0 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
12500 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
12510 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
12520 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
12530 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
12540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
12550 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12560 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
12570 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
12580 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
12590 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
125a0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
125b0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
125c0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
125d0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
125e0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
125f0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
12600 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
12610 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12620 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
12630 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
12640 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
12650 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
12660 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
12670 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
12680 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12690 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
126a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
126b0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
126c0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
126d0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
126e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54   rc = 1;.    OST
126f0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
12700 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c  OCK %d %d (local
12710 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12720 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
12730 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46     rc = winLockF
12740 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
12750 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
12760 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42  LAGS, RESERVED_B
12770 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
12780 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12790 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
127a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
127b0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
127c0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
127d0 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54  c = !rc;.    OST
127e0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
127f0 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74  OCK %d %d (remot
12800 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
12810 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52   rc));.  }.  *pR
12820 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
12830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12840 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
12850 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12860 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
12870 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
12880 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
12890 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
128a0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
128b0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
128c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
128d0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
128e0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
128f0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
12900 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
12910 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
12920 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12930 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
12940 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
12950 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
12960 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
12970 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12980 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
12990 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
129a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
129b0 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
129c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
129d0 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
129e0 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
129f0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
12a00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12a10 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
12a20 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
12a30 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
12a40 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
12a50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12a60 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
12a70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
12a80 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
12a90 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
12aa0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
12ab0 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64   %d to %d was %d
12ac0 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  (%d)\n", pFile->
12ad0 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
12ae0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
12af0 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
12b00 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b  haredLockByte));
12b10 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
12b20 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
12b30 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
12b40 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
12b50 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
12b60 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
12b70 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
12b80 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
12b90 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
12ba0 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61  _LOCK && !getRea
12bb0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a  dLock(pFile) ){.
12bc0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
12bd0 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
12be0 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c  n.  We should al
12bf0 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a  ways be able to.
12c00 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69        ** reacqui
12c10 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
12c20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
12c30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12c40 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
12c50 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12c70 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46   "winUnlock", pF
12c80 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
12c90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
12ca0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
12cb0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
12cc0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
12cd0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
12ce0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
12cf0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
12d00 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
12d10 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
12d20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
12d30 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
12d40 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
12d50 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
12d60 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
12d70 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
12d80 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
12d90 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
12da0 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
12db0 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
12dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
12dd0 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
12de0 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
12df0 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
12e00 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
12e10 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
12e20 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
12e30 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
12e40 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
12e50 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
12e60 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
12e70 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
12e80 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
12e90 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
12ea0 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
12eb0 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
12ec0 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
12ed0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
12ee0 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
12ef0 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
12f00 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
12f10 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
12f20 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
12f30 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
12f40 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
12f50 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
12f60 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
12f70 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
12f80 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
12f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  .}../*.** Contro
12fa0 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
12fb0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
12fc0 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
12fd0 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
12fe0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
12ff0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
13000 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
13010 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
13020 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
13030 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
13040 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
13050 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
13060 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
13070 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13080 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
13090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
130a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
130b0 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
130c0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
130d0 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
130e0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
130f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13100 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13110 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
13120 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
13130 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
13140 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
13150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13160 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
13170 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
13180 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
13190 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
131a0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
131b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
131c0 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
131d0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
131e0 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
131f0 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
13200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13220 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
13230 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
13240 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
13250 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
13260 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
13270 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13280 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
13290 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
132a0 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
132b0 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
132c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
132d0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
132e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
132f0 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
13300 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
13310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13320 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
13330 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
13340 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
13350 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
13360 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
13370 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
13380 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
13390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
133a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
133b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
133c0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
133d0 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
133e0 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
133f0 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
13400 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
13410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13420 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
13430 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
13440 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
13450 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
13460 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 77 69  ite3_mprintf("wi
13470 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72 65 74  n32");.      ret
13480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13490 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
134a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
134b0 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
134c0 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
134d0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
134e0 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
134f0 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
13500 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  try = a[0];.    
13510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13520 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[0] = win32Ioe
13530 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
13540 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
13550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
13560 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
13570 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
13580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13590 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72  [1] = win32Ioerr
135a0 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
135b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
135c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
135d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
135e0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
135f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13600 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
13610 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
13620 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
13630 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
13640 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
13650 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
13660 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
13670 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
13680 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
13690 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
136a0 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
136b0 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
136c0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
136d0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
136e0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
136f0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
13700 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
13710 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
13720 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
13730 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
13740 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
13750 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
13760 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
13770 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
13780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
13790 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
137a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
137b0 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74   (void)id;.  ret
137c0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
137d0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
137e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
137f0 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
13800 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
13810 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
13820 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
13830 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
13840 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
13850 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69  winFile *p = (wi
13860 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74  nFile*)id;.  ret
13870 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
13880 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
13890 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20  N_OPEN |.       
138a0 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73    ((p->ctrlFlags
138b0 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29   & WINFILE_PSOW)
138c0 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f  ?SQLITE_IOCAP_PO
138d0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
138e0 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E:0);.}..#ifndef
138f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
13900 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73  ../* .** Windows
13910 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79   will only let y
13920 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20 76  ou create file v
13930 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20  iew mappings.** 
13940 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  on allocation si
13950 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62  ze granularity b
13960 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75  oundaries..** Du
13970 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f  ring sqlite3_os_
13980 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20 47  init() we do a G
13990 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a  etSystemInfo().*
139a0 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72 61  * to get the gra
139b0 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a  nularity size..*
139c0 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69  /.SYSTEM_INFO wi
139d0 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a  nSysInfo;../*.**
139e0 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
139f0 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
13a00 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
13a10 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
13a20 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
13a30 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
13a40 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49  ect the winLockI
13a50 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64  nfo objects used
13a60 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c   by .** this fil
13a70 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
13a80 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
13a90 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
13aa0 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
13ab0 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
13ac0 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
13ad0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
13ae0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
13af0 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
13b00 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
13b10 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
13b20 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
13b30 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
13b40 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
13b50 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  **   winShmEnter
13b60 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
13b70 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
13b80 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
13b90 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
13ba0 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x().*/.static vo
13bb0 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  id winShmEnterMu
13bc0 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
13bd0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13be0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
13bf0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
13c00 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
13c10 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
13c20 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
13c30 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
13c40 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
13c50 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13c60 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
13c70 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
13c80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
13c90 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  UG.static int wi
13ca0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f  nShmMutexHeld(vo
13cb0 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
13cc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13cd0 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
13ce0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13cf0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
13d00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13d10 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
13d20 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e   represent a sin
13d30 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  gle file opened 
13d40 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70  and mmapped to p
13d50 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64  rovide.** shared
13d60 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d   memory.  When m
13d70 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
13d80 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
13d90 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75  e same.** log-su
13da0 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65  mmary, each thre
13db0 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77  ad has its own w
13dc0 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  inFile object, b
13dd0 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
13de0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
13df0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
13e00 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
13e10 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
13e20 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
13e30 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
13e40 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
13e50 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  **.** winShmMute
13e60 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
13e70 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
13e80 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
13e90 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
13ea0 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
13eb0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
13ec0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
13ed0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
13ee0 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20  f.**      pNext 
13ef0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
13f00 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
13f10 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
13f20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
13f30 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
13f40 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
13f50 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
13f60 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ither winShmNode
13f70 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
13f80 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64  eld or winShmNod
13f90 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
13fa0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
13fb0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
13fc0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
13fd0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
13fe0 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
13ff0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73  ructure..**.*/.s
14000 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
14010 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   {.  sqlite3_mut
14020 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
14030 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
14040 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
14050 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
14060 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
14070 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
14080 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  le */.  winFile 
14090 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  hFile;          
140a0 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
140b0 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a  e from winOpen *
140c0 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  /..  int szRegio
140d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
140e0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
140f0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
14100 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f   */.  int nRegio
14110 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
14120 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
14130 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
14140 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
14150 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d   {.    HANDLE hM
14160 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
14170 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
14180 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61  rom CreateFileMa
14190 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69  pping */.    voi
141a0 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52  d *pMap;.  } *aR
141b0 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c  egion;.  DWORD l
141c0 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
141d0 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
141e0 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
141f0 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
14200 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b   */..  int nRef;
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
14230 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
14240 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
14250 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72  /.  winShm *pFir
14260 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
14270 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a  * All winShm obj
14280 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
14290 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
142a0 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20  mNode *pNext;   
142b0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e        /* Next in
142c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e   list of all win
142d0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20  ShmNode objects 
142e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
142f0 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74  _DEBUG.  u8 next
14300 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
14310 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
14320 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20  lable winShm.id 
14330 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
14340 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  };../*.** A glob
14350 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20  al array of all 
14360 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
14370 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69  ts..**.** The wi
14380 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
14390 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69  must be true whi
143a0 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
143b0 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e  iting this list.
143c0 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68  .*/.static winSh
143d0 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64  mNode *winShmNod
143e0 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
143f0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
14400 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
14410 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
14420 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
14430 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
14440 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
14450 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
14460 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
14470 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
14480 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
14490 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
144a0 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
144b0 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
144c0 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d  *    winShm.pShm
144d0 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68  Node.**    winSh
144e0 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
144f0 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
14500 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
14510 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
14520 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
14530 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
14540 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
14550 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
14560 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20  /.struct winShm 
14570 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
14580 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f  pShmNode;      /
14590 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
145a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
145b0 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ct */.  winShm *
145c0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
145d0 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68     /* Next winSh
145e0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
145f0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
14600 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
14610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14620 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
14630 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74  e winShmNode mut
14640 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  ex */.  u16 shar
14650 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
14660 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
14670 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
14680 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
14690 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
146a0 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
146b0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
146c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
146d0 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20  _DEBUG.  u8 id; 
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
14700 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
14710 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
14720 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
14730 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
14740 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
14750 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
14760 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
14770 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
14780 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
14790 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
147a0 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
147b0 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
147c0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
147d0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
147e0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
147f0 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
14800 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
14810 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
14820 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
14830 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
14840 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
14850 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
14860 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
14870 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
14880 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
14890 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
148a0 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
148b0 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
148c0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
148d0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
148e0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
148f0 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
14900 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
14910 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
14920 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
14930 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
14940 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
14950 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
14960 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
14970 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
14980 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
14990 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
149a0 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nlock */.){.  in
149b0 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
149c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
149d0 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
149e0 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
149f0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
14a00 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
14a10 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
14a20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
14a30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
14a40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14a50 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
14a60 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
14a70 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73   );..  /* Releas
14a80 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
14a90 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
14aa0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
14ab0 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
14ac0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
14ad0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14ae0 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30  hFile.h, ofst, 0
14af0 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
14b00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
14b10 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
14b20 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
14b30 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c  /.    DWORD dwFl
14b40 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
14b50 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
14b60 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
14b70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  e == _SHM_WRLCK 
14b80 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43  ) dwFlags |= LOC
14b90 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
14ba0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77  LOCK;.    rc = w
14bb0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
14bc0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
14bd0 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  ags, ofst, 0, nB
14be0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a  yte, 0);.  }.  .
14bf0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
14c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14c10 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
14c20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14c30 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
14c40 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
14c50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
14c60 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
14c70 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20  M-LOCK %d %s %s 
14c80 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20  0x%08lx\n", .   
14c90 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14ca0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
14cb0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
14cc0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
14cd0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  d",.           l
14ce0 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
14cf0 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c  LCK ? "UnlockFil
14d00 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65  eEx" : "LockFile
14d10 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Ex",.           
14d20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14d30 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
14d40 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
14d50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
14d60 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
14d70 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
14d80 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
14d90 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
14da0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
14db0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
14dc0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
14dd0 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
14de0 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
14df0 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
14e00 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
14e10 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
14e20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
14e30 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
14e40 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
14e50 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
14e60 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
14e70 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
14e80 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
14e90 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
14ea0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
14eb0 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
14ec0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14ed0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
14ee0 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
14ef0 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
14f00 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63  e *p;.  BOOL bRc
14f10 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
14f20 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
14f30 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
14f40 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
14f50 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
14f60 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
14f70 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
14f80 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
14f90 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
14fa0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
14fb0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
14fc0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
14fd0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
14fe0 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70     bRc = osUnmap
14ff0 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
15000 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
15010 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
15020 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d  ("SHM-PURGE pid-
15030 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d  %d unmap region=
15040 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
15050 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15060 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15070 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20  essId(), i,.    
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63               bRc
15090 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
150a0 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52  d"));.        bR
150b0 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
150c0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
150d0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
150e0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
150f0 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65 20  GE pid-%d close 
15100 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
15110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15120 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
15130 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15140 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
15150 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
15160 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
15170 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
15180 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56  ->hFile.h != INV
15190 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
151a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
151b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
151c0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
151d0 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
151e0 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
151f0 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
15200 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
15210 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
15220 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
15230 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
15240 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15250 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
15260 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
15270 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
15280 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
15290 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
152a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
152b0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
152c0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
152d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
152e0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
152f0 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
15300 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
15310 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
15320 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
15330 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15350 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
15360 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15370 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
15380 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
15390 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
153a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
153b0 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
153c0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
153d0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
153e0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
153f0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
15400 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
15410 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
15420 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
15430 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
15440 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
15450 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
15460 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
15470 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
15480 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
15490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
154a0 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
154b0 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
154c0 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
154d0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
154e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
154f0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
15500 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
15510 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
15520 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
15530 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
15540 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
15550 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
15580 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
15590 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
155a0 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
155b0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
155c0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
155d0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
15600 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
15610 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
15620 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
15630 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
15640 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
15650 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
15660 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
15670 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
15680 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
15690 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
156a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
156b0 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
156c0 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
156d0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
156e0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
156f0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
15700 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15710 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  IOERR_NOMEM;.  m
15720 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
15730 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65  of(*p));.  nName
15740 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15750 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
15760 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
15770 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
15780 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
15790 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
157a0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
157b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
157c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
157d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
157e0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
157f0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
15800 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  pNew) + nName + 
15810 31 37 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  17);.  pNew->zFi
15820 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
15830 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
15840 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
15850 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
15860 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
15870 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
15880 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
15890 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
158a0 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
158b0 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f  ame); ..  /* Loo
158c0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
158d0 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
158e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
158f0 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
15900 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
15910 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
15920 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
15930 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
15940 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
15950 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
15960 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
15970 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
15980 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
15990 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
159a0 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
159b0 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
159c0 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
159d0 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
159e0 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
159f0 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
15a00 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
15a10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15a20 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
15a30 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
15a40 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
15a50 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
15a60 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
15a70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15a80 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
15a90 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
15aa0 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
15ab0 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
15ac0 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
15ad0 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
15ae0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
15af0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
15b00 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
15b10 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
15b20 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
15b30 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
15b40 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
15b50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
15b60 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
15b70 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
15b80 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
15b90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15ba0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
15bb0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
15bc0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
15bd0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
15be0 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
15bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c00 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
15c10 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
15c20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15c30 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
15c40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
15c50 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
15c60 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
15c70 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
15c80 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15ca0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
15cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15cc0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
15cd0 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f  EN_CREATE, /* Mo
15ce0 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20  de flags */.    
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
15d00 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15d10 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
15d20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
15d30 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
15d40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15d50 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
15d60 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
15d70 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
15d80 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
15d90 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
15da0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
15db0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
15dc0 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
15dd0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
15de0 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
15df0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
15e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
15e10 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
15e20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
15e30 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
15e40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
15e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15e60 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
15e70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15e80 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73  OERR_SHMOPEN, os
15e90 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
15ec0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
15ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15ef0 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
15f00 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
15f10 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
15f20 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
15f30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
15f40 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
15f50 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
15f60 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
15f70 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
15f80 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
15f90 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
15fa0 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
15fb0 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
15fc0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
15fd0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
15fe0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
15ff0 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
16000 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
16010 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
16020 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
16030 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
16040 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
16050 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
16060 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
16070 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
16080 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
16090 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
160a0 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
160b0 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
160c0 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
160d0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
160e0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
160f0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
16100 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
16110 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
16120 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
16130 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
16140 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
16150 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
16160 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
16170 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
16180 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
16190 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
161a0 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
161b0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
161c0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
161d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
161e0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
161f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16200 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
16210 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
16220 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
16230 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
16240 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
16250 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16260 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
16270 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
16280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
16290 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
162a0 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
162b0 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
162c0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
162d0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
162e0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
162f0 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
16300 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
16310 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
16320 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
16330 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
16340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
16350 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
16360 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
16370 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
16380 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16390 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
163a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
163b0 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
163c0 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
163d0 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
163e0 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
163f0 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
16400 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
16410 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
16420 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
16430 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
16440 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
16450 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
16460 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
16470 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
16480 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
16490 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
164a0 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
164b0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
164c0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
164d0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
164e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
164f0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
16500 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
16510 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
16520 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
16530 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
16540 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
16550 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
16560 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16570 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
16580 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
16590 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
165a0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
165b0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
165c0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
165d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
165e0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
165f0 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
16600 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
16610 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
16620 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
16630 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
16640 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
16650 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16660 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
16670 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
16680 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
16690 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
166a0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
166b0 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
166c0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
166d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
166e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
166f0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
16700 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
16710 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
16720 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
16730 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
16740 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
16750 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
16760 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
16770 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
16780 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
16790 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
167a0 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
167b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
167c0 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
167d0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
167e0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
167f0 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
16800 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
16810 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
16820 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
16830 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
16840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16850 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16860 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
16870 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
16880 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
16890 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
168a0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
168b0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
168c0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
168d0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
168e0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
168f0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
16900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
16910 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
16920 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
16930 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
16960 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
16970 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
16980 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
16990 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
169a0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
169b0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
169c0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
169d0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
169e0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
169f0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
16a00 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
16a10 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
16a20 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
16a30 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
16a40 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
16a50 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
16a60 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a80 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
16a90 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
16aa0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
16ab0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
16ac0 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
16ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
16b00 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
16b30 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
16b40 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
16b50 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
16b60 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
16b70 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
16b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
16b90 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
16ba0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
16bb0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
16bc0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
16bd0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
16be0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
16bf0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
16c00 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
16c10 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
16c20 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
16c30 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
16c40 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
16c50 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
16c60 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
16c70 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
16c80 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
16c90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16ca0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
16cb0 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
16cc0 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
16cd0 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
16ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
16cf0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
16d00 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
16d10 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
16d20 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
16d30 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
16d40 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
16d50 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
16d60 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
16d70 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
16d80 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
16d90 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
16da0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
16db0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
16dc0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
16dd0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
16de0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
16df0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
16e00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16e10 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
16e20 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
16e30 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
16e40 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
16e50 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
16e60 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
16e70 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
16e80 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
16e90 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
16ea0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
16eb0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
16ec0 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
16ed0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
16ee0 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
16ef0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
16f00 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
16f10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16f20 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
16f30 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
16f40 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
16f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16f60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
16f70 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
16f80 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
16f90 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
16fa0 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
16fb0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
16fc0 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
16fd0 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
16fe0 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
16ff0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
17000 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
17010 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
17020 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
17030 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
17040 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
17050 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
17060 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
17070 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
17080 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
17090 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
170a0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
170b0 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
170c0 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
170d0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
170e0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
170f0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
17100 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
17110 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
17120 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
17130 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17140 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
17160 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
17170 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
17180 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
17190 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
171a0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
171b0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
171c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
171d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
171e0 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
171f0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
17200 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
17210 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
17220 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
17230 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
17240 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
17250 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
17260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17270 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
17280 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
17290 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
172a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
172b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
172c0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
172d0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
172e0 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
172f0 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
17300 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
17310 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
17320 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
17330 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
17340 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
17350 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
17360 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
17370 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
17380 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
17390 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
173a0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
173b0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
173c0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
173d0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
173e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
173f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
17400 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17410 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
17420 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
17430 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
17440 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
17450 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
17460 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
17470 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
17480 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
17490 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
174a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
174b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
174c0 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
174d0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
174e0 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
174f0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
17500 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17520 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
17530 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
17540 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
17550 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
17560 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
17570 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
17580 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
17590 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
175a0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
175b0 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
175c0 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
175d0 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  03x %s\n",.     
175e0 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e        p->id, (in
175f0 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
17600 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
17610 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
17620 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
17630 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
17640 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
17650 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17660 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
17670 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
17680 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
17690 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
176a0 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
176b0 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
176c0 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
176d0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
176e0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
176f0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
17700 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
17710 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
17720 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
17730 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
17740 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
17750 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
17760 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
17770 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
17780 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
17790 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
177a0 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
177b0 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
177c0 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
177d0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
177e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
177f0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
17800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17810 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17820 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
17830 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
17840 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
17850 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
17860 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17880 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
17890 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
178a0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
178b0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
178c0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
178d0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
178e0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
178f0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
17900 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17910 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
17920 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
17930 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
17940 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
17950 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
17960 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
17970 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
17980 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
17990 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
179a0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
179b0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
179c0 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
179d0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
179e0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
179f0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
17a00 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
17a10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
17a20 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
17a30 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
17a40 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
17a50 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
17a60 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
17a70 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
17a80 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
17a90 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
17aa0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
17ab0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
17ac0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
17ad0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
17ae0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
17af0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
17b00 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
17b10 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
17b20 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
17b30 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
17b40 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
17b50 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
17b60 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
17b70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
17b80 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
17b90 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
17ba0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
17bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17bc0 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
17bd0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bf0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
17c00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17c10 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c30 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
17c40 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
17c50 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c70 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
17c80 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
17c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17ca0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
17cb0 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
17cc0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
17cd0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17cf0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
17d00 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
17d10 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
17d20 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
17d30 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
17d40 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
17d50 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
17d60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17d70 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
17d80 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
17d90 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
17da0 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
17db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
17dc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
17dd0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
17de0 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
17df0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
17e00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17e10 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
17e20 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
17e30 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
17e40 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
17e50 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
17e60 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
17e70 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
17e80 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
17e90 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
17ea0 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
17eb0 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
17ec0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
17ed0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
17ee0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
17ef0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
17f00 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
17f10 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
17f20 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
17f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17f40 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
17f50 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
17f60 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
17f70 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
17f80 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
17f90 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
17fa0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
17fb0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
17fc0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
17fd0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
17fe0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
17ff0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
18000 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
18010 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
18020 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
18030 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
18040 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
18050 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
18060 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
18070 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
18080 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
18090 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
180a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
180b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
180c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
180d0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
180e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
180f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18100 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
18110 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
18120 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
18130 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
18140 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
18150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
18160 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
18170 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
18180 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
18190 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
181a0 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
181b0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
181c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
181d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
181e0 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
181f0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
18200 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
18210 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
18220 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
18230 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
18240 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
18250 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
18260 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18270 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
18280 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
18290 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
182a0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
182b0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
182c0 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
182d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
182e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
182f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
18300 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
18310 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
18320 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
18340 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
18350 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
18360 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
18370 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
18380 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
18390 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
183a0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
183b0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
183c0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
183d0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
183e0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
183f0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
18400 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
18410 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
18420 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
18430 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
18440 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
18450 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
18460 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
18470 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
18480 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
18490 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
184a0 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
184b0 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
184c0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
184d0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
184e0 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
184f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
18500 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
18510 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
18520 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
18530 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
18540 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
18550 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49  /.     .#if SQLI
18560 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
18570 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
18580 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
18590 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  App(pShmNode->hF
185a0 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
185b0 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
185c0 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55  WRITE, nByte, NU
185d0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  LL.      );.#els
185e0 65 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  e.      hMap = o
185f0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
18600 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngW(pShmNode->hF
18610 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
18620 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
18630 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
18640 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
18650 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
18660 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70  RACE(("SHM-MAP p
18670 69 64 2d 25 64 20 63 72 65 61 74 65 20 72 65 67  id-%d create reg
18680 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20  ion=%d nbyte=%d 
18690 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
186a0 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74        (int)osGet
186b0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
186c0 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
186d0 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
186f0 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
18700 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
18710 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
18720 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
18730 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
18740 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
18750 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
18760 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
18770 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
18780 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
18790 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
187a0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
187b0 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
187c0 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
187d0 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
187e0 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
187f0 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
18800 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
18810 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
18820 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
18830 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
18840 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
18850 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
18860 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
18870 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
18880 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
18890 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
188a0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
188b0 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
188c0 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
188d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
188e0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
188f0 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69   pid-%d map regi
18900 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20  on=%d offset=%d 
18910 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  size=%d %s\n",. 
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
18940 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
18950 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
18960 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
18970 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
18980 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
18990 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
189a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
189b0 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
189c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
189d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
189e0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
189f0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
18a00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
18a10 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
18a20 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
18a40 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46  inShmMap3", pDbF
18a50 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
18a60 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73     if( hMap ) os
18a70 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70  CloseHandle(hMap
18a80 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
18a90 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
18aa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d     }..      pShm
18ab0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
18ac0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
18ad0 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  .pMap = pMap;.  
18ae0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
18af0 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
18b00 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20  nRegion].hMap = 
18b10 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  hMap;.      pShm
18b20 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
18b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
18b40 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
18b50 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
18b60 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
18b70 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52  int iOffset = iR
18b80 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
18b90 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
18ba0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
18bb0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
18bc0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
18bd0 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ity;.    char *p
18be0 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e   = (char *)pShmN
18bf0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65  ode->aRegion[iRe
18c00 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20  gion].pMap;.    
18c10 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  *pp = (void *)&p
18c20 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a  [iOffsetShift];.
18c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
18c40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
18c50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18c60 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
18c70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18c80 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
18c90 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30   winShmMap     0
18ca0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
18cb0 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
18cc0 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  ne winShmBarrier
18cd0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
18ce0 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
18cf0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
18d00 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
18d10 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
18d20 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
18d30 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
18d40 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
18d50 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
18d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
18d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
18d80 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
18d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18da0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
18db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18df0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
18e00 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
18e10 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
18e20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
18e30 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
18e40 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
18e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
18e60 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
18e70 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
18e80 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20   = {.  2,       
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
18eb0 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
18ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18ed0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
18ee0 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
18f10 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
18f40 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
18f70 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f90 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
18fa0 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
18fd0 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
19000 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
19030 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
19040 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
19050 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
19060 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
19070 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19090 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
190a0 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
190b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
190c0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
190d0 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
190e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
190f0 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
19100 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
19110 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
19120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19130 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
19140 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
19150 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
19160 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
19170 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
19180 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
19190 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
191a0 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
191b0 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20  hmUnmap         
191c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
191d0 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a  ShmUnmap */.};..
191e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
19250 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
19260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
19280 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
19290 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
192a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
192b0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
192c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
192d0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ect..*/../*.** C
192e0 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
192f0 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
19300 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
19310 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
19320 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
19330 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
19340 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
19350 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
19360 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
19370 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
19380 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
19390 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
193a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
193b0 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38  oid *convertUtf8
193c0 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
193d0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
193e0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
193f0 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  ted = 0;.  if( i
19400 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
19410 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f  nverted = utf8To
19420 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
19430 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
19440 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
19450 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
19460 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
19470 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
19480 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61  _to_mbcs(zFilena
19490 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
194a0 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
194b0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
194c0 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
194d0 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
194e0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
194f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
19500 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
19510 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
19520 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
19530 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68   at pVfs->mxPath
19540 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e  name characters.
19550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
19560 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
19570 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
19580 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
19590 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
195a0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
195b0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
195c0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
195d0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
195e0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
195f0 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
19600 69 6e 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20  int nTempPath;. 
19610 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
19620 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20  MAX_PATH+2];..  
19630 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
19640 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
19650 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
19660 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
19670 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
19680 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
19690 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
196a0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
196b0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
196c0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
196d0 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
196e0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
196f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
19700 0a 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70  ..  memset(zTemp
19710 50 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54  Path, 0, MAX_PAT
19720 48 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  H+2);..  if( sql
19730 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
19740 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
19750 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
19760 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
19770 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
19780 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
19790 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49  );.  }.#if !SQLI
197a0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c  TE_OS_WINRT.  el
197b0 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
197c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
197d0 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
197e0 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
197f0 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
19800 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30  athW(MAX_PATH-30
19810 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  , zWidePath);.  
19820 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f    zMulti = unico
19830 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
19840 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
19850 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
19860 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
19870 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
19880 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
19890 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
198a0 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
198b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
198c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
198d0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
198e0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
198f0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
19900 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
19910 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
19920 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b   char zMbcsPath[
19930 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f  MAX_PATH];.    o
19940 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41  sGetTempPathA(MA
19950 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73  X_PATH-30, zMbcs
19960 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38  Path);.    zUtf8
19970 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
19980 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
19990 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
199a0 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
199b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
199c0 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
199d0 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
199e0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
199f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
19a00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19a20 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
19a30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
19a40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
19a50 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
19a60 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
19a70 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
19a80 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
19a90 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
19aa0 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
19ab0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
19ac0 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50 61 74 68    */.  nTempPath
19ad0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
19ae0 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 0a 0a  30(zTempPath);..
19af0 20 20 69 66 28 20 28 6e 54 65 6d 70 50 61 74 68    if( (nTempPath
19b00 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
19b10 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
19b20 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38  ILE_PREFIX) + 18
19b30 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20  ) >= nBuf ){.   
19b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19b50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  RROR;.  }..  for
19b60 28 69 3d 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e  (i=nTempPath; i>
19b70 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
19b80 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
19b90 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
19ba0 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
19bb0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
19bc0 38 2c 20 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50  8, zBuf, (nTempP
19bd0 61 74 68 20 3e 20 30 29 20 3f 0a 20 20 20 20 20  ath > 0) ?.     
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54    "%s\\"SQLITE_T
19c00 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 20  EMP_FILE_PREFIX 
19c10 3a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  : SQLITE_TEMP_FI
19c20 4c 45 5f 50 52 45 46 49 58 2c 0a 20 20 20 20 20  LE_PREFIX,.     
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
19c40 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
19c50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19c60 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
19c70 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
19c80 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
19c90 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
19ca0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
19cb0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
19cc0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
19cd0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
19ce0 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
19cf0 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
19d00 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
19d10 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
19d20 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45  (("TEMP FILENAME
19d30 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  : %s\n", zBuf));
19d40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19d50 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  _OK; .}../*.** R
19d60 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
19d70 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
19d80 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
19d90 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
19da0 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
19db0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
19dc0 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
19dd0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
19de0 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
19df0 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
19e00 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
19e10 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
19e20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
19e30 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
19e40 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
19e50 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
19e60 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69  tErrno;..  if( i
19e70 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
19e80 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
19e90 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
19ea0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
19eb0 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
19ec0 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
19ed0 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
19ee0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
19ef0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
19f00 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
19f10 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
19f40 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
19f50 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
19f80 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
19f90 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
19fa0 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
19fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
19fc0 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
19fd0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
19fe0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
19ff0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1a000 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1a010 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
1a020 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
1a030 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1a040 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
1a050 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
1a060 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
1a070 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1a080 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
1a090 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
1a0a0 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
1a0b0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1a0c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a0d0 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
1a0e0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1a0f0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
1a100 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1a110 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
1a120 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1a130 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
1a140 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a150 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
1a160 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
1a170 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
1a180 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
1a1b0 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
1a1c0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
1a1d0 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
1a1e0 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
1a1f0 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
1a200 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
1a210 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
1a220 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
1a230 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
1a240 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
1a250 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
1a260 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
1a270 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
1a280 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1a290 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
1a2a0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
1a2b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
1a2c0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
1a2d0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a2f0 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
1a300 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
1a310 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
1a320 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
1a330 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
1a340 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
1a350 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
1a360 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
1a370 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
1a380 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
1a390 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
1a3a0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
1a3b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
1a3c0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
1a3d0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1a3e0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
1a3f0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
1a400 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20 20 20 20  AX_PATH+2];     
1a410 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
1a420 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69  o create temp fi
1a430 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74  lename */..  int
1a440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a460 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
1a470 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ode */.#if !defi
1a480 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53  ned(NDEBUG) || S
1a490 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1a4a0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
1a4b0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
1a4c0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
1a4d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  to open */.#endi
1a4e0 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  f..  int isExclu
1a4f0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
1a500 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1a510 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
1a520 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
1a530 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1a540 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1a550 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
1a560 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1a570 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1a580 41 54 45 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ATE);.#ifndef ND
1a590 45 42 55 47 0a 20 20 69 6e 74 20 69 73 52 65 61  EBUG.  int isRea
1a5a0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
1a5b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
1a5c0 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  EADONLY);.#endif
1a5d0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
1a5e0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
1a5f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a600 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
1a610 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
1a620 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
1a630 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
1a640 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
1a650 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1a660 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
1a670 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1a680 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
1a690 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1a6a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
1a6b0 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   ));.#endif..  /
1a6c0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
1a6d0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
1a6e0 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
1a6f0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
1a700 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
1a710 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
1a720 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
1a730 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
1a740 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
1a750 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
1a760 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
1a770 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
1a780 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
1a790 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
1a7a0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1a7b0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1a7c0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
1a7d0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
1a7e0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
1a7f0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
1a800 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
1a810 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
1a820 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
1a830 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
1a840 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
1a850 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
1a860 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
1a870 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
1a880 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
1a890 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
1a8a0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
1a8b0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1a8c0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
1a8d0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
1a8e0 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
1a8f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
1a900 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
1a910 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
1a920 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
1a930 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
1a940 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
1a950 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1a960 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1a970 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1a980 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
1a990 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1a9a0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1a9b0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1a9c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
1a9d0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1a9e0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1a9f0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1aa00 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1aa10 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
1aa20 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1aa30 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1aa40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1aa50 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1aa60 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
1aa70 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
1aa80 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
1aa90 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
1aaa0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
1aab0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1aac0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
1aad0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1aae0 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
1aaf0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1ab00 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1ab10 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1ab20 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1ab30 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1ab40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1ab50 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
1ab60 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1ab70 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1ab80 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1ab90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1aba0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
1abb0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1abc0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
1abd0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
1abe0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1abf0 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 70  ETER(pVfs);..  p
1ac00 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  File->h = INVALI
1ac10 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
1ac20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
1ac30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1ac40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ac50 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
1ac60 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
1ac70 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
1ac80 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se .  */.  if( !
1ac90 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
1aca0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
1acb0 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e   && !isOpenJourn
1acc0 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  al);.    rc = ge
1acd0 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
1ace0 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  TH+2, zTmpname);
1acf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ad00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ad10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ad20 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
1ad30 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
1ad40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1ad50 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
1ad60 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
1ad70 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
1ad80 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
1ad90 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
1ada0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
1adb0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
1adc0 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
1add0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1ade0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1adf0 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
1ae00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
1ae10 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1ae20 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
1ae30 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65         zUtf8Name
1ae40 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38 4e 61 6d  [strlen(zUtf8Nam
1ae50 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  e)+1]==0 );..  /
1ae60 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
1ae70 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
1ae80 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
1ae90 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
1aea0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1aeb0 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
1aec0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1aed0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1aee0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1aef0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
1af00 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
1af10 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
1af20 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1af30 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
1af40 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1af50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
1af60 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1af70 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
1af80 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
1af90 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
1afa0 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
1afb0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
1afc0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
1afd0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
1afe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1aff0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
1b000 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
1b010 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
1b020 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
1b030 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
1b040 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
1b050 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
1b060 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
1b070 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
1b080 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
1b090 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
1b0a0 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
1b0b0 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
1b0c0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1b0d0 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
1b0e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1b0f0 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
1b100 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
1b110 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1b120 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
1b130 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
1b140 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
1b150 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
1b160 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
1b170 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
1b180 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1b190 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
1b1a0 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
1b1b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
1b1c0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
1b1d0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
1b1e0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
1b1f0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
1b200 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
1b210 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
1b220 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
1b230 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
1b240 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
1b250 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
1b260 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
1b270 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1b280 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
1b290 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
1b2a0 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
1b2b0 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
1b2c0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
1b2d0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
1b2e0 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
1b310 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
1b340 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
1b350 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
1b360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
1b370 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1b380 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
1b390 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
1b3a0 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
1b3b0 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
1b3c0 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
1b3d0 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
1b3e0 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
1b3f0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
1b400 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
1b410 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
1b420 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1b430 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
1b440 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
1b450 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1b460 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
1b470 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
1b480 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b490 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c  RT.    CREATEFIL
1b4a0 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
1b4b0 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50  METERS extendedP
1b4c0 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65  arameters;.    e
1b4d0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1b4e0 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f  s.dwSize = sizeo
1b4f0 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  f(CREATEFILE2_EX
1b500 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
1b510 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  S);.    extended
1b520 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
1b530 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20  eAttributes =.  
1b540 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
1b550 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
1b560 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1b570 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
1b580 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
1b590 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61  ileFlags = dwFla
1b5a0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
1b5b0 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  & FILE_FLAG_MASK
1b5c0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1b5d0 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72  rameters.dwSecur
1b5e0 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45  ityQosFlags = SE
1b5f0 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53  CURITY_ANONYMOUS
1b600 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1b610 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72  rameters.lpSecur
1b620 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20  ityAttributes = 
1b630 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64  NULL;.    extend
1b640 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65  edParameters.hTe
1b650 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c  mplateFile = NUL
1b660 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  L;.    while( (h
1b670 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
1b680 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1b690 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
1b6c0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1b710 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1b720 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
1b750 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49  meters))==INVALI
1b760 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1b770 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1b7a0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7c0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
1b7d0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
1b7e0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
1b7f0 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
1b800 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
1b830 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
1b860 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
1b890 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
1b8c0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
1b8d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
1b900 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b930 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1b940 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b960 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
1b970 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
1b980 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1b990 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1b9a0 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
1b9b0 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43  CreateFileA((LPC
1b9c0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1b9f0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
1ba20 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1ba50 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1ba60 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
1ba90 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
1bac0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1bad0 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28       retryIoerr(
1bb00 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1bb10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1bb20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
1bb30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1bb40 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
1bb50 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
1bb60 45 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25  EN %d %s 0x%lx %
1bb70 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
1bb80 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65    h, zName, dwDe
1bb90 73 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20  siredAccess, .  
1bba0 20 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41           h==INVA
1bbb0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1bbc0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
1bbd0 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d  k"));..  if( h==
1bbe0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1bbf0 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c  ALUE ){.    pFil
1bc00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
1bc10 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
1bc20 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1bc30 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65  _CANTOPEN, pFile
1bc40 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  ->lastErrno, "wi
1bc50 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d  nOpen", zUtf8Nam
1bc60 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
1bc70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1bc80 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  ;.    if( isRead
1bc90 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
1bca0 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72  usive ){.      r
1bcb0 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56  eturn winOpen(pV
1bcc0 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a  fs, zName, id, .
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
1bce0 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  lags|SQLITE_OPEN
1bcf0 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c  _READONLY)&~(SQL
1bd00 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
1bd10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1bd20 57 52 49 54 45 29 29 2c 20 70 4f 75 74 46 6c 61  WRITE)), pOutFla
1bd30 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
1bd40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bd50 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1bd60 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
1bd70 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
1bd80 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
1bd90 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  rite ){.      *p
1bda0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
1bdb0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1bdc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bdd0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
1bde0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1bdf0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
1be00 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
1be10 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c   0, sizeof(*pFil
1be20 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  e));.  pFile->pM
1be30 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65  ethod = &winIoMe
1be40 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  thod;.  pFile->h
1be50 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c   = h;.  pFile->l
1be60 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
1be70 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56  ROR;.  pFile->pV
1be80 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69  fs = pVfs;.  pFi
1be90 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  le->pShm = 0;.  
1bea0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a  pFile->zPath = z
1beb0 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69  Name;.  if( sqli
1bec0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1bed0 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53  zName, "psow", S
1bee0 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
1bef0 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
1bf00 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1bf10 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53  gs |= WINFILE_PS
1bf20 4f 57 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  OW;.  }..#if SQL
1bf30 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
1bf40 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
1bf50 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
1bf60 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
1bf70 20 20 20 20 26 26 20 21 77 69 6e 63 65 43 72 65      && !winceCre
1bf80 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70  ateLock(zName, p
1bf90 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f  File).  ){.    o
1bfa0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
1bfb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1bfc0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1bfd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bfe0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
1bff0 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70    }.  if( isTemp
1c000 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a   ){.    pFile->z
1c010 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20  DeleteOnClose = 
1c020 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65  zConverted;.  }e
1c030 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1c040 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c050 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
1c060 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ..  OpenCounter(
1c070 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  +1);.  return rc
1c080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1c090 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
1c0a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1c0b0 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t Windows does n
1c0c0 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
1c0d0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
1c0e0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
1c0f0 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
1c100 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
1c110 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
1c120 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
1c130 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
1c140 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
1c150 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
1c160 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
1c170 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
1c180 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20  tever it does.  
1c190 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
1c1a0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1c1b0 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
1c1c0 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
1c1d0 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
1c1e0 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
1c1f0 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
1c200 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
1c210 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
1c220 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
1c230 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
1c240 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
1c250 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
1c260 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
1c270 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
1c280 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
1c290 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
1c2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1c2b0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
1c2c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1c2d0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
1c2e0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
1c2f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1c300 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
1c310 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
1c320 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
1c330 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
1c340 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
1c350 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29  ed on win32 */.)
1c360 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
1c370 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f  .  int rc;.  DWO
1c380 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44  RD attr;.  DWORD
1c390 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f   lastErrno;.  vo
1c3a0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1c3b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c3c0 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53  ER(pVfs);.  UNUS
1c3d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e  ED_PARAMETER(syn
1c3e0 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  cDir);..  Simula
1c3f0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
1c400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
1c410 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  LETE);.  zConver
1c420 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1c430 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
1c440 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
1c450 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
1c460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c470 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1c480 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1c490 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
1c4a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1c4b0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1c4c0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1c4d0 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
1c4e0 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
1c4f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
1c500 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
1c510 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
1c520 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
1c530 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
1c540 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1c570 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
1c580 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
1c590 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
1c5a0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
1c5b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1c5c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
1c5d0 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
1c5e0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
1c5f0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
1c600 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
1c610 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
1c620 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  (zConverted);.#e
1c630 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20  ndif.      if ( 
1c640 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
1c650 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
1c660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c670 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65  LITE_OK; /* Alre
1c680 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
1c690 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c6a0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
1c6b0 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
1c6c0 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
1c6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c6e0 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
1c6f0 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
1c700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c710 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
1c720 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
1c730 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
1c740 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c750 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
1c760 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
1c770 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c780 20 20 20 69 66 20 28 20 21 72 65 74 72 79 49 6f     if ( !retryIo
1c790 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1c7a0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1c7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1c7c0 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
1c7d0 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
1c7e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c7f0 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
1c800 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
1c810 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1c820 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
1c830 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
1c840 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1c850 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
1c860 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
1c870 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
1c880 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
1c890 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c8a0 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65 61 64  TE_OK; /* Alread
1c8b0 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
1c8c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c8d0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
1c8e0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
1c8f0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
1c900 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c910 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
1c920 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
1c930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c940 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
1c950 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
1c960 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
1c970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c980 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
1c990 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1c9a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c9b0 20 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72   if ( !retryIoer
1c9c0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1c9d0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
1c9e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1c9f0 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
1ca00 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
1ca10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ca20 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
1ca30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
1ca40 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   rc ){.    rc = 
1ca50 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1ca60 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
1ca70 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
1ca80 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c           "winDel
1ca90 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
1caa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
1cab0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
1cac0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1cad0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1cae0 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
1caf0 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a   \"%s\" %s\n", z
1cb00 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20  Filename, (rc ? 
1cb10 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20  "failed" : "ok" 
1cb20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
1cb30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1cb40 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61   the existance a
1cb50 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66  nd status of a f
1cb60 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1cb70 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20  nt winAccess(.  
1cb80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1cb90 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  s,         /* No
1cba0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
1cbb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1cbc0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
1cbd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
1cbe0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
1cbf0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
1cc00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
1cc10 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65   of test to make
1cc20 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
1cc30 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cc50 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a   OUT: Result */.
1cc60 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
1cc70 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
1cc80 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1cc90 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1cca0 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
1ccb0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1ccc0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1ccd0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1cce0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
1ccf0 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
1cd00 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
1cd10 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
1cd20 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
1cd30 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
1cd40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1cd50 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
1cd60 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
1cd70 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
1cd80 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
1cd90 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
1cda0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
1cdb0 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
1cdc0 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
1cdd0 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
1cde0 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
1cdf0 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
1ce00 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1ce10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
1ce30 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
1ce40 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20  dard, .         
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
1ce70 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26   && retryIoerr(&
1ce80 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1ce90 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
1cea0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
1ceb0 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
1cec0 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
1ced0 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
1cee0 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
1cef0 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
1cf00 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
1cf10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
1cf20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
1cf30 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
1cf40 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
1cf50 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
1cf60 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
1cf70 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
1cf80 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
1cf90 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
1cfa0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1cfb0 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
1cfc0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
1cfd0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
1cfe0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
1cff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d000 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72  {.      logIoerr
1d010 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (cnt);.      if(
1d020 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
1d030 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
1d040 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c   ){.        winL
1d050 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d060 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73  OERR_ACCESS, las
1d070 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65  tErrno, "winAcce
1d080 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ss", zFilename);
1d090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d0a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1d0b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1d0c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
1d0d0 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c  CCESS;.      }el
1d0e0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
1d0f0 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
1d100 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
1d110 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
1d120 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1d130 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1d140 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
1d150 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1d160 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
1d170 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
1d180 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
1d190 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1d1a0 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
1d1b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d1c0 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
1d1d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
1d1e0 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
1d1f0 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
1d200 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1d210 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
1d220 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1d230 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
1d240 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
1d250 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
1d260 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
1d270 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
1d280 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
1d290 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
1d2a0 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
1d2b0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1d2c0 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
1d2d0 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
1d2e0 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
1d2f0 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
1d300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d310 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
1d320 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
1d330 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
1d340 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
1d350 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
1d360 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
1d370 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
1d380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
1d390 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1d3a0 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
1d3b0 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
1d3c0 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
1d3d0 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
1d3e0 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
1d3f0 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
1d400 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
1d410 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
1d420 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
1d430 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
1d440 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
1d450 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
1d460 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
1d470 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
1d480 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
1d490 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
1d4a0 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
1d4b0 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
1d4c0 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
1d4d0 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
1d4e0 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
1d4f0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
1d500 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
1d510 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
1d520 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
1d530 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
1d540 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
1d550 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
1d560 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
1d570 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
1d580 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
1d590 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
1d5a0 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
1d5b0 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
1d5c0 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
1d5d0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
1d5e0 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
1d5f0 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
1d600 20 20 2a 2f 0a 20 20 69 66 20 28 20 7a 50 61 74    */.  if ( zPat
1d610 68 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c  hname[0]=='/' ||
1d620 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27   zPathname[0]=='
1d630 5c 5c 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  \\' ){.    retur
1d640 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
1d650 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
1d660 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
1d670 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
1d680 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
1d690 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
1d6a0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
1d6b0 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
1d6c0 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
1d6d0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1d6e0 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
1d6f0 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
1d700 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
1d710 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
1d720 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
1d730 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
1d740 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
1d750 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 49 73    if ( sqlite3Is
1d760 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b  alpha(zPathname[
1d770 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65  0]) && zPathname
1d780 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [1]==':' ){.    
1d790 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
1d7a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  /*.  ** If w
1d7b0 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  e get to this po
1d7c0 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61  int, the path na
1d7d0 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74  me should almost
1d7e0 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20   certainly be a 
1d7f0 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61  purely.  ** rela
1d800 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e  tive one (i.e. n
1d810 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e  ot a UNC name, n
1d820 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64  ot absolute, and
1d830 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61   not volume rela
1d840 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65  tive)..  */.  re
1d850 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f  turn FALSE;.}../
1d860 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
1d870 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
1d880 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
1d890 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
1d8a0 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
1d8b0 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
1d8c0 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
1d8d0 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
1d8e0 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
1d8f0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
1d900 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
1d910 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
1d920 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1d930 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d940 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
1d950 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1d960 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
1d970 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
1d980 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
1d990 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
1d9a0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
1d9b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d9c0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
1d9d0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
1d9e0 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1da00 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
1da10 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ){.  .#if define
1da20 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
1da30 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1da40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1da50 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
1da60 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
1da70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
1da80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d  s->mxPathname>=M
1da90 41 58 5f 50 41 54 48 20 29 3b 0a 20 20 61 73 73  AX_PATH );.  ass
1daa0 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
1dab0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
1dac0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
1dad0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
1dae0 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
1daf0 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
1db00 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
1db10 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
1db20 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1db30 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
1db40 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
1db50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
1db60 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
1db70 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
1db80 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
1db90 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
1dba0 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
1dbb0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
1dbc0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
1dbd0 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
1dbe0 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
1dbf0 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
1dc00 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
1dc10 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
1dc20 20 63 68 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50   char zOut[MAX_P
1dc30 41 54 48 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73  ATH+1];.    mems
1dc40 65 74 28 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f  et(zOut, 0, MAX_
1dc50 50 41 54 48 2b 31 29 3b 0a 20 20 20 20 63 79 67  PATH+1);.    cyg
1dc60 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 77 69 6e 33  win_conv_to_win3
1dc70 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65  2_path(zRelative
1dc80 2c 20 7a 4f 75 74 29 3b 20 2f 2a 20 50 4f 53 49  , zOut); /* POSI
1dc90 58 20 74 6f 20 57 69 6e 33 32 20 2a 2f 0a 20 20  X to Win32 */.  
1dca0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1dcb0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
1dcc0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
1dcd0 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22   zFull, "%s\\%s"
1dce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dcf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
1dd00 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a  ata_directory, z
1dd10 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1dd20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
1dd30 45 3a 20 54 68 65 20 43 79 67 77 69 6e 20 64 6f  E: The Cygwin do
1dd40 63 73 20 73 74 61 74 65 20 74 68 61 74 20 74 68  cs state that th
1dd50 65 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  e maximum length
1dd60 20 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 20   needed.    **  
1dd70 20 20 20 20 20 66 6f 72 20 74 68 65 20 62 75 66       for the buf
1dd80 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 63 79  fer passed to cy
1dd90 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c  gwin_conv_to_ful
1dda0 6c 5f 77 69 6e 33 32 5f 70 61 74 68 0a 20 20 20  l_win32_path.   
1ddb0 20 2a 2a 20 20 20 20 20 20 20 69 73 20 4d 41 58   **       is MAX
1ddc0 5f 50 41 54 48 2e 0a 20 20 20 20 2a 2f 0a 20 20  _PATH..    */.  
1ddd0 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f    cygwin_conv_to
1dde0 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68  _full_win32_path
1ddf0 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c  (zRelative, zFul
1de00 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
1de10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
1de20 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  if..#if (SQLITE_
1de30 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
1de40 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20  TE_OS_WINRT) && 
1de50 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
1de60 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
1de70 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1de80 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1de90 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f   /* WinCE has no
1dea0 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65   concept of a re
1deb0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c  lative pathname,
1dec0 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64   or so I am told
1ded0 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20  . */.  /* WinRT 
1dee0 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f  has no way to co
1def0 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65  nvert a relative
1df00 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f   path to an abso
1df10 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69  lute one. */.  i
1df20 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
1df30 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
1df40 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
1df50 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
1df60 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1df70 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
1df80 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
1df90 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
1dfa0 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
1dfb0 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
1dfc0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
1dfd0 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
1dfe0 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
1dff0 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
1e000 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
1e010 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
1e020 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
1e030 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
1e040 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
1e050 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
1e060 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b  ctory and a back
1e070 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
1e080 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e090 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
1e0a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
1e0b0 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22   zFull, "%s\\%s"
1e0c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e0d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
1e0e0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a  ata_directory, z
1e0f0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c  Relative);.  }el
1e100 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
1e110 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
1e120 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
1e130 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
1e140 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
1e150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e160 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
1e170 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
1e180 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
1e190 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
1e1a0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
1e1b0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
1e1c0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1e1d0 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
1e1e0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
1e1f0 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
1e200 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
1e210 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
1e220 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
1e230 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
1e240 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
1e250 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
1e260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
1e270 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
1e280 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  & sqlite3Isalpha
1e290 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26  (zRelative[1]) &
1e2a0 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d  & zRelative[2]==
1e2b0 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  ':' ){.    zRela
1e2c0 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
1e2d0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
1e2e0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
1e2f0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
1e300 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
1e310 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
1e320 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
1e330 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
1e340 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
1e350 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
1e360 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
1e370 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1e380 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
1e390 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
1e3a0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
1e3b0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
1e3c0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
1e3d0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
1e3e0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1e3f0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1e400 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
1e410 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
1e420 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
1e430 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
1e440 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
1e450 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
1e460 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
1e470 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1e480 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
1e490 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
1e4a0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
1e4b0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
1e4c0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
1e4d0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
1e4e0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
1e4f0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
1e500 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
1e510 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
1e520 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
1e530 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
1e540 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
1e550 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
1e560 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e570 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
1e580 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e590 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25  ), zFull, "%s\\%
1e5a0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1e5b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e5c0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
1e5d0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
1e5e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e5f0 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
1e600 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1e610 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
1e620 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
1e630 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
1e640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e650 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1e660 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1e670 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
1e680 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
1e690 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
1e6a0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1e6b0 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
1e6c0 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
1e6d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1e6e0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
1e6f0 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
1e700 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
1e710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e720 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1e730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e740 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1e750 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75     }.    osGetFu
1e760 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
1e770 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1e780 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
1e790 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1e7a0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1e7b0 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63  .    zOut = unic
1e7c0 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29  odeToUtf8(zTemp)
1e7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e7e0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
1e7f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1e800 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1e810 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
1e820 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
1e830 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
1e840 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
1e850 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20  erted, 0, 0, 0) 
1e860 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  + 3;.    zTemp =
1e870 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1e880 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
1e890 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
1e8a0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
1e8b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1e8c0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1e8d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e8e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1e8f0 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46      }.    osGetF
1e900 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
1e910 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
1e920 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
1e930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e940 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1e950 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
1e960 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
1e970 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
1e980 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1e990 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
1e9a0 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
1e9b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e9c0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
1e9d0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e9e0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
1e9f0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
1ea00 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
1ea10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ea20 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1ea30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ea40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1ea50 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64  .#endif.}..#ifnd
1ea60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1ea70 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
1ea80 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
1ea90 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
1eaa0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
1eab0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
1eac0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
1ead0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1eae0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
1eaf0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
1eb00 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  */./*.** Interfa
1eb10 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
1eb20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
1eb30 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
1eb40 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
1eb50 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
1eb60 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
1eb70 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
1eb80 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
1eb90 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
1eba0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1ebb0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1ebc0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
1ebd0 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  LE h;.  void *zC
1ebe0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1ebf0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1ec00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
1ec10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1ec20 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  fs);.  if( zConv
1ec30 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
1ec40 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ec50 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69  if( isNT() ){.#i
1ec60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1ec70 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
1ec80 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
1ec90 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1eca0 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
1ecb0 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
1ecc0 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
1ecd0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
1ece0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
1ecf0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1ed00 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
1ed10 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
1ed20 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
1ed30 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
1ed40 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
1ed50 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1ed60 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
1ed70 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
1ed80 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
1ed90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1eda0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1edb0 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
1edc0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1edd0 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  .  getLastErrorM
1ede0 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
1edf0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
1ee00 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
1ee10 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
1ee20 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1ee30 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20   void *pHandle, 
1ee40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
1ee50 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 55  bol))(void){.  U
1ee60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ee70 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
1ee80 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f  (void(*)(void))o
1ee90 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
1eea0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
1eeb0 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74  , zSymbol);.}.st
1eec0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
1eed0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
1eee0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
1eef0 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
1ef00 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1ef10 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
1ef20 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
1ef30 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
1ef40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
1ef50 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
1ef60 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
1ef70 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20  efine winDlOpen 
1ef80 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
1ef90 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
1efa0 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30  ine winDlSym   0
1efb0 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
1efc0 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
1efd0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20  ./*.** Write up 
1efe0 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  to nBuf bytes of
1eff0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f   randomness into
1f000 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
1f010 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65   int winRandomne
1f020 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
1f030 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
1f040 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69  char *zBuf){.  i
1f050 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53  nt n = 0;.  UNUS
1f060 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1f070 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s);.#if defined(
1f080 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e  SQLITE_TEST).  n
1f090 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65   = nBuf;.  memse
1f0a0 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
1f0b0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  ;.#else.  if( si
1f0c0 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29  zeof(SYSTEMTIME)
1f0d0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
1f0e0 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20  SYSTEMTIME x;.  
1f0f0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
1f100 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
1f110 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
1f120 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
1f130 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
1f140 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
1f150 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
1f160 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
1f170 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50   = osGetCurrentP
1f180 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20  rocessId();.    
1f190 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1f1a0 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
1f1b0 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  d));.    n += si
1f1c0 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23  zeof(pid);.  }.#
1f1d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1f1e0 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  RT.  if( sizeof(
1f1f0 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66  ULONGLONG)<=nBuf
1f200 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c  -n ){.    ULONGL
1f210 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ONG cnt = osGetT
1f220 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20  ickCount64();.  
1f230 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
1f240 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
1f250 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
1f260 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
1f270 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
1f280 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
1f290 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
1f2a0 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
1f2b0 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
1f2c0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
1f2d0 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
1f2e0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1f2f0 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (cnt);.  }.#endi
1f300 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  f.  if( sizeof(L
1f310 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e  ARGE_INTEGER)<=n
1f320 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52  Buf-n ){.    LAR
1f330 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20  GE_INTEGER i;.  
1f340 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d    osQueryPerform
1f350 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
1f360 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
1f370 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66  f[n], &i, sizeof
1f380 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (i));.    n += s
1f390 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65  izeof(i);.  }.#e
1f3a0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ndif.  return n;
1f3b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
1f3c0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
1f3d0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
1f3e0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
1f3f0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
1f400 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
1f410 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1f420 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
1f430 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
1f440 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
1f450 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
1f460 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1f470 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
1f480 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
1f490 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
1f4a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1f4b0 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
1f4c0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
1f4d0 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
1f4e0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
1f4f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
1f500 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
1f510 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
1f520 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
1f530 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
1f540 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
1f550 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
1f560 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1f570 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
1f580 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
1f590 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
1f5a0 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
1f5b0 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
1f5c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
1f5d0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1f5e0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
1f5f0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
1f600 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
1f610 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
1f620 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
1f630 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
1f640 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
1f650 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
1f660 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
1f670 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
1f680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
1f690 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
1f6a0 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
1f6b0 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
1f6c0 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
1f6d0 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
1f6e0 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
1f6f0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
1f700 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
1f710 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
1f720 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
1f730 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
1f740 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
1f750 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
1f760 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
1f770 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
1f780 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
1f790 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
1f7a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
1f7b0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
1f7c0 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
1f7d0 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
1f7e0 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
1f7f0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
1f800 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31  umber of .     1
1f810 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
1f820 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
1f830 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
1f840 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20   JD 2305813.5). 
1f850 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
1f860 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
1f870 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
1f880 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
1f890 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
1f8a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
1f8b0 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
1f8c0 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
1f8d0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1f8e0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
1f8f0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
1f900 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
1f910 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
1f920 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
1f930 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
1f940 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
1f950 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1f960 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
1f970 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20  32BitValue = .  
1f980 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
1f990 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
1f9a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
1f9b0 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
1f9c0 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
1f9d0 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
1f9e0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
1f9f0 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
1fa00 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
1fa10 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20  &time);.  /* if 
1fa20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
1fa30 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74  Time() fails, it
1fa40 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a   returns zero. *
1fa50 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65  /.  if (!osSyste
1fa60 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
1fa70 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20  &time,&ft)){.   
1fa80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1fa90 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  RROR;.  }.#else.
1faa0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
1fab0 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
1fac0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70   );.#endif..  *p
1fad0 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69  iNow = winFileti
1fae0 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20  meEpoch +.      
1faf0 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65        ((((sqlite
1fb00 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67  3_int64)ft.dwHig
1fb10 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32  hDateTime)*max32
1fb20 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20  BitValue) + .   
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1fb40 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
1fb50 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
1fb60 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
1fb70 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
1fb80 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
1fb90 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
1fba0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
1fbb0 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
1fbc0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
1fbd0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
1fbe0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
1fbf0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
1fc00 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
1fc10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
1fc30 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1fc40 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
1fc50 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
1fc60 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
1fc70 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
1fc80 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
1fc90 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
1fca0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
1fcb0 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
1fcc0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
1fcd0 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
1fce0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
1fcf0 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
1fd00 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
1fd10 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
1fd20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
1fd30 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
1fd40 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
1fd50 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
1fd60 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
1fd70 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
1fd80 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
1fd90 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
1fda0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1fdb0 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
1fdc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
1fdd0 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
1fde0 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
1fdf0 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
1fe00 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
1fe10 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
1fe20 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
1fe30 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
1fe40 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
1fe50 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
1fe60 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
1fe70 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
1fe80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
1fe90 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
1fea0 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
1feb0 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
1fec0 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
1fed0 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
1fee0 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
1fef0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
1ff00 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
1ff10 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
1ff20 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
1ff30 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
1ff40 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
1ff50 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
1ff60 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
1ff70 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
1ff80 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
1ff90 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
1ffa0 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
1ffb0 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
1ffc0 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
1ffd0 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
1ffe0 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
1fff0 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
20000 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
20010 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
20020 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
20030 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
20040 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
20050 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
20060 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
20070 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
20080 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
20090 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
200a0 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
200b0 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
200c0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
200d0 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
200e0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
200f0 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
20100 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
20110 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
20120 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
20130 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20140 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
20150 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
20160 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
20170 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
20180 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
20190 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
201a0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
201b0 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
201c0 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
201d0 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
201e0 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
201f0 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
20200 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
20210 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
20220 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
20230 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
20240 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
20250 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
20260 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
20270 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
20280 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
20290 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
202a0 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
202b0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
202c0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
202d0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
202e0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
202f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20300 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
20310 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72  urn getLastError
20320 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
20330 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
20340 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
20350 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
20360 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
20370 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
20380 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
20390 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
203a0 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
203b0 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
203c0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
203e0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
203f0 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
20400 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
20410 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41  le */.    MAX_PA
20420 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  TH,            /
20430 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
20440 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
20450 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
20460 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
20470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20480 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
204b0 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
204c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
204d0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
204e0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
204f0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
20500 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
20510 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
20520 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
20530 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
20540 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
20550 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
20560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
20570 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
20580 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
20590 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
205a0 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
205b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
205c0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
205d0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
205e0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
205f0 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
20600 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
20610 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
20620 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
20630 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
20640 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
20650 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
20660 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
20670 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
20680 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
20690 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
206a0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
206b0 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
206c0 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
206d0 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
206e0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
206f0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
20700 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
20710 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
20720 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
20730 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
20740 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
20750 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20  l */.  };..  /* 
20760 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
20770 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
20780 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
20790 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
207a0 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
207b0 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
207c0 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
207d0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
207e0 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 33  ze(aSyscall)==73
207f0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
20800 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f  ITE_OMIT_WAL.  /
20810 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70  * get memory map
20820 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e   allocation gran
20830 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d  ularity */.  mem
20840 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c  set(&winSysInfo,
20850 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45   0, sizeof(SYSTE
20860 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51  M_INFO));.#if SQ
20870 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
20880 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
20890 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
208a0 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65  o);.#else.  osGe
208b0 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  tSystemInfo(&win
208c0 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  SysInfo);.#endif
208d0 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53 79 73  .  assert(winSys
208e0 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
208f0 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30  nGranularity > 0
20900 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
20910 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
20920 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20  r(&winVfs, 1);. 
20930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20940 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  K; .}..int sqlit
20950 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
20960 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   .#if SQLITE_OS_
20970 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
20980 70 4f 62 6a 20 21 3d 20 4e 55 4c 4c 20 29 7b 0a  pObj != NULL ){.
20990 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
209a0 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20  e(sleepObj);.   
209b0 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
209c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
209d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
209e0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
209f0 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a     LITE_OS_WIN */.