/ Hex Artifact Content
Login

Artifact ed4f4f5cad8c708d5e443139df0d65e9354b8368:


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 34 30 39 36 2d  UF_SIZE   (4096-
0cc0: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 0a 23  sizeof(DWORD)).#
0cd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
0ce0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
0cf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
0d00: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
0d10: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
0d20: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
0d30: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
0d40: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
0d50: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
0d60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d70: 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  LLOC./*. * The i
0d80: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
0d90: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
0da0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
0db0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
0dc0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0dd0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
0de0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
0df0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0e00: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28  HEAP_INIT_SIZE (
0e10: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
0e20: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44         (SQLITE_D
0e60: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
0e70: 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e  ) + 4194304).#en
0e80: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d  dif../*. * The m
0e90: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
0ea0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
0eb0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
0ec0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
0ed0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0ee0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
0ef0: 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  AX_SIZE.#  defin
0f00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
0f10: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30  EAP_MAX_SIZE  (0
0f20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
0f30: 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20  The extra flags 
0f40: 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20  to use in calls 
0f50: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61  to the Win32 hea
0f60: 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61  p APIs.  This va
0f70: 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65  lue may be. * ze
0f80: 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75  ro for the defau
0f90: 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f  lt behavior.. */
0fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0fb0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
0fc0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0fd0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
0fe0: 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69  GS     (0).#endi
0ff0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  f../*.** The win
1000: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
1010: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
1020: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1030: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1040: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
1050: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
1060: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
1070: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1080: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
1090: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
10a0: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
10b0: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
10c0: 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic;    /* Magic 
10d0: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
10e0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
10f0: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
1100: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
1110: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
1120: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
1130: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
1140: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
1150: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
1160: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
1170: 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64  n)? */.};..#ifnd
1180: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
1190: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20  e WINMEM_MAGIC  
11a0: 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 65     0x42b2830b.#e
11b0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72  ndif..static str
11c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77  uct winMemData w
11d0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a  in_mem_data = {.
11e0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11f0: 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23   WINMEM_MAGIC,.#
1200: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
1210: 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  LSE.};..#ifndef 
1220: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
1230: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
1240: 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d  () assert( win_m
1250: 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57  em_data.magic==W
1260: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65  INMEM_MAGIC ).#e
1270: 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  lse.#define winM
1280: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a  emAssertMagic().
1290: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
12a0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
12b0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65  win_mem_data.hHe
12c0: 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ap..static void 
12d0: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
12e0: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
12f0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
1300: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b  e(void *pPrior);
1310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
1320: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
1330: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
1340: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  ytes);.static in
1350: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
1360: 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  d *p);.static in
1370: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
1380: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69  int n);.static i
1390: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
13a0: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73  id *pAppData);.s
13b0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
13c0: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
13d0: 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73  pAppData);..cons
13e0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
13f0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
1400: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b  mGetWin32(void);
1410: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1420: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
1430: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1440: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
1450: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
1460: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
1470: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
1480: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
1490: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
14a0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
14b0: 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20   is Win9x.** or 
14c0: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
14d0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
14e0: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
14f0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
1500: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a  stem is Win9x..*
1510: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
1520: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
1530: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
1540: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1550: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
1560: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
1570: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
1580: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
1590: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
15a0: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
15b0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
15c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
15d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
15e0: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ype = 0;.#else.s
15f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1600: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
1610: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
1620: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
1630: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1640: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1650: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1660: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1670: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
1680: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c  QLITE_OS_WINNT |
1690: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
16a0: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
16b0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
16c0: 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  E.#endif..#ifnde
16d0: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
16e0: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
16f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
1700: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1710: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a 2a  TE_OS_WINCE./*.*
1720: 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 61  * These macros a
1730: 72 65 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  re necessary bec
1740: 61 75 73 65 20 57 69 6e 64 6f 77 73 20 43 45 20  ause Windows CE 
1750: 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76 65 6c  does not nativel
1760: 79 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  y support the.**
1770: 20 57 69 6e 33 32 20 41 50 49 73 20 4c 6f 63 6b   Win32 APIs Lock
1780: 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46 69 6c 65  File, UnlockFile
1790: 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  , and LockFileEx
17a0: 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65  .. */..#  define
17b0: 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c   LockFile(a,b,c,
17c0: 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63 65  d,e)       wince
17d0: 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20  LockFile(&a, b, 
17e0: 63 2c 20 64 2c 20 65 29 0a 23 20 20 64 65 66 69  c, d, e).#  defi
17f0: 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c  ne UnlockFile(a,
1800: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 6e  b,c,d,e)     win
1810: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 2c  ceUnlockFile(&a,
1820: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20   b, c, d, e).#  
1830: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45  define LockFileE
1840: 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20  x(a,b,c,d,e,f)  
1850: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
1860: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c  (&a, b, c, d, e,
1870: 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65   f)../*.** These
1880: 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61 6c   are the special
1890: 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20 66   syscall hacks f
18a0: 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 20  or Windows CE.  
18b0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 61  The locking rela
18c0: 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65 73 20 68  ted.** defines h
18d0: 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68 65  ere refer to the
18e0: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20   macros defined 
18f0: 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20 2a 2f 0a  just above.. */.
1900: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 4c 6f 63  .#  define osLoc
1910: 6b 46 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kFile           
1920: 20 20 20 20 20 4c 6f 63 6b 46 69 6c 65 0a 23 20       LockFile.# 
1930: 20 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b   define osUnlock
1940: 46 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  File            
1950: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 20 20    UnlockFile.#  
1960: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
1970: 65 45 78 20 20 20 20 20 20 20 20 20 20 20 20 20  eEx             
1980: 20 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 65 6e 64   LockFileEx.#end
1990: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
19a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
19b0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
19c0: 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e  ows CE or WinRT.
19d0: 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  . */..#if SQLITE
19e0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
19f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20  ITE_OS_WINRT.#  
1a00: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
1a10: 41 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20  ApisANSI()      
1a20: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
1a30: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
1a40: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
1a50: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
1a60: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
1a70: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
1a80: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
1a90: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
1aa0: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
1ab0: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
1ac0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
1ad0: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
1ae0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
1af0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
1b00: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
1b10: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
1b20: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
1b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
1b40: 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a  t win_syscall {.
1b50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1b60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1b70: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
1b80: 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  ytem call */.  s
1b90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
1ba0: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
1bb0: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
1bc0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
1bd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
1be0: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
1bf0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
1c00: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
1c10: 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51  ll[] = {.#if !SQ
1c20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1c30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1c40: 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  T.  { "AreFileAp
1c50: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
1c60: 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c   (SYSCALL)AreFil
1c70: 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20  eApisANSI,      
1c80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
1c90: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
1ca0: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
1cb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1cd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
1ce0: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1cf0: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1d00: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1d10: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1d20: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
1d30: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
1d40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1d50: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
1d60: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
1d70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1d80: 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20  )CharLowerW,    
1d90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1da0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f  else.  { "CharLo
1db0: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
1dc0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
1df0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
1e00: 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52  rLowerW ((LPWSTR
1e10: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
1e20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
1e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
1e40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
1e50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1e60: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1e70: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
1e90: 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72  YSCALL)CharUpper
1ea0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
1eb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
1ec0: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
1ed0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
1ee0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
1f00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
1f10: 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28   osCharUpperW ((
1f20: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
1f30: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
1f40: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
1f50: 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22   { "CloseHandle"
1f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
1f70: 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64  YSCALL)CloseHand
1f80: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1f90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
1fa0: 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f  CloseHandle ((BO
1fb0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
1fc0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  LE))aSyscall[3].
1fd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
1fe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1ff0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
2000: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2020: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2030: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
2040: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2050: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
2060: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2070: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2080: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2090: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
20a0: 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28  osCreateFileA ((
20b0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
20c0: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  LPCSTR,DWORD,DWO
20d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
20e0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
20f0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
2100: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
2110: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [4].pCurrent)..#
2120: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2130: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
2140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2150: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
2160: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2170: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2180: 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  eateFileW,      
2190: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
21a0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
21b0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
21c0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
21f0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2200: 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57  FileW ((HANDLE(W
2210: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
2220: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
2230: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
2240: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
2250: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
2260: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2270: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2280: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2290: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
22a0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
22b0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
22c0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
22d0: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
22e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
22f0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
2300: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2320: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2330: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2340: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2350: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
2360: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
2370: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
2380: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
2390: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
23a0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
23b0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
23c0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
23d0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
23e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
23f0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2400: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
2410: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2420: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
2430: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2440: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
2450: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
2460: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2490: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
24a0: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
24b0: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
24c0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
24d0: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
24e0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
24f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
2500: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2510: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
2520: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
2530: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
2540: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
2550: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
2560: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
2570: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
2580: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
25b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
25c0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
25d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
25e0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
25f0: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
2600: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2610: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2620: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
2630: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
2640: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
2650: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
2660: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2670: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
2680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
2690: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
26c0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
26d0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
26e0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
26f0: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
2700: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2710: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
2720: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2730: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46  ime", (SYSCALL)F
2740: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2750: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
2760: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
2770: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
2780: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
27b0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
27c0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
27d0: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
27e0: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
27f0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
2800: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
2810: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
2820: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2830: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
2840: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
2850: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69  ,    (SYSCALL)Fi
2860: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2870: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  me,    0 },.#els
2880: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
2890: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
28a0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
28d0: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
28e0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28  meToSystemTime (
28f0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
2900: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
2910: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
2920: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
2930: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
2940: 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75    { "FlushFileBu
2950: 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28  ffers",        (
2960: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c  SYSCALL)FlushFil
2970: 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20  eBuffers,       
2980: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2990: 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
29a0: 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  s ((BOOL(WINAPI*
29b0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
29c0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
29d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
29e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
29f0: 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  NSI).  { "Format
2a00: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
2a10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
2a20: 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20  matMessageA,    
2a30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2a40: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
2a50: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
2a60: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2a90: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
2aa0: 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28  essageA ((DWORD(
2ab0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2ac0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2ad0: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
2ae0: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
2af0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d  t*))aSyscall[13]
2b00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2b10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2b20: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2b30: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
2b40: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
2b50: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
2b60: 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20  sageW,          
2b70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2b80: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
2b90: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2ba0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2bc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2bd0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
2be0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
2bf0: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
2c00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57  ,DWORD,DWORD,LPW
2c10: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2c20: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2c30: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
2c40: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 72 65 65  rent)..  { "Free
2c50: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
2c60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2c70: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
2c80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2c90: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
2ca0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
2cb0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
2cc0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
2cd0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
2ce0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
2cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
2d00: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2d10: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
2d20: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
2d30: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
2d40: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
2d50: 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43  )aSyscall[16].pC
2d60: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2d70: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2d80: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d90: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2da0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
2db0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
2dc0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
2dd0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
2de0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2df0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2e00: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
2e10: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2e30: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2e40: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
2e50: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
2e60: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
2e70: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2e80: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2e90: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2ea0: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
2eb0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
2ec0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
2ed0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
2ee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2ef0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
2f00: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2f10: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
2f20: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
2f30: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
2f40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
2f50: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
2f60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2f70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2f80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2f90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2fa0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2fb0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
2fc0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
2fd0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
2fe0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
2ff0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
3000: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
3010: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3020: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3030: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3040: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
3050: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
3060: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
3070: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3080: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
3090: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
30a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
30c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
30d0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
30e0: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
30f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
3100: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3110: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3120: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3130: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3140: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3150: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
3160: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
3170: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
3180: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
3190: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
31a0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
31b0: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
31c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
31e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
31f0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
3200: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
3210: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
3220: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3240: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3250: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3260: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
3270: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
3280: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
3290: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
32a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
32b0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
32c0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
32d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
32e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
32f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3300: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3310: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
3320: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
3330: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
3340: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
3350: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
3360: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
3370: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3380: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
3390: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
33a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
33b0: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
33c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
33d0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
33e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
33f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3420: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
3430: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
3440: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
3450: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  ORD))aSyscall[22
3460: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3470: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
3480: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3490: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
34a0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
34b0: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
34c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
34d0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
34e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
34f0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
3500: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
3510: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3540: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
3550: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
3560: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
3570: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3580: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
3590: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
35a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
35b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
35c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
35d0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
35e0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
35f0: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
3600: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
3610: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
3620: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
3630: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3640: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3650: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
3660: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3690: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
36a0: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
36b0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
36c0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
36d0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
36e0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70  ))aSyscall[24].p
36f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
3700: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
3710: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3720: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
3730: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3740: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
3750: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
3760: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
3770: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
3780: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3790: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
37a0: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
37b0: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
37c0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
37d0: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
37e0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
37f0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
3800: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
3810: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
3820: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3830: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
3840: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
3850: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
3860: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
3870: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
3880: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
3890: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
38a0: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
38b0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
38c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
38d0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
38e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
38f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3900: 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
3910: 20 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50   ((FARPROC(WINAP
3920: 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20  I*)(HMODULE, \. 
3930: 20 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61         LPCSTR))a
3940: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
3950: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
3960: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
3970: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
3980: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3990: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66  ALL)GetSystemInf
39a0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  o,           0 }
39b0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
39c0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
39d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
39e0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
39f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3a00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3a10: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  GetSystemInfo ((
3a20: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
3a30: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
3a40: 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65  scall[27].pCurre
3a50: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73  nt)..  { "GetSys
3a60: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20  temTime",       
3a70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3a80: 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20  SystemTime,     
3a90: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3aa0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
3ab0: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
3ac0: 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  I*)(LPSYSTEMTIME
3ad0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
3ae0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3af0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
3b00: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
3b10: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
3b20: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
3b30: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20  TimeAsFileTime, 
3b40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3b50: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
3b60: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
3b70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3b90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3ba0: 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
3bb0: 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49  AsFileTime ((VOI
3bc0: 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  D(WINAPI*)( \.  
3bd0: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
3be0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70  ))aSyscall[29].p
3bf0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3c00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c10: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3c20: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3c40: 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68  CALL)GetTempPath
3c50: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  A,            0 
3c60: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
3c70: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
3c80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c90: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3ca0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3cb0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3cc0: 73 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28  sGetTempPathA ((
3cd0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
3ce0: 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73  WORD,LPSTR))aSys
3cf0: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
3d00: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3d10: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3d20: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d30: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3d40: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
3d50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3d60: 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c  LL)GetTempPathW,
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3d80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
3d90: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
3da0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3dc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3dd0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3de0: 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57  etTempPathW ((DW
3df0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3e00: 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63  RD,LPWSTR))aSysc
3e10: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
3e20: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3e30: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
3e40: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
3e50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3e60: 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20  GetTickCount,   
3e70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3e80: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
3e90: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
3ea0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3ed0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
3ee0: 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44  ickCount ((DWORD
3ef0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3f00: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
3f10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3f20: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3f30: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3f40: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
3f50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3f60: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41  LL)GetVersionExA
3f70: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3f80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56  .#else.  { "GetV
3f90: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
3fa0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3fc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3fd0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3fe0: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42  etVersionExA ((B
3ff0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
4000: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53          LPOSVERS
4010: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61  IONINFOA))aSysca
4020: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
4030: 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63  ..  { "HeapAlloc
4040: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4050: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c   (SYSCALL)HeapAl
4060: 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  loc,            
4070: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4080: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c   osHeapAlloc ((L
4090: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
40a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
40b0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
40c0: 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72  Syscall[34].pCur
40d0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
40e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
40f0: 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20  "HeapCreate",   
4100: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4110: 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20  ALL)HeapCreate, 
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4130: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
4140: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
4150: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4160: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4170: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4180: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4190: 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e  HeapCreate ((HAN
41a0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  DLE(WINAPI*)(DWO
41b0: 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20  RD,SIZE_T, \.   
41c0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
41d0: 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65  scall[35].pCurre
41e0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
41f0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
4200: 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20  eapDestroy",    
4210: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4220: 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20  L)HeapDestroy,  
4230: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4240: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44  #else.  { "HeapD
4250: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
4260: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4290: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
42a0: 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c  apDestroy ((BOOL
42b0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
42c0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
42d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
42e0: 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20 20  eapFree",       
42f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4300: 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20 20  L)HeapFree,     
4310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4320: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46  .#define osHeapF
4330: 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ree ((BOOL(WINAP
4340: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4350: 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c  ,LPVOID))aSyscal
4360: 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[37].pCurrent).
4370: 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f  .  { "HeapReAllo
4380: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
4390: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41  (SYSCALL)HeapReA
43a0: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
43b0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
43c0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28  osHeapReAlloc ((
43d0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
43e0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
43f0: 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  OID, \.        S
4400: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
4410: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
4420: 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20   { "HeapSize",  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4440: 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c  YSCALL)HeapSize,
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4470: 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f  HeapSize ((SIZE_
4480: 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  T(WINAPI*)(HANDL
4490: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
44a0: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
44b0: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
44c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
44d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
44e0: 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20  apValidate",    
44f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4500: 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20  )HeapValidate,  
4510: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4520: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61  else.  { "HeapVa
4530: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
4540: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4570: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
4580: 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c  pValidate ((BOOL
4590: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
45a0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
45b0: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
45c0: 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74  all[40].pCurrent
45d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
45e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
45f0: 41 4e 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  ANSI).  { "LoadL
4600: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
4610: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
4620: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
4630: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4640: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
4650: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
4660: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4690: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
46a0: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
46b0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
46c0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
46d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
46e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
46f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4700: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4710: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4720: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
4730: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
4740: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
4750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4760: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
4770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
47b0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
47c0: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
47d0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
47e0: 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72  yscall[42].pCurr
47f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4800: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4810: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
4820: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4830: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
4840: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4850: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
4860: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
4870: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4890: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
48a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
48b0: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
48c0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
48d0: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e  L))aSyscall[43].
48e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
48f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4900: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4910: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
4920: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4930: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4940: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4960: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4980: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
49b0: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
49c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
49d0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
49e0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
49f0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
4a00: 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e  call[44].pCurren
4a10: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4a20: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
4a30: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
4a40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a50: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
4a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a70: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
4a80: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
4a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  f..#define osLoc
4ad0: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
4ae0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
4af0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4b00: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4b10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
4b20: 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75  aSyscall[45].pCu
4b30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4b40: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b50: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
4b60: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
4b70: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
4b80: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  le,           0 
4b90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
4ba0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
4bb0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4bd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4be0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4bf0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  sMapViewOfFile (
4c00: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
4c10: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
4c20: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4c30: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
4c40: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
4c50: 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42  nt)..  { "MultiB
4c60: 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20  yteToWideChar", 
4c70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c      (SYSCALL)Mul
4c80: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
4c90: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4ca0: 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  ine osMultiByteT
4cb0: 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28  oWideChar ((int(
4cc0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
4cd0: 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c  ORD,LPCSTR,int,L
4ce0: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
4cf0: 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34   int))aSyscall[4
4d00: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
4d10: 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61  { "QueryPerforma
4d20: 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59  nceCounter", (SY
4d30: 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f  SCALL)QueryPerfo
4d40: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30  rmanceCounter, 0
4d50: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51   },..#define osQ
4d60: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
4d70: 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49  ounter ((BOOL(WI
4d80: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
4d90: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a    LARGE_INTEGER*
4da0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70  ))aSyscall[48].p
4db0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52  Current)..  { "R
4dc0: 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20  eadFile",       
4dd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4de0: 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20  L)ReadFile,     
4df0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4e00: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46  .#define osReadF
4e10: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4e20: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49  I*)(HANDLE,LPVOI
4e30: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
4e40: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
4e50: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
4e60: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
4e70: 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69  .  { "SetEndOfFi
4e80: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
4e90: 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f  (SYSCALL)SetEndO
4ea0: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
4eb0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4ec0: 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28  osSetEndOfFile (
4ed0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4ee0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4ef0: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  50].pCurrent)..#
4f00: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4f10: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
4f20: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
4f30: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
4f40: 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20  ilePointer,     
4f50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4f60: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
4f70: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
4f80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4fb0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
4fc0: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
4fd0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
4fe0: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
4ff0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
5000: 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e  call[51].pCurren
5010: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5020: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c  OS_WINRT.  { "Sl
5030: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
5040: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5050: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
5060: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5070: 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22  else.  { "Sleep"
5080: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5090: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
50c0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65  f..#define osSle
50d0: 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  ep ((VOID(WINAPI
50e0: 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61  *)(DWORD))aSysca
50f0: 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[52].pCurrent)
5100: 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d  ..  { "SystemTim
5110: 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20  eToFileTime",   
5120: 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d   (SYSCALL)System
5130: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20  TimeToFileTime, 
5140: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5150: 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46   osSystemTimeToF
5160: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
5170: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59  INAPI*)(CONST SY
5180: 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  STEMTIME*, \.   
5190: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
51a0: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
51b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
51d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
51e0: 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  T.  { "UnlockFil
51f0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5200: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
5210: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
5220: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5230: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5250: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5270: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5280: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
5290: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
52a0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
52b0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
52c0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
52d0: 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e  call[54].pCurren
52e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
52f0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
5300: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
5310: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5320: 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  )UnlockFileEx,  
5330: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5340: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
5350: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
5360: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5390: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  f..#define osUnl
53a0: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
53b0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
53c0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
53d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
53e0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
53f0: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
5400: 74 29 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  t)..  { "UnmapVi
5410: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
5420: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
5430: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
5440: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5450: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
5460: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
5470: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
5480: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
5490: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
54a0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
54b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
54c0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
54d0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
54e0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
54f0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
5500: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
5510: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
5520: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
5530: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
5540: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OOL))aSyscall[57
5550: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5560: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
5570: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5580: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
55a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
55b0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
55c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
55d0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
55e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
55f0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5600: 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72  yscall[58].pCurr
5610: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5620: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5630: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c  CreateEventExW",
5640: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5650: 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78  LL)CreateEventEx
5660: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
5670: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
5680: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
5690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
56a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
56b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
56c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
56d0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28  reateEventExW ((
56e0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
56f0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
5700: 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c  BUTES,LPCWSTR, \
5710: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
5720: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
5730: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
5740: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5750: 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  RT.  { "WaitForS
5760: 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20  ingleObject",   
5770: 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46    (SYSCALL)WaitF
5780: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20  orSingleObject, 
5790: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
57a0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
57b0: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
57c0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
57f0: 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69  fine osWaitForSi
5800: 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f  ngleObject ((DWO
5810: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
5820: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  LE, \.        DW
5830: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30  ORD))aSyscall[60
5840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5850: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5860: 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  E.  { "WaitForSi
5870: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20  ngleObjectEx",  
5880: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
5890: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c  rSingleObjectEx,
58a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
58b0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
58c0: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
58d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
58f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5900: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
5910: 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57  gleObjectEx ((DW
5920: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5930: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5940: 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63       BOOL))aSysc
5950: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
5960: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5970: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 53 65 74  S_WINCE.  { "Set
5980: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
5990: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
59a0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
59b0: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
59c0: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
59d0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
59e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5a10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
5a20: 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42  ilePointerEx ((B
5a30: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
5a40: 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45  DLE,LARGE_INTEGE
5a50: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41  R, \.        PLA
5a60: 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52  RGE_INTEGER,DWOR
5a70: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e  D))aSyscall[62].
5a80: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5a90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
5aa0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
5ab0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
5ac0: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
5ad0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
5ae0: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
5af0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5b00: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
5b10: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
5b20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5b30: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5b40: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5b50: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
5b60: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
5b70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5b80: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
5b90: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
5ba0: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
5bb0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33  ORD))aSyscall[63
5bc0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5bd0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 45   "MapViewOfFileE
5be0: 78 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  x",         (SYS
5bf0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
5c00: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 30 20  leEx,         0 
5c10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  },..#define osMa
5c20: 70 56 69 65 77 4f 66 46 69 6c 65 45 78 20 28 28  pViewOfFileEx ((
5c30: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
5c40: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
5c50: 52 44 2c 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  RD,DWORD,SIZE_T,
5c60: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49   \.        LPVOI
5c70: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e  D))aSyscall[64].
5c80: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
5c90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5ca0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
5cb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
5cc0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
5cd0: 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e2,             
5ce0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5cf0: 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20  CreateFile2",   
5d00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5d30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5d40: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20 28   osCreateFile2 (
5d50: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
5d60: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44  (LPCWSTR,DWORD,D
5d70: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
5d80: 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46 49        LPCREATEFI
5d90: 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
5da0: 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61 6c  AMETERS))aSyscal
5db0: 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[65].pCurrent).
5dc0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
5dd0: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 61 64 50 61  INRT.  { "LoadPa
5de0: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
5df0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
5e00: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
5e10: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
5e20: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
5e30: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
5e40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5e70: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
5e80: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
5e90: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
5ea0: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
5eb0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
5ec0: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
5ed0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
5ee0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
5ef0: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
5f00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5f10: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
5f20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5f30: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
5f40: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
5f50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5f80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
5f90: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
5fa0: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
5fb0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d  ID))aSyscall[67]
5fc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5fd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5fe0: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
5ff0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
6000: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
6010: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
6020: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6030: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
6040: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
6050: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6070: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6080: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
6090: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
60a0: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
60b0: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
60c0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
60d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
60e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
60f0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
6100: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
6110: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
6120: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
6130: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
6140: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
6150: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
6160: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
6170: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6180: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6190: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
61a0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
61b0: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
61c0: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
61d0: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
61e0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
61f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6200: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
6210: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
6220: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
6230: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
6240: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
6250: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
6260: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
6270: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
62a0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
62b0: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
62c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
62d0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
62e0: 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  70].pCurrent)..}
62f0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
6300: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
6310: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
6320: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
6330: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
6340: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
6350: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
6360: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
6370: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
6380: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
6390: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
63a0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
63b0: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
63c0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
63d0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
63e0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
63f0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6400: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
6410: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
6420: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
6430: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
6440: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
6450: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
6460: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
6470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6490: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
64a0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
64b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
64c0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
64d0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
64e0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
64f0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
6500: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
6510: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6520: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
6530: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
6540: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
6550: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
6560: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
6570: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
6580: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
6590: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
65a0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
65b0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
65c0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
65d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
65e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
65f0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
6600: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
6610: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
6620: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
6630: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
6640: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
6650: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
6660: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
6670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6680: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6690: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
66a0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
66b0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
66c0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
66d0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
66e0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
66f0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
6700: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
6710: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
6720: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
6730: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
6740: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6750: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
6760: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
6770: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
6780: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6790: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
67a0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
67b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
67c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
67d0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
67e0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
67f0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
6800: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
6810: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6820: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
6830: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6850: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6870: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
6880: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
6890: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
68a0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
68b0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
68c0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
68d0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
68e0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
68f0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
6900: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
6910: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
6920: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
6930: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
6940: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
6950: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
6960: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
6970: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6980: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6990: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
69a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
69b0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
69c0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
69d0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
69e0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
69f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
6a00: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
6a10: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6a20: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
6a30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6a40: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6a50: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6a60: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
6a70: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
6a80: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
6a90: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
6aa0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
6ab0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
6ac0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
6ad0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
6ae0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
6af0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
6b00: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
6b10: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
6b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6b30: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
6b40: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
6b50: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
6b60: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
6b70: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
6b80: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
6b90: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
6ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
6bb0: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
6bc0: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
6bd0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
6be0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
6bf0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
6c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
6c10: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
6c20: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
6c30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
6c40: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
6c50: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
6c60: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
6c70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6c90: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
6ca0: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
6cb0: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
6cc0: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
6cd0: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
6ce0: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
6cf0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
6d00: 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a 42 75  _debug(char *zBu
6d10: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
6d20: 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c  char zDbgBuf[SQL
6d30: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
6d40: 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e  F_SIZE];.  int n
6d50: 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 53  Min = MIN(nBuf,S
6d60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
6d70: 42 55 46 5f 53 49 5a 45 2d 31 29 3b 20 2f 2a 20  BUF_SIZE-1); /* 
6d80: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
6d90: 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d   */.  if( nMin<-
6da0: 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f  1 ) nMin = -1; /
6db0: 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76  * all negative v
6dc0: 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e  alues become -1.
6dd0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   */.  assert( nM
6de0: 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d  in==-1 || nMin==
6df0: 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45  0 || nMin<SQLITE
6e00: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
6e10: 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e  IZE );.#if defin
6e20: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6e30: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
6e40: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
6e50: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
6e60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
6e70: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
6e80: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
6e90: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
6ea0: 20 20 4f 75 74 70 75 74 44 65 62 75 67 53 74 72    OutputDebugStr
6eb0: 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20  ingA(zDbgBuf);. 
6ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 75 74 70   }else{.    Outp
6ed0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a  utDebugStringA(z
6ee0: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20  Buf);.  }.#elif 
6ef0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6f00: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
6f10: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
6f20: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
6f30: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
6f40: 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79    if ( osMultiBy
6f50: 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20  teToWideChar(.  
6f60: 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c          osAreFil
6f70: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
6f80: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c  _ACP : CP_OEMCP,
6f90: 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20   0, zBuf,.      
6fa0: 20 20 20 20 6e 4d 69 6e 2c 20 7a 44 62 67 42 75      nMin, zDbgBu
6fb0: 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  f, SQLITE_WIN32_
6fc0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a  DBG_BUF_SIZE/siz
6fd0: 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29  eof(WCHAR))<=0 )
6fe0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
6ff0: 7d 0a 20 20 4f 75 74 70 75 74 44 65 62 75 67 53  }.  OutputDebugS
7000: 74 72 69 6e 67 57 28 7a 44 62 67 42 75 66 29 3b  tringW(zDbgBuf);
7010: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69  .#else.  if( nMi
7020: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
7030: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
7040: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
7050: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
7060: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
7070: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66  uf, nMin);.    f
7080: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
7090: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20  %s", zDbgBuf);. 
70a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
70b0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
70c0: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
70d0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
70e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
70f0: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20  ne suspends the 
7100: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66  current thread f
7110: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a  or at least ms.*
7120: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20  * milliseconds. 
7130: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
7140: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ent to the Win32
7150: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61   Sleep() interfa
7160: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ce..*/.#if SQLIT
7170: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69  E_OS_WINRT.stati
7180: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62  c HANDLE sleepOb
7190: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  j = NULL;.#endif
71a0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
71b0: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44  in32_sleep(DWORD
71c0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a   milliseconds){.
71d0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
71e0: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70  NRT.  if ( sleep
71f0: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj==NULL ){.   
7200: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
7210: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c  eateEventExW(NUL
7220: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f  L, NULL, CREATE_
7230: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53  EVENT_MANUAL_RES
7240: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ET,.            
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29      SYNCHRONIZE)
7270: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7280: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
7290: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ;.  osWaitForSin
72a0: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65  gleObjectEx(slee
72b0: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e  pObj, millisecon
72c0: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73  ds, FALSE);.#els
72d0: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c  e.  osSleep(mill
72e0: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69  iseconds);.#endi
72f0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
7300: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
7310: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
7320: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
7330: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
7340: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
7350: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
7360: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
7370: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
7380: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
7390: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
73a0: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
73b0: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
73c0: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
73d0: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
73e0: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
73f0: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
7400: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
7410: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
7420: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
7430: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e  when running Win
7440: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
7450: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
7460: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
7470: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
7480: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
7490: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
74a0: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
74b0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
74c0: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
74d0: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
74e0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
74f0: 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51  ) API..*/.#if SQ
7500: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
7510: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7520: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
7530: 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74    (1).#else.  st
7540: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
7550: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
7560: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
7570: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
7580: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
7590: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
75a0: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
75b0: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
75c0: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
75d0: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
75e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
75f0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
7600: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
7610: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
7620: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
7630: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
7640: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
7650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7660: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
7670: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
7680: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
7690: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
76a0: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
76b0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
76c0: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
76d0: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
76e0: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
76f0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
7700: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
7710: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
7720: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
7730: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
7740: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
7750: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
7760: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
7770: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
7780: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
7790: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
77a0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
77b0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
77c0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
77d0: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
77e0: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f  es>=0 );.  p = o
77f0: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
7800: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
7810: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
7820: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  _T)nBytes);.  if
7830: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
7840: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
7850: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
7860: 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79   HeapAlloc %u by
7870: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
7880: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
7890: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
78a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
78b0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
78c0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
78d0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
78e0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
78f0: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
7900: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
7910: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
7920: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
7930: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
7940: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
7950: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
7960: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
7970: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
7980: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
7990: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
79a0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
79b0: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
79c0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
79d0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
79e0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
79f0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
7a00: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
7a10: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
7a20: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
7a30: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
7a40: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
7a50: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
7a60: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
7a70: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
7a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
7a90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
7aa0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
7ab0: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
7ac0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
7ad0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
7ae0: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
7af0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
7b00: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7b10: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
7b20: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
7b30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
7b40: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
7b50: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
7b60: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
7b70: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
7b80: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
7b90: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
7ba0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
7bb0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
7bc0: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
7bd0: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
7be0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
7bf0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
7c00: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
7c10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
7c20: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
7c30: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
7c40: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
7c50: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
7c60: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
7c70: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
7c80: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
7c90: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
7ca0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
7cb0: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
7cc0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7cd0: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
7ce0: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
7cf0: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
7d00: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
7d10: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7d20: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
7d30: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
7d40: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
7d50: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
7d60: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
7d70: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
7d80: 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  s (%d), heap=%p"
7d90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7da0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
7db0: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
7dc0: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
7dd0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
7de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7df0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
7e00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7e20: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
7e30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
7e40: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
7e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7e60: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
7e70: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
7e80: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
7e90: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
7ea0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
7eb0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
7ec0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
7ed0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
7ee0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
7ef0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
7f00: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
7f10: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
7f20: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 20  LIDATE.  assert 
7f30: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
7f40: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
7f50: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
7f60: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
7f70: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
7f80: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
7f90: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
7fa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
7fb0: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
7fc0: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
7fd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
7fe0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
7ff0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
8000: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64  ize block %p (%d
8010: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
8030: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8040: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
8050: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8060: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
8070: 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  )n;.}../*.** Rou
8080: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
8090: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
80a0: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
80b0: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
80c0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
80d0: 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65  dup(int n){.  re
80e0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
80f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
8100: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
8110: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
8120: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
8130: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
8140: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
8150: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
8160: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
8170: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
8180: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
8190: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
81a0: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d  MemData->magic==
81b0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a  WINMEM_MAGIC );.
81c0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
81d0: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
81e0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
81f0: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61  eap = osHeapCrea
8200: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  te(SQLITE_WIN32_
8210: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
8250: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20  EAP_INIT_SIZE,. 
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
8290: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
82a0: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
82b0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
82c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
82d0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
82e0: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
82f0: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
8300: 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c   (%d), flags=%u,
8310: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
8320: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
8330: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
8340: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
8350: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
8360: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
8370: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
8380: 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
8390: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
83a0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
83b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
83c0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
83d0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
83e0: 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  RUE;.  }.  asser
83f0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
8400: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8410: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
8420: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
8430: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8440: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8450: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
8460: 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28 20  IDATE.  assert( 
8470: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
8480: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
8490: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
84a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
84b0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
84c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
84d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
84e0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
84f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
8500: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
8510: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
8520: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
8530: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
8540: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
8550: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
8560: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
8570: 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65  rn;.  if( pWinMe
8580: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
8590: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
85a0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
85b0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
85c0: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
85d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
85e0: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20 20  OC_VALIDATE.    
85f0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
8600: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
8610: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
8620: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8630: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
8640: 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e  dif.    if( pWin
8650: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
8660: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
8670: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
8680: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
8690: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
86a0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
86b0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
86c0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29  HeapDestroy (%d)
86d0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8700: 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d  , (void*)pWinMem
8710: 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20  Data->hHeap);.  
8720: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
8730: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
8740: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
8750: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
8760: 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hHeap = NULL;.  
8770: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  }.}../*.** Popul
8780: 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  ate the low-leve
8790: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
87a0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ion function poi
87b0: 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69  nters in.** sqli
87c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
87d0: 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  m with pointers 
87e0: 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  to the routines 
87f0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68  in this file. Th
8800: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73  e.** arguments s
8810: 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b  pecify the block
8820: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61   of memory to ma
8830: 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nage..**.** This
8840: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
8850: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
8860: 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64  e3_config(), and
8870: 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73   therefore.** is
8880: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
8890: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28   be threadsafe (
88a0: 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63  it is not)..*/.c
88b0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
88c0: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
88d0: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
88e0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
88f0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
8900: 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74  ethods winMemMet
8910: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e  hods = {.    win
8920: 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  MemMalloc,.    w
8930: 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77  inMemFree,.    w
8940: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  inMemRealloc,.  
8950: 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20    winMemSize,.  
8960: 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c    winMemRoundup,
8970: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c  .    winMemInit,
8980: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
8990: 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65  own,.    &win_me
89a0: 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65  m_data.  };.  re
89b0: 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68  turn &winMemMeth
89c0: 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  ods;.}..void sql
89d0: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
89e0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  t(void){.  sqlit
89f0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
8a00: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
8a10: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
8a20: 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  32());.}.#endif 
8a30: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
8a40: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
8a50: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
8a60: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
8a70: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54  soft Unicode (UT
8a80: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
8a90: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
8aa0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
8ab0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
8ac0: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
8ad0: 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38 54  tic LPWSTR utf8T
8ae0: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
8af0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
8b00: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
8b10: 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  LPWSTR zWideFile
8b20: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
8b30: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
8b40: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
8b50: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
8b60: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
8b70: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
8b80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8b90: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
8ba0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8bb0: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
8bc0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
8bd0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
8be0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
8bf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8c00: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
8c10: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
8c20: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
8c30: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
8c40: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
8c70: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
8c80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8c90: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
8ca0: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
8cb0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
8cc0: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
8cd0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
8ce0: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
8cf0: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
8d00: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
8d10: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
8d20: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
8d30: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
8d40: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
8d50: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
8d60: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
8d70: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
8d80: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
8d90: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
8da0: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
8db0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
8dc0: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
8dd0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
8de0: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
8df0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
8e00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8e10: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
8e20: 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
8e30: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
8e40: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
8e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8e60: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
8e70: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
8e80: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
8e90: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
8ea0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
8eb0: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
8ee0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
8ef0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
8f00: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
8f10: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
8f20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8f30: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
8f40: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
8f50: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
8f60: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
8f70: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
8f80: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
8f90: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
8fa0: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
8fb0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
8fc0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
8fd0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
8fe0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
8ff0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
9000: 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69  LPWSTR mbcsToUni
9010: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
9020: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
9030: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
9040: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
9050: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
9060: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
9070: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
9080: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
9090: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
90a0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
90b0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
90c0: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
90f0: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
9100: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
9110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9120: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
9130: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
9140: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
9150: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
9160: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
9170: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
9180: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9190: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
91a0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
91b0: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
91c0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
91d0: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
9210: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
9220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
9230: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
9240: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
9250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9260: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
9270: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
9280: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
9290: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
92a0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
92b0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
92c0: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
92d0: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
92e0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
92f0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
9300: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
9310: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
9320: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
9330: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62  har *unicodeToMb
9340: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
9350: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
9360: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
9370: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
9380: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
9390: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
93a0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
93b0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
93c0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
93d0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
93e0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
93f0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
9400: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
9410: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
9420: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
9430: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
9440: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
9450: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
9460: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9470: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
9480: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
9490: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
94a0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
94b0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
94c0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
94f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
9500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9510: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
9520: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
9530: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
9540: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
9550: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
9560: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
9570: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
9580: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
9590: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
95a0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
95b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
95c0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
95d0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
95e0: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
95f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
9600: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
9610: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
9620: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
9630: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
9640: 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  mbcsToUnicode(zF
9650: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
9660: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
9670: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9680: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
9690: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
96a0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
96b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
96c0: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
96d0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a  FilenameUtf8;.}.
96e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55  ./*.** Convert U
96f0: 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74  TF-8 to multibyt
9700: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
9710: 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ng.  Space to ho
9720: 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  ld the .** retur
9730: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
9740: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
9750: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
9760: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
9770: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
9780: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  s(const char *zF
9790: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
97a0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b   *zFilenameMbcs;
97b0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
97c0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
97d0: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
97e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
97f0: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
9800: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9810: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62   }.  zFilenameMb
9820: 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62  cs = unicodeToMb
9830: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
9840: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
9850: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
9860: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
9870: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  }.../*.** The re
9880: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
9890: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
98a0: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
98b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
98c0: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
98d0: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
98e0: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
98f0: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
9900: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
9910: 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
9920: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
9930: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
9940: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
9950: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
9960: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
9970: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
9980: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
9990: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
99a0: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
99b0: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
99c0: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
99d0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
99e0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
99f0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
9a00: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
9a10: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
9a20: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
9a30: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
9a40: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
9a50: 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  Wide[MAX_PATH+1]
9a60: 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d 65 77  ; /* NOTE: Somew
9a70: 68 61 74 20 61 72 62 69 74 72 61 72 79 2e 20 2a  hat arbitrary. *
9a80: 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  /.    dwLen = os
9a90: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
9aa0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
9ab0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
9ae0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
9af0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
9b40: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41 54 48          MAX_PATH
9bb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
9bd0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
9be0: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
9bf0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
9c00: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
9c10: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
9c20: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
9c30: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
9c60: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
9c90: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
9ca0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
9cf0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
9d40: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
9d90: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
9da0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
9db0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
9dc0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
9dd0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
9de0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
9df0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
9e00: 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
9e10: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
9e20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
9e30: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
9e40: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9e50: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
9e60: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
9e70: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
9e80: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
9e90: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
9ea0: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
9eb0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
9ec0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
9ed0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
9ee0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9ef0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
9f00: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
9f10: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
9f20: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
9f30: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
9f60: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
9f70: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
9fa0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
9fb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
9fd0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
a040: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
a090: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
a0a0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
a0b0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
a0c0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
a0d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
a0e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
a0f0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
a100: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
a110: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
a120: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
a130: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
a140: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
a150: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
a160: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
a170: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
a180: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
a190: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
a1a0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
a1b0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
a1c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
a1d0: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
a1e0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 20  , "OsError 0x%x 
a1f0: 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  (%u)", lastErrno
a200: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
a210: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
a220: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
a230: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
a240: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
a250: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a260: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
a270: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
a280: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
a290: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
a2a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
a2b0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
a2c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
a2d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
a2e0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
a2f0: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
a300: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
a310: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
a320: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
a330: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a340: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
a350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
a360: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
a370: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
a380: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
a390: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
a3a0: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
a3b0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
a3c0: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
a3d0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
a3e0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
a3f0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a  ivalent from .**
a400: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a   FormatMessage..
a410: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
a420: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
a430: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
a440: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
a450: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
a460: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
a470: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
a480: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a490: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
a4a0: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
a4b0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
a4c0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
a4d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
a4e0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
a4f0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
a500: 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74  the the associat
a510: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
a520: 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ath, if any..*/.
a530: 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72  #define winLogEr
a540: 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77  ror(a,b,c,d)   w
a550: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
a560: 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f  (a,b,c,d,__LINE_
a570: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  _).static int wi
a580: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
a590: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
a5c0: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f  or code */.  DWO
a5d0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20  RD lastErrno,   
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5f0: 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72  Win32 last error
a600: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
a610: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
a620: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
a630: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
a640: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
a650: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a670: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
a680: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
a690: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
a6c0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
a6d0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
a6e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d   */.){.  char zM
a6f0: 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20  sg[500];        
a700: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61           /* Huma
a710: 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n readable error
a720: 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69   text */.  int i
a730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a750: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
a760: 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20   zMsg[0] = 0;.  
a770: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
a780: 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
a790: 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
a7a0: 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
a7b0: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
a7c0: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
a7d0: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
a7e0: 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
a7f0: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
a800: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
a810: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
a820: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
a830: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
a840: 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
a850: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
a860: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
a870: 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a  ne, lastErrno, z
a880: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73  Func, zPath, zMs
a890: 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  g.  );..  return
a8a0: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
a8b0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
a8c0: 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52 65   times that a Re
a8d0: 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46  adFile(), WriteF
a8e0: 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74  ile(), and Delet
a8f0: 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20  eFile().** will 
a900: 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f  be retried follo
a910: 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65  wing a locking e
a920: 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20  rror - probably 
a930: 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  caused by .** an
a940: 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
a950: 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
a960: 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
a970: 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
a980: 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
a990: 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
a9a0: 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
a9b0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
a9c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
a9d0: 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
a9e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
a9f0: 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
aa00: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
aa10: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
aa20: 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
aa30: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
aa40: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
aa50: 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
aa60: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
aa70: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
aa80: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
aa90: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
aaa0: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
aab0: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
aac0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
aad0: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  LAY;../*.** If a
aae0: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
aaf0: 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
ab00: 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
ab10: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ab20: 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
ab30: 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
ab40: 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
ab50: 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
ab60: 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
ab70: 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
ab80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ab90: 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a  retryIoerr(int *
aba0: 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a  pnRetry, DWORD *
abb0: 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44  pError){.  DWORD
abc0: 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72   e = osGetLastEr
abd0: 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e  ror();.  if( *pn
abe0: 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72  Retry>=win32Ioer
abf0: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
ac00: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
ac10: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
ac20: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
ac30: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d  0;.  }.  if( e==
ac40: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
ac50: 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  IED ||.      e==
ac60: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
ac70: 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d  TION ||.      e=
ac80: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
ac90: 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20  IOLATION ){.    
aca0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
acb0: 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65  eep(win32IoerrRe
acc0: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
acd0: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
ace0: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
acf0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
ad00: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70  pError ){.    *p
ad10: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20  Error = e;.  }. 
ad20: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ad30: 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72  .** Log a I/O er
ad40: 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64  ror retry episod
ad50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
ad60: 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  d logIoerr(int n
ad70: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
ad80: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
ad90: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
ada0: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
adb0: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
adc0: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
add0: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
ade0: 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
adf0: 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
ae00: 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d  +1)/2.    );.  }
ae10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  .}../*.** Lock a
ae20: 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f   file region..*/
ae30: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
ae40: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44  LockFile(.  HAND
ae50: 4c 45 20 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  LE hFile,.  DWOR
ae60: 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44  D flags,.  DWORD
ae70: 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
ae80: 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
ae90: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
aea0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
aeb0: 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 20 20 69  BytesHigh.){.  i
aec0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
aed0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
aee0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
aef0: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
af00: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
af10: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
af20: 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
af30: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
af40: 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
af50: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
af60: 45 78 28 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c  Ex(hFile, flags,
af70: 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
af80: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
af90: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
afa0: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
afb0: 6b 46 69 6c 65 28 68 46 69 6c 65 2c 20 6f 66 66  kFile(hFile, off
afc0: 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
afd0: 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
afe0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
aff0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c    }.}../*.** Unl
b000: 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
b010: 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
b020: 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
b030: 28 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c 65  (.  HANDLE hFile
b040: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
b050: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
b060: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
b070: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
b080: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
b090: 67 68 0a 29 7b 0a 20 20 69 66 28 20 69 73 4e 54  gh.){.  if( isNT
b0a0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
b0b0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
b0c0: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
b0d0: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
b0e0: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
b0f0: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
b100: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
b110: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
b120: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
b130: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 68 46  sUnlockFileEx(hF
b140: 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ile, 0, numBytes
b150: 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
b160: 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
b170: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
b180: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 68 46 69 6c  sUnlockFile(hFil
b190: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
b1a0: 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
b1b0: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
b1c0: 69 67 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  igh);.  }.}..#if
b1d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
b1e0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
b1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
b230: 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
b240: 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
b250: 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a  nCE only..*/./*.
b260: 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f  ** Windows CE do
b270: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
b280: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
b290: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
b2a0: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
b2b0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
b2c0: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
b2d0: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
b2e0: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
b2f0: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
b300: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
b310: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
b320: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
b330: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
b340: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
b350: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
b360: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
b370: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
b380: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
b390: 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
b3a0: 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
b3b0: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
b3c0: 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
b3d0: 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  2);.  osFileTime
b3e0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28  ToLocalFileTime(
b3f0: 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73  &uTm,&lTm);.  os
b400: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
b410: 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
b420: 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
b430: 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
b440: 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
b450: 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
b460: 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
b470: 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
b480: 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
b490: 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
b4a0: 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
b4b0: 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
b4c0: 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
b4d0: 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
b4e0: 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
b4f0: 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
b500: 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
b510: 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
b520: 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
b530: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
b540: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
b550: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
b560: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
b570: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
b580: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
b590: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
b5a0: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
b5b0: 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
b5c0: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
b5d0: 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
b5e0: 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
b5f0: 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
b600: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
b610: 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
b620: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
b630: 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
b640: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
b650: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
b660: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
b670: 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
b680: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
b690: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
b6a0: 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
b6b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
b6c0: 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
b6d0: 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
b6e0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
b6f0: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
b700: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
b710: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
b720: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
b730: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
b740: 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
b750: 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20   TRUE;..  zName 
b760: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
b770: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
b780: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
b790: 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f    /* out of memo
b7a0: 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ry */.    return
b7b0: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f   FALSE;.  }..  /
b7c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
b7d0: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
b7e0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69  */.  memset(&pFi
b7f0: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69  le->local, 0, si
b800: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
b810: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
b820: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
b830: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
b840: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
b850: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
b860: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
b870: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f  e. */.  zTok = o
b880: 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d  sCharLowerW(zNam
b890: 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
b8a0: 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
b8b0: 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
b8c0: 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
b8d0: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
b8e0: 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
b8f0: 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
b900: 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61  >hMutex = osCrea
b910: 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
b920: 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
b930: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
b940: 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex){.    pFile->
b950: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
b960: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
b970: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
b980: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c  LITE_ERROR, pFil
b990: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
b9a0: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
b9b0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
b9c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
b9d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
b9e0: 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  n FALSE;.  }..  
b9f0: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
ba00: 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74  utex before cont
ba10: 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63  inuing */.  winc
ba20: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
ba30: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
ba40: 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
ba50: 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
ba60: 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
ba70: 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
ba80: 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20  s etc are .  ** 
ba90: 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20  case-sensitive, 
baa0: 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
bab0: 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63  f that by upperc
bac0: 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20  asing the mutex 
bad0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73  name.  ** and us
bae0: 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20  ing that as the 
baf0: 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69  shared filemappi
bb00: 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ng name..  */.  
bb10: 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61  osCharUpperW(zNa
bb20: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
bb30: 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65  hared = osCreate
bb40: 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56  FileMappingW(INV
bb50: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bb60: 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  E, NULL,.       
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
bba0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
bbb0: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bbe0: 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53  Name);  ..  /* S
bbf0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
bc00: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
bc10: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
bc20: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
bc30: 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62   it .  ** must b
bc40: 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
bc50: 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65  ed */.  if (osGe
bc60: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20  tLastError() == 
bc70: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
bc80: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
bc90: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
bca0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
bcb0: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
bcc0: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
bcd0: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
bce0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
bcf0: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20  map it. */.  if 
bd00: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
bd10: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  {.    pFile->sha
bd20: 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b  red = (winceLock
bd30: 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  *)osMapViewOfFil
bd40: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
bd50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
bd60: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
bd70: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
bd80: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
bd90: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
bda0: 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
bdb0: 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
bdc0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
bdd0: 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
bde0: 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d  .    if (!pFile-
bdf0: 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20  >shared){.      
be00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
be10: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
be20: 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  r();.      winLo
be30: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
be40: 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ROR, pFile->last
be50: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
be60: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
be70: 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e  teLock2", zFilen
be80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c  ame);.      osCl
be90: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
bea0: 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
beb0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
bec0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
bed0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
bee0: 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
bef0: 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
bf00: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
bf10: 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
bf20: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68    if (pFile->hSh
bf30: 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20  ared == NULL){. 
bf40: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
bf50: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
bf60: 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
bf70: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
bf80: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
bf90: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
bfa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
bfb0: 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  E;.  }.  .  /* I
bfc0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
bfd0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
bfe0: 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
bff0: 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29   */.  if (bInit)
c000: 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46   {.    memset(pF
c010: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
c020: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
c030: 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
c040: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
c050: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
c060: 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f  eturn TRUE;.}../
c070: 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
c080: 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
c090: 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
c0a0: 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
c0b0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
c0c0: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
c0d0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
c0e0: 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
c0f0: 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
c100: 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
c110: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
c120: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
c130: 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
c140: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
c150: 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
c160: 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
c170: 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
c180: 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
c190: 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
c1a0: 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
c1b0: 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
c1c0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
c1d0: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
c1e0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
c1f0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
c200: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
c210: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
c220: 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
c230: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
c240: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
c250: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
c260: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
c270: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
c280: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
c290: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
c2a0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
c2b0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
c2c0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
c2d0: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
c2e0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
c2f0: 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
c300: 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
c310: 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
c320: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
c330: 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
c340: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
c350: 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
c360: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
c370: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
c380: 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
c390: 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
c3a0: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
c3b0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
c3c0: 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43  ex);    .    osC
c3d0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
c3e0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70  ->hMutex);.    p
c3f0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e  File->hMutex = N
c400: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  ULL;.  }.}../* .
c410: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
c420: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
c430: 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
c440: 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
c450: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
c460: 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e  eLockFile(.  HAN
c470: 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44  DLE *phFile,.  D
c480: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
c490: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
c4a0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
c4b0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
c4c0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
c4d0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
c4e0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
c4f0: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
c500: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
c510: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
c520: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
c530: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
c540: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
c550: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
c560: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
c570: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
c580: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
c590: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
c5a0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
c5b0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
c5c0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
c5d0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
c5e0: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
c5f0: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
c600: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
c610: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
c620: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
c630: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
c640: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
c650: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
c660: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
c670: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
c680: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
c690: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
c6a0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
c6b0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
c6c0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
c6d0: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
c6e0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
c6f0: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
c700: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
c710: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
c720: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
c730: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
c740: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
c750: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
c760: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
c770: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
c780: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
c790: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
c7a0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
c7b0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
c7c0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
c7d0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
c7e0: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
c7f0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
c800: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
c810: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
c820: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
c830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
c840: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
c850: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
c860: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
c870: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
c880: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
c890: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
c8a0: 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  NG_BYTE && nNumb
c8b0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
c8c0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
c8d0: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
c8e0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
c8f0: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
c900: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
c910: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
c920: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
c930: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
c940: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
c950: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
c960: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
c970: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
c980: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
c990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
c9a0: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
c9b0: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
c9c0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
c9d0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
c9e0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
c9f0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
ca00: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
ca10: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
ca20: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
ca30: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
ca40: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
ca50: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
ca60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
ca70: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
ca80: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
ca90: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
caa0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
cab0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
cac0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
cad0: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
cae0: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
caf0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
cb00: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
cb10: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
cb20: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
cb30: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  nceUnlockFile(. 
cb40: 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c   HANDLE *phFile,
cb50: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
cb60: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
cb70: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
cb80: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
cb90: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
cba0: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
cbb0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
cbc0: 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
cbd0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
cbe0: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
cbf0: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
cc00: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
cc10: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
cc20: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
cc30: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
cc40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
cc50: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
cc60: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
cc70: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
cc80: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
cc90: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
cca0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
ccb0: 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
ccc0: 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
ccd0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
cce0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
ccf0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
cd00: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
cd10: 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
cd20: 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
cd30: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
cd40: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
cd50: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
cd60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
cd70: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
cd80: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
cd90: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
cda0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
cdb0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
cdc0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
cdd0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
cde0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
cdf0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
ce00: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
ce10: 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
ce20: 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
ce30: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
ce40: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
ce50: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
ce60: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
ce70: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ce80: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
ce90: 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75  ARED_SIZE || nNu
cea0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
ceb0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
cec0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
ced0: 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
cee0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
cef0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
cf00: 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
cf10: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
cf20: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
cf30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
cf40: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
cf50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
cf60: 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
cf70: 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
cf80: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
cf90: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
cfa0: 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e  ENDING_BYTE && n
cfb0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
cfc0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
cfd0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
cfe0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
cff0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
d000: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
d010: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
d020: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
d030: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = 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 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
d060: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
d070: 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
d080: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
d090: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
d0a0: 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
d0b0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
d0c0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
d0d0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
d0e0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
d0f0: 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
d100: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
d110: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
d120: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
d130: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
d140: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
d150: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
d160: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
d170: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
d180: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
d190: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
d1a0: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
d1b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
d1c0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f  ckFileEx() API o
d1d0: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
d1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
d1f0: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
d200: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
d210: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  e,.  DWORD dwFla
d220: 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 65  gs,.  DWORD dwRe
d230: 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 20  served,.  DWORD 
d240: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
d250: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
d260: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
d270: 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f  oLockHigh,.  LPO
d280: 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 72  VERLAPPED lpOver
d290: 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53  lapped.){.  UNUS
d2a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 52  ED_PARAMETER(dwR
d2b0: 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e 55 53  eserved);.  UNUS
d2c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
d2d0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
d2e0: 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66  kHigh);..  /* If
d2f0: 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e 74   the caller want
d300: 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64 20  s a shared read 
d310: 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74 68  lock, forward th
d320: 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20  is call.  ** to 
d330: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f  winceLockFile */
d340: 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61 70  .  if (lpOverlap
d350: 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28  ped->Offset == (
d360: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
d370: 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46 6c  ST &&.      dwFl
d380: 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20 20  ags == 1 &&.    
d390: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
d3a0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
d3b0: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
d3c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  {.    return win
d3d0: 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  ceLockFile(phFil
d3e0: 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
d3f0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
d400: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
d410: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
d420: 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
d430: 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
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 2a 2a  ****************
d460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d480: 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
d490: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
d4a0: 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  E */../*********
d4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4f0: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  ****.** The next
d500: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
d510: 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  es implement the
d520: 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65   I/O methods spe
d530: 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  cified.** by the
d540: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
d550: 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a  ods object..****
d560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
d5b0: 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66  ** Some Microsof
d5c0: 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b  t compilers lack
d5d0: 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e   this definition
d5e0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56  ..*/.#ifndef INV
d5f0: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
d600: 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49  INTER.# define I
d610: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
d620: 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29  POINTER ((DWORD)
d630: 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  -1).#endif../*.*
d640: 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65  * Move the curre
d650: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
d660: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  he file handle p
d670: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
d680: 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  st .** argument 
d690: 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65  to offset iOffse
d6a0: 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c  t within the fil
d6b0: 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
d6c0: 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20  , return 0. .** 
d6d0: 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70  Otherwise, set p
d6e0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d6f0: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
d700: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
d710: 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 77  nt seekWinFile(w
d720: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  inFile *pFile, s
d730: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
d740: 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49  fset){.#if !SQLI
d750: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f  TE_OS_WINRT.  LO
d760: 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20 20  NG upperBits;   
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d780: 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69   Most sig. 32 bi
d790: 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
d7a0: 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72   */.  LONG lower
d7b0: 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
d7c0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73        /* Least s
d7d0: 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
d7e0: 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44  ew offset */.  D
d7f0: 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20 20  WORD dwRet;     
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d810: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
d820: 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
d830: 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20  er() */.  DWORD 
d840: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
d850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
d860: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
d870: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
d880: 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20  ..  upperBits = 
d890: 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e  (LONG)((iOffset>
d8a0: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
d8b0: 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20  f);.  lowerBits 
d8c0: 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74  = (LONG)(iOffset
d8d0: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
d8e0: 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79  .  /* API oddity
d8f0: 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  : If successful,
d900: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
d910: 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72  ) returns a dwor
d920: 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  d .  ** containi
d930: 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d  ng the lower 32-
d940: 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20  bits of the new 
d950: 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c  file-offset. Or,
d960: 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20   if it fails,.  
d970: 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e  ** it returns IN
d980: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
d990: 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20  OINTER. However 
d9a0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44  according to MSD
d9b0: 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44  N, .  ** INVALID
d9c0: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
d9d0: 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20  R may also be a 
d9e0: 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74  valid new offset
d9f0: 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e  . So to determin
da00: 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
da10: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74  an error has act
da20: 75 61 6c 6c 79 20 6f 63 63 75 72 65 64 2c 20 69  ually occured, i
da30: 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
da40: 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a  ary to call .  *
da50: 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
da60: 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d  ..  */.  dwRet =
da70: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
da80: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
da90: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
daa0: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
dab0: 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
dac0: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
dad0: 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26  POINTER.      &&
dae0: 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
daf0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
db00: 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a  !=NO_ERROR)) ){.
db10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
db20: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
db30: 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
db40: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
db50: 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EEK, pFile->last
db60: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
db70: 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65      "seekWinFile
db80: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
db90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
dba0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
dbb0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
dbc0: 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20   Same as above, 
dbd0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73  except that this
dbe0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
dbf0: 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e  works for WinRT.
dc00: 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49  .  */..  LARGE_I
dc10: 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20  NTEGER x;       
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dc30: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
dc40: 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20  BOOL bRet;      
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
dc70: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
dc80: 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e  terEx() */..  x.
dc90: 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73  QuadPart = iOffs
dca0: 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53  et;.  bRet = osS
dcb0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
dcc0: 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20  pFile->h, x, 0, 
dcd0: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
dce0: 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70  if(!bRet){.    p
dcf0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
dd00: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
dd10: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
dd20: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
dd30: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
dd40: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
dd50: 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69        "seekWinFi
dd60: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
dd70: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  h);.    return 1
dd80: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
dd90: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
dda0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
ddb0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
ddc0: 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
ddd0: 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
dde0: 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
ddf0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
de00: 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
de10: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
de20: 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
de30: 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
de40: 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
de50: 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
de60: 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
de70: 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
de80: 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
de90: 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
dea0: 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
deb0: 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
dec0: 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
ded0: 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
dee0: 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
def0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
df00: 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
df10: 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
df20: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
df30: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
df40: 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
df50: 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
df60: 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
df70: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
df80: 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
df90: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
dfa0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
dfb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
dfc0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dfd0: 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  File->pShm==0 );
dfe0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
dff0: 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  SE %d\n", pFile-
e000: 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  >h));.  do{.    
e010: 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  rc = osCloseHand
e020: 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  le(pFile->h);.  
e030: 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45    /* SimulateIOE
e040: 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d  rror( rc=0; cnt=
e050: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
e060: 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65  ; ); */.  }while
e070: 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74  ( rc==0 && ++cnt
e080: 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45   < MX_CLOSE_ATTE
e090: 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f  MPT && (sqlite3_
e0a0: 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29  win32_sleep(100)
e0b0: 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49  , 1) );.#if SQLI
e0c0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66  TE_OS_WINCE.#def
e0d0: 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  ine WINCE_DELETI
e0e0: 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20  ON_ATTEMPTS 3.  
e0f0: 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
e100: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  (pFile);.  if( p
e110: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
e120: 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  lose ){.    int 
e130: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
e140: 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f  le(.           o
e150: 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69  sDeleteFileW(pFi
e160: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
e170: 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  se)==0.        &
e180: 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  & osGetFileAttri
e190: 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44  butesW(pFile->zD
e1a0: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30  eleteOnClose)!=0
e1b0: 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20  xffffffff .     
e1c0: 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49     && cnt++ < WI
e1d0: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
e1e0: 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20  EMPTS.    ){.   
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
e200: 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f  2_sleep(100);  /
e210: 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20  * Wait a little 
e220: 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67  before trying ag
e230: 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ain */.    }.   
e240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
e250: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
e260: 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
e270: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
e280: 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  SE %d %s\n", pFi
e290: 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
e2a0: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
e2b0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
e2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
e2d0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
e2e0: 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
e2f0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e300: 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73  _CLOSE, osGetLas
e310: 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20      "winClose", 
e340: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d  pFile->zPath);.}
e350: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
e360: 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
e370: 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
e380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
e390: 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
e3a0: 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
e3b0: 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
e3c0: 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
e3d0: 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
e3e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e3f0: 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74  winRead(.  sqlit
e400: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
e410: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
e420: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
e430: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
e440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
e450: 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ite content into
e460: 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
e470: 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e490: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
e4a0: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c  to read */.  sql
e4b0: 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
e4c0: 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  t       /* Begin
e4d0: 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73   reading at this
e4e0: 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20   offset */.){.  
e4f0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
e500: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
e510: 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* file handle *
e520: 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b  /.  DWORD nRead;
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e550: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
e560: 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a  read from file *
e570: 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
e580: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e5a0: 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73   retrys */..  as
e5b0: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
e5c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
e5d0: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
e5e0: 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53  OERR_READ);.  OS
e5f0: 54 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20  TRACE(("READ %d 
e600: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
e610: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
e620: 6b 74 79 70 65 29 29 3b 0a 0a 20 20 69 66 28 20  ktype));..  if( 
e630: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
e640: 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20  e, offset) ){.  
e650: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e660: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
e670: 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
e680: 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
e690: 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
e6a0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  {.    DWORD last
e6b0: 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72  Errno;.    if( r
e6c0: 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
e6d0: 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
e6e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
e6f0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e700: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
e710: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
e720: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e730: 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
e740: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
e750: 20 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c        "winRead",
e760: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
e770: 20 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e    }.  logIoerr(n
e780: 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52  Retry);.  if( nR
e790: 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
e7a0: 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
e7b0: 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
e7c0: 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
e7d0: 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
e7e0: 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
e7f0: 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
e800: 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
e810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
e820: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
e830: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
e840: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e850: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
e860: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
e870: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
e880: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e890: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
e8a0: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
e8b0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
e8c0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
e8d0: 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
e8e0: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
e8f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
e900: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
e910: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
e920: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
e930: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
e940: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
e950: 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e970: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
e980: 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
e990: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
e9a0: 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
e9b0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
e9c0: 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
e9d0: 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
e9e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
ea10: 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
ea20: 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
ea30: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
ea40: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
ea50: 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
ea60: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
ea70: 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
ea80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ea90: 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
eaa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
eab0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
eac0: 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
ead0: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
eae0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
eaf0: 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
eb00: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
eb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
eb20: 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
eb30: 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64  WRITE %d lock=%d
eb40: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
eb50: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
eb60: 3b 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69  ;..  rc = seekWi
eb70: 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  nFile(pFile, off
eb80: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
eb90: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 52 65  0 ){.    u8 *aRe
eba0: 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
ebb0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
ebc0: 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
ebd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
ebe0: 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
ebf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ec00: 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
ec10: 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
ec20: 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
ec50: 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
ec60: 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
ec70: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
ec80: 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
ec90: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
eca0: 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
ecb0: 28 29 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65  () */..    while
ecc0: 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
ecd0: 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
ece0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
ecf0: 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
ed00: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
ed10: 69 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26  if( retryIoerr(&
ed20: 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
ed30: 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
ed40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ed50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ed60: 20 6e 57 72 69 74 65 3c 3d 30 20 29 20 62 72 65   nWrite<=0 ) bre
ed70: 61 6b 3b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  ak;.      aRem +
ed80: 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
ed90: 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
eda0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
edb0: 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
edc0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
edd0: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
ede0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
edf0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
ee00: 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
ee10: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
ee20: 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
ee30: 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
ee40: 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
ee50: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
ee60: 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
ee70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
ee80: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
ee90: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
eea0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  (SQLITE_IOERR_WR
eeb0: 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ITE, pFile->last
eec0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
eed0: 20 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20      "winWrite", 
eee0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
eef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49   }else{.    logI
ef00: 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
ef10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ef20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
ef30: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
ef40: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
ef50: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
ef60: 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
ef70: 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
ef80: 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
ef90: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e  64 nByte){.  win
efa0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
efb0: 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
efc0: 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  File handle obje
efd0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
efe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
eff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
f000: 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  n code for this 
f010: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  function */..  a
f020: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
f030: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
f040: 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22  NCATE %d %lld\n"
f050: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
f060: 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e));.  SimulateI
f070: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
f080: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
f090: 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ATE);..  /* If t
f0a0: 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
f0b0: 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
f0c0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
f0d0: 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
f0e0: 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
f0f0: 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
f100: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
f110: 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
f120: 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
f130: 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
f140: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
f150: 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
f160: 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
f170: 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
f180: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
f190: 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
f1a0: 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
f1b0: 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
f1c0: 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
f1d0: 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
f1e0: 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
f1f0: 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
f200: 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
f210: 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
f220: 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
f230: 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
f240: 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28  if( seekWinFile(
f250: 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
f260: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
f270: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f280: 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
f290: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
f2b0: 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
f2c0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
f2d0: 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45  se if( 0==osSetE
f2e0: 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ndOfFile(pFile->
f2f0: 68 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  h) ){.    pFile-
f300: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
f310: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
f320: 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
f330: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f340: 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
f350: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
f360: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
f370: 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d  uncate2", pFile-
f380: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  >zPath);.  }..  
f390: 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
f3a0: 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22  TE %d %lld %s\n"
f3b0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
f3c0: 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22  e, rc ? "failed"
f3d0: 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74   : "ok"));.  ret
f3e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
f3f0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
f400: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
f410: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
f420: 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
f430: 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
f440: 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
f450: 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
f460: 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
f470: 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
f480: 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
f490: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
f4a0: 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
f4b0: 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
f4c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
f4d0: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
f4e0: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
f4f0: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
f500: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
f510: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
f520: 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
f530: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f540: 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
f550: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
f560: 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
f570: 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
f580: 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
f590: 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
f5a0: 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
f5b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
f5c0: 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
f5d0: 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
f5e0: 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e   || \.    (defin
f5f0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
f600: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
f610: 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20  E_DEBUG)).  /*. 
f620: 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51   ** Used when SQ
f630: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
f640: 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20  not defined and 
f650: 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20  by the assert() 
f660: 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52  and/or.  ** OSTR
f670: 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  ACE() macros..  
f680: 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
f690: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
f6a0: 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
f6b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
f6c0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
f6d0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
f6e0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
f6f0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
f700: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
f710: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
f720: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
f730: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
f740: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
f750: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
f760: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
f770: 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28    );..  OSTRACE(
f780: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
f790: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
f7a0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
f7b0: 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
f7c0: 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
f7d0: 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
f7e0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
f7f0: 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
f800: 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
f810: 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
f820: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
f830: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
f840: 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
f850: 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
f860: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
f870: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f880: 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  E_TEST.  UNUSED_
f890: 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
f8a0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66  ;.#else.  if( (f
f8b0: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
f8c0: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a  TE_SYNC_FULL ){.
f8d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c      sqlite3_full
f8e0: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
f8f0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  }.  sqlite3_sync
f900: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
f910: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
f920: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
f930: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
f940: 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
f950: 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
f960: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
f970: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65  ITE_NO_SYNC.  re
f980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f990: 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46  #else.  rc = osF
f9a0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
f9b0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d  pFile->h);.  Sim
f9c0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
f9d0: 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20  =FALSE );.  if( 
f9e0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
f9f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
fa00: 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
fa10: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
fa20: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
fa30: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
fa40: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
fa50: 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  R_FSYNC, pFile->
fa60: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
fa70: 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
fa80: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
fa90: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
faa0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
fab0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
fac0: 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
fad0: 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
fae0: 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71  t winFileSize(sq
faf0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
fb00: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
fb10: 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Size){.  winFile
fb20: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fb30: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
fb40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
fb50: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
fb60: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
fb70: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
fb80: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
fb90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
fba0: 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  NRT.  {.    FILE
fbb0: 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69  _STANDARD_INFO i
fbc0: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47  nfo;.    if( osG
fbd0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
fbe0: 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c  nByHandleEx(pFil
fbf0: 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61  e->h, FileStanda
fc00: 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  rdInfo,.        
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e               &in
fc30: 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
fc40: 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ) ){.      *pSiz
fc50: 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69  e = info.EndOfFi
fc60: 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20  le.QuadPart;.   
fc70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
fc80: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
fc90: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
fca0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
fcb0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
fcc0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
fcd0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
fd00: 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
fd10: 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
fd20: 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f  else.  {.    DWO
fd30: 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20  RD upperBits;.  
fd40: 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74    DWORD lowerBit
fd50: 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  s;.    DWORD las
fd60: 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77  tErrno;..    low
fd70: 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69  erBits = osGetFi
fd80: 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c  leSize(pFile->h,
fd90: 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20   &upperBits);.  
fda0: 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71    *pSize = (((sq
fdb0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65  lite3_int64)uppe
fdc0: 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f  rBits)<<32) + lo
fdd0: 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28  werBits;.    if(
fde0: 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d     (lowerBits ==
fdf0: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49   INVALID_FILE_SI
fe00: 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28  ZE).       && ((
fe10: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
fe20: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
fe30: 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20  O_ERROR) ){.    
fe40: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fe50: 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
fe60: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
fe70: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fe80: 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
fe90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
fea0: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
feb0: 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
fec0: 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
fed0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
fee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
fef0: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
ff00: 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
ff10: 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
ff20: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
ff30: 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
ff40: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
ff50: 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
ff60: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
ff70: 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
ff80: 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
ff90: 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
ffa0: 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
ffb0: 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
ffc0: 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 2.#endif../*.*
ffd0: 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20  * Historically, 
ffe0: 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20  SQLite has used 
fff0: 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  both the LockFil
10000 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  e and LockFileEx
10010 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57   functions..** W
10020 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  hen the LockFile
10030 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73   function was us
10040 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79  ed, it was alway
10050 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61  s expected to fa
10060 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  il.** immediatel
10070 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f  y if the lock co
10080 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  uld not be obtai
10090 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61  ned.  Also, it a
100a0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
100b0 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65  o.** obtain an e
100c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
100d0 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
100e0 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f  used with the Lo
100f0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
10100 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74  n.** and reflect
10110 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69   those expectati
10120 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ons; therefore, 
10130 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20  they should not 
10140 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  be changed..*/.#
10150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
10160 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64  CKFILE_FLAGS.# d
10170 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
10180 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c  KFILE_FLAGS   (L
10190 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
101a0 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20  EDIATELY | \.   
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
101d0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
101e0 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a  E_LOCK).#endif..
101f0 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  /*.** Currently,
10200 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61   SQLite never ca
10210 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  lls the LockFile
10220 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  Ex function with
10230 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a  out wanting the.
10240 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20  ** call to fail 
10250 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
10260 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
10270 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23  e obtained..*/.#
10280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
10290 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23  CKFILEEX_FLAGS.#
102a0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
102b0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20  OCKFILEEX_FLAGS 
102c0 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
102d0 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64  MMEDIATELY).#end
102e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
102f0 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
10300 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
10310 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
10320 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
10330 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
10340 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
10350 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  9x or WinNT..*/.
10360 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
10370 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
10380 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
10390 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  s;.  if( isNT() 
103a0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  ){.    res = win
103b0 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
103c0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
103d0 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
103e0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
10410 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  0);.  }.#ifdef S
10420 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
10430 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
10440 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
10450 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
10460 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
10470 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
10480 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
10490 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
104a0 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
104b0 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
104c0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
104d0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  e(pFile->h, SQLI
104e0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
104f0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
10500 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
10510 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
10520 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
10530 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
10540 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30  f.  if( res == 0
10550 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
10560 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10570 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10580 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c   /* No need to l
10590 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20  og a failure to 
105a0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  lock */.  }.  re
105b0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
105c0 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
105d0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
105e0 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
105f0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
10600 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57  .  int res;.  DW
10610 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
10620 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
10630 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
10640 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
10650 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
10660 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
10670 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
10680 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
10690 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
106a0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
106b0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
106c0 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
106d0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
106e0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
106f0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
10700 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
10710 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
10720 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
10730 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
10740 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10750 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
10760 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
10770 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10780 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
10790 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
107a0 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f     "unlockReadLo
107b0 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
107c0 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
107d0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   res;.}../*.** L
107e0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
107f0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
10800 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
10810 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
10820 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
10830 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
10840 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
10850 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
10860 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
10870 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
10880 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
10890 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
108a0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
108b0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
108c0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
108d0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
108e0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
108f0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
10900 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
10910 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
10920 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
10930 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
10940 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
10950 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
10960 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
10970 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
10980 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
10990 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
109a0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
109b0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
109c0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
109d0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
109e0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
109f0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
10a00 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
10a10 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
10a20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
10a30 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
10a40 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
10a50 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
10a60 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
10a70 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
10a80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
10a90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
10aa0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
10ab0 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
10ac0 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
10ad0 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
10ae0 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
10af0 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
10b00 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
10b10 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
10b20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
10b30 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
10b40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
10b50 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
10b60 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
10b70 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
10b80 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
10b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10ba0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
10bb0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10bc0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
10bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
10be0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
10bf0 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
10c00 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
10c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10c20 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77  sult of a Window
10c30 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  s lock call */. 
10c40 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
10c50 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
10c60 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
10c70 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
10c80 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
10c90 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
10ca0 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
10cb0 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
10cc0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
10cd0 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e  is time */.  win
10ce0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
10cf0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57  inFile*)id;.  DW
10d00 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
10d10 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
10d20 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
10d30 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  OSTRACE(("LOCK %
10d40 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
10d50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
10d60 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
10d70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
10d80 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
10d90 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20  dLockByte));..  
10da0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
10db0 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
10dc0 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
10dd0 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
10de0 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
10df0 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
10e00 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
10e10 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
10e20 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
10e30 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
10e40 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
10e50 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
10e60 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
10e70 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
10e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
10ea0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
10eb0 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
10ec0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
10ed0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
10ee0 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
10ef0 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
10f00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10f10 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
10f20 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
10f30 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
10f40 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
10f50 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
10f60 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
10f70 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
10f80 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
10f90 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
10fa0 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
10fb0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
10fc0 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
10fd0 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
10fe0 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
10ff0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
11000 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
11010 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
11020 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
11030 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
11040 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
11050 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
11060 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79    (pFile->lockty
11070 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20  pe==NO_LOCK).   
11080 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79    || (   (lockty
11090 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
110a0 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  CK).         && 
110b0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
110c0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
110d0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
110e0 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
110f0 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
11100 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
11110 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  (pFile->h, SQLIT
11120 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
11130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49             PENDI
11160 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
11170 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
11180 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
11190 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
111a0 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
111b0 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
111c0 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
111d0 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
111e0 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
111f0 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
11200 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
11210 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
11220 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
11230 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
11240 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
11250 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
11260 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
11270 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
11280 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
11290 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
112a0 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
112b0 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
112c0 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
112d0 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
112e0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
112f0 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
11300 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
11310 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
11320 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
11330 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
11340 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
11350 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
11360 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
11370 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
11380 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
11390 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
113a0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
113b0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
113c0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
113d0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
113e0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
113f0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
11400 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
11410 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
11420 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
11430 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
11440 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
11450 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
11460 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11470 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
11480 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
11490 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
114a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
114b0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
114c0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
114d0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
114e0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
114f0 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
11500 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  inLockFile(pFile
11510 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
11520 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
11530 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
11540 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
11550 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
11560 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
11570 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
11580 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
11590 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
115a0 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
115b0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
115c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
115d0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
115e0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
115f0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
11600 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
11610 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
11620 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
11630 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
11640 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
11650 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
11660 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
11670 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
11680 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
11690 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
116a0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
116b0 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
116c0 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
116d0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
116e0 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c  unreadlock = %d\
116f0 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72  n", res));.    r
11700 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
11710 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  (pFile->h, SQLIT
11720 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
11730 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
11740 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
11750 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
11760 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
11770 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
11780 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
11790 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
117a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
117b0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
117c0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
117d0 20 20 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f    OSTRACE(("erro
117e0 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20  r-code = %d\n", 
117f0 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20  lastErrno));.   
11800 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70     getReadLock(p
11810 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
11820 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
11830 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
11840 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
11850 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
11860 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
11870 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
11880 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
11890 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
118a0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
118b0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
118c0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
118d0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
118e0 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
118f0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
11900 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
11910 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
11920 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
11930 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
11940 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
11950 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
11960 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
11970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11980 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
11990 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41  STRACE(("LOCK FA
119a0 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
119b0 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
119c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
119d0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
119e0 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
119f0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  );.    pFile->la
11a00 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
11a10 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
11a20 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
11a30 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11a40 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
11a50 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
11a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11a70 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
11a80 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
11a90 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
11aa0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
11ab0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
11ac0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
11ad0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
11ae0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
11af0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
11b00 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
11b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11b20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
11b30 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11b40 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11b50 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
11b60 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
11b70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
11b80 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
11b90 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
11ba0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
11bb0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
11bc0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
11bd0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
11be0 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
11bf0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
11c00 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
11c10 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11c20 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
11c30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11c40 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
11c50 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
11c60 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  e(pFile->h, SQLI
11c70 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
11c80 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
11c90 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
11ca0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11cb0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46  winUnlockFile(pF
11cc0 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
11cd0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
11ce0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
11cf0 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  !rc;.    OSTRACE
11d00 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
11d10 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  %d %d (remote)\n
11d20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
11d30 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
11d40 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
11d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11d60 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11d70 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11d80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11d90 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
11da0 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
11db0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
11dc0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
11dd0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
11de0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11df0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
11e00 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
11e10 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
11e20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
11e30 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
11e40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
11e50 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
11e60 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
11e70 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
11e80 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
11e90 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
11ea0 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
11eb0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11ec0 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
11ed0 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
11ee0 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
11ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11f00 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
11f10 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
11f20 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11f30 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
11f40 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
11f50 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
11f60 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
11f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11f80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11f90 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
11fa0 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
11fb0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
11fc0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE(("UNLOCK %d 
11fd0 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
11fe0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
11ff0 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
12000 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
12010 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
12020 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74  dLockByte));.  t
12030 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
12040 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
12050 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
12060 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
12070 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
12080 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
12090 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
120a0 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
120b0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
120c0 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
120d0 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
120e0 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
120f0 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
12100 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
12110 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
12120 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
12130 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
12140 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
12150 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12160 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
12170 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
12180 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12190 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  Unlock", pFile->
121a0 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
121b0 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45  }.  if( type>=RE
121c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
121d0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
121e0 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
121f0 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
12200 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
12210 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
12220 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
12230 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  LOCK ){.    unlo
12240 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
12250 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70  );.  }.  if( typ
12260 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
12270 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
12280 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
12290 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
122a0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69  1, 0);.  }.  pFi
122b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
122c0 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  u8)locktype;.  r
122d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
122e0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
122f0 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
12300 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
12310 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
12320 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
12330 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
12340 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
12350 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
12360 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
12370 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
12380 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
12390 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
123a0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
123b0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
123c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
123d0 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
123e0 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
123f0 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
12400 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
12410 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
12420 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
12430 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
12440 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
12450 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
12460 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
12470 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
12480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
12490 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
124a0 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  mask;.  }.}../*.
124b0 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
124c0 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
124d0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
124e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
124f0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
12500 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12510 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
12520 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
12530 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
12540 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  d;.  switch( op 
12550 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
12560 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
12570 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
12580 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
12590 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  >locktype;.     
125a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
125b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
125c0 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
125d0 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
125e0 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29  nt*)pArg = (int)
125f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
12620 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12630 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
12640 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
12650 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
12660 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
12670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12690 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
126a0 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
126b0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
126c0 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  nk>0 ){.        
126d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c  sqlite3_int64 ol
126e0 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  dSz;.        int
126f0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
12700 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20  e(id, &oldSz);. 
12710 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
12720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12730 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
12740 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71  t64 newSz = *(sq
12750 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
12760 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  g;.          if(
12770 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a   newSz>oldSz ){.
12780 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
12790 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
127a0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(1);.          
127b0 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
127c0 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20  te(id, newSz);. 
127d0 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
127e0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
127f0 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (0);.          }
12800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12820 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
12830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12840 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
12850 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
12860 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77  T_WAL: {.      w
12870 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  inModeBit(pFile,
12880 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54   WINFILE_PERSIST
12890 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67  _WAL, (int*)pArg
128a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
128b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
128c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
128d0 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
128e0 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20  _OVERWRITE: {.  
128f0 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
12900 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53  File, WINFILE_PS
12910 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
12920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
12940 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
12950 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
12960 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
12970 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
12980 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a  rintf("win32");.
12990 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
129a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
129b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
129c0 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
129d0 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY: {.      int 
129e0 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  *a = (int*)pArg;
129f0 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e  .      if( a[0]>
12a00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
12a10 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61  32IoerrRetry = a
12a20 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [0];.      }else
12a30 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d  {.        a[0] =
12a40 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
12a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12a60 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20  if( a[1]>0 ){.  
12a70 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
12a80 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31  RetryDelay = a[1
12a90 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
12aa0 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77          a[1] = w
12ab0 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
12ac0 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lay;.      }.   
12ad0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12ae0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
12af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12b00 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  OTFOUND;.}../*.*
12b10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
12b20 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
12b30 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
12b40 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
12b50 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
12b60 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
12b70 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
12b80 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
12b90 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
12ba0 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
12bb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
12bc0 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
12bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
12be0 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
12bf0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
12c00 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
12c10 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
12c20 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
12c30 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
12c40 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
12c50 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
12c60 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
12c70 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
12c80 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
12c90 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
12ca0 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72  ic int winSector
12cb0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
12cc0 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29  e *id){.  (void)
12cd0 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
12ce0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
12cf0 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
12d00 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f  * Return a vecto
12d10 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72  r of device char
12d20 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a  acteristics..*/.
12d30 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
12d40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
12d50 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
12d60 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65   *id){.  winFile
12d70 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29   *p = (winFile*)
12d80 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
12d90 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
12da0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
12db0 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e  |.         ((p->
12dc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
12dd0 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45  ILE_PSOW)?SQLITE
12de0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
12df0 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d  _OVERWRITE:0);.}
12e00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12e10 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a  _OMIT_WAL../* .*
12e20 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f  * Windows will o
12e30 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61  nly let you crea
12e40 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70  te file view map
12e50 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f  pings.** on allo
12e60 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e  cation size gran
12e70 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69  ularity boundari
12e80 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71  es..** During sq
12e90 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
12ea0 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65  we do a GetSyste
12eb0 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65  mInfo().** to ge
12ec0 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74  t the granularit
12ed0 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45  y size..*/.SYSTE
12ee0 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
12ef0 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  o;../*.** Helper
12f00 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
12f10 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
12f20 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
12f30 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
12f40 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
12f50 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
12f60 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a   winLockInfo obj
12f70 65 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  ects used by .**
12f80 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
12f90 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
12fa0 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
12fb0 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
12fc0 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68  * Function winSh
12fd0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
12fe0 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
12ff0 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
13000 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
13010 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
13020 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
13030 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
13040 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
13050 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
13060 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69   e.g..**.**   wi
13070 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
13080 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
13090 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
130a0 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ) );.**   winShm
130b0 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a  LeaveMutex().*/.
130c0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
130d0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  hmEnterMutex(voi
130e0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
130f0 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
13100 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13110 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13120 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
13130 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65  ic void winShmLe
13140 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
13150 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13160 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
13170 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13180 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
13190 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  ER));.}.#ifdef S
131a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
131b0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74  ic int winShmMut
131c0 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
131d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
131e0 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
131f0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13200 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13210 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
13220 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  dif../*.** Objec
13230 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
13240 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  ent a single fil
13250 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61  e opened and mma
13260 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a  pped to provide.
13270 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ** shared memory
13280 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .  When multiple
13290 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
132a0 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a  erence the same.
132b0 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20  ** log-summary, 
132c0 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
132d0 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20  its own winFile 
132e0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
132f0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
13300 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
13310 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
13320 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
13330 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
13340 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
13350 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
13360 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77  process..**.** w
13370 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
13380 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
13390 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
133a0 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
133b0 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
133c0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
133d0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
133e0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
133f0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20        nRef.**   
13400 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20     pNext .**.** 
13410 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
13420 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
13430 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
13440 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
13450 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
13460 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
13470 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77  e.**.** Either w
13480 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  inShmNode.mutex 
13490 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
134a0 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
134b0 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d  =0 and.** winShm
134c0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
134d0 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
134e0 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
134f0 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
13500 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
13510 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77  ..**.*/.struct w
13520 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71  inShmNode {.  sq
13530 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13540 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
13550 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
13560 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
13570 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
13580 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
13590 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
135a0 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20   winFile hFile; 
135b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
135c0 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
135d0 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e  winOpen */..  in
135e0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
135f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13600 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
13610 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
13620 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  nt nRegion;     
13630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
13640 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
13650 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ion */.  struct 
13660 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20  ShmRegion {.    
13670 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
13680 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
13690 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65   handle from Cre
136a0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a  ateFileMapping *
136b0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70  /.    void *pMap
136c0 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a  ;.  } *aRegion;.
136d0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
136e0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
136f0 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
13700 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
13710 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  I/O error */..  
13720 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
13730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13740 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f  mber of winShm o
13750 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
13760 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
13770 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
13780 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77          /* All w
13790 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
137a0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
137b0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
137c0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f  pNext;         /
137d0 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f  * Next in list o
137e0 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
137f0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64   objects */.#ifd
13800 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13810 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13830 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77  Next available w
13840 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  inShm.id value *
13850 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
13860 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61  ** A global arra
13870 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  y of all winShmN
13880 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a  ode objects..**.
13890 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74  ** The winShmMut
138a0 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
138b0 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64   true while read
138c0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
138d0 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  his list..*/.sta
138e0 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  tic winShmNode *
138f0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
13900 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63   0;../*.** Struc
13910 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
13920 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
13930 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
13940 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
13950 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
13960 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
13970 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
13980 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
13990 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
139a0 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
139b0 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
139c0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
139d0 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69  ter:.**.**    wi
139e0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a  nShm.pShmNode.**
139f0 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a      winShm.id.**
13a00 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
13a10 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
13a20 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d  ite.  The winShm
13a30 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  .pShmNode->mutex
13a40 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
13a50 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
13a60 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
13a70 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
13a80 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e  t winShm {.  win
13a90 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
13aa0 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75  e;      /* The u
13ab0 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d  nderlying winShm
13ac0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
13ad0 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20   winShm *pNext; 
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13af0 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20  ext winShm with 
13b00 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e  the same winShmN
13b10 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
13b20 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
13b30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
13b40 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68  olding the winSh
13b50 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
13b60 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
13b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13b80 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
13b90 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
13ba0 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
13bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
13bc0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
13bd0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64  cks held */.#ifd
13be0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13bf0 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c10 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
13c20 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77  ction with its w
13c30 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e  inShmNode */.#en
13c40 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  dif.};../*.** Co
13c50 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
13c60 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
13c70 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45  ine WIN_SHM_BASE
13c80 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
13c90 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
13ca0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
13cb0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
13cc0 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20  e WIN_SHM_DMS   
13cd0 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53   (WIN_SHM_BASE+S
13ce0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
13cf0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
13d00 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
13d10 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ply advisory loc
13d20 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74  ks for all n byt
13d30 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  es beginning at 
13d40 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ofst..*/.#define
13d50 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23   _SHM_UNLCK  1.#
13d60 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43  define _SHM_RDLC
13d70 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  2.#define _SH
13d80 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69  M_WRLCK  3.stati
13d90 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74  c int winShmSyst
13da0 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d  emLock(.  winShm
13db0 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  Node *pFile,    
13dc0 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
13dd0 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
13de0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
13df0 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
13e00 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ype,         /* 
13e10 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d  _SHM_UNLCK, _SHM
13e20 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f  _RDLCK, or _SHM_
13e30 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
13e40 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
13e50 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69   /* Offset to fi
13e60 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
13e70 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a  ocked/unlocked *
13e80 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20  /.  int nByte   
13e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13ea0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
13eb0 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a  lock or unlock *
13ec0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
13ed0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
13ee0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
13ef0 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65   Lock/UnlockFile
13f00 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  Ex() */..  /* Ac
13f10 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53  cess to the winS
13f20 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
13f30 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
13f40 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
13f50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13f60 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d  utex_held(pFile-
13f70 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65  >mutex) || pFile
13f80 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
13f90 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69  /* Release/Acqui
13fa0 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  re the system-le
13fb0 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  vel lock */.  if
13fc0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d  ( lockType==_SHM
13fd0 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63  _UNLCK ){.    rc
13fe0 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
13ff0 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  (pFile->hFile.h,
14000 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
14010 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
14020 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
14030 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
14040 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57  meters */.    DW
14050 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f  ORD dwFlags = LO
14060 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
14070 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28  DIATELY;.    if(
14080 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48   lockType == _SH
14090 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67  M_WRLCK ) dwFlag
140a0 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  s |= LOCKFILE_EX
140b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
140c0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69    rc = winLockFi
140d0 6c 65 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  le(pFile->hFile.
140e0 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
140f0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
14100 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
14110 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
14120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
14130 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
14140 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
14150 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
14160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14170 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
14180 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
14190 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
141a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
141b0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
141c0 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
141d0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
141e0 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
141f0 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
14200 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
14210 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
14220 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
14230 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
14240 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
14250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
14260 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
14270 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
14280 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
14290 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
142a0 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
142b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
142c0 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
142d0 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
142e0 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
142f0 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
14300 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
14310 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
14320 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
14330 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
14340 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
14350 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
14360 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
14370 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
14380 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
14390 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
143a0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
143b0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
143c0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
143d0 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
143e0 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
143f0 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
14400 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
14410 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
14420 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
14430 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
14440 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
14450 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
14460 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
14470 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
14480 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
14490 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
144a0 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
144b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
144c0 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
144d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
144e0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
144f0 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
14500 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
14510 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
14520 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
14530 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
14540 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20  GE pid-%d unmap 
14550 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
14560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14570 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
14580 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
14590 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
145a0 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
145b0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
145c0 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
145d0 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
145e0 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
145f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
14600 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
14610 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64   close region=%d
14620 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
14630 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
14640 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14650 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
14660 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
14670 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
14680 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
14690 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
146a0 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44   != INVALID_HAND
146b0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
146c0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
146d0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
146e0 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
146f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
14700 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
14710 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
14720 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
14730 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
14740 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
14750 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
14760 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
14770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
14780 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14790 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
147a0 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
147b0 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
147c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
147d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
147e0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
147f0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
14800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
14810 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
14820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14830 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
14840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14850 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
14860 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
14870 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
14880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
14890 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
148a0 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
148b0 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
148c0 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
148d0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
148e0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
148f0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
14900 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
14910 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
14920 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
14930 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
14940 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
14950 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
14960 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
14970 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
14980 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
14990 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
149a0 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
149b0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
149c0 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
149d0 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
149e0 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a00 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
14a10 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
14a20 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
14a30 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
14a40 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
14a50 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
14a60 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
14a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a90 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
14aa0 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
14ab0 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
14ac0 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
14ad0 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
14ae0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
14af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
14b10 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
14b20 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
14b30 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
14b40 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
14b50 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
14b60 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
14b70 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
14b80 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
14b90 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
14ba0 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
14bb0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
14bc0 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
14bd0 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
14be0 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
14bf0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
14c00 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
14c10 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
14c20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
14c30 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
14c40 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
14c50 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
14c60 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
14c70 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
14c80 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
14c90 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
14ca0 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
14cb0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
14cc0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14cd0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
14ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14cf0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  R_NOMEM;.  }.  m
14d00 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
14d10 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e  izeof(*pNew) + n
14d20 4e 61 6d 65 20 2b 20 31 37 29 3b 0a 20 20 70 4e  Name + 17);.  pN
14d30 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
14d40 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
14d50 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
14d60 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
14d70 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
14d80 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
14d90 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
14da0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
14db0 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
14dc0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20  >zFilename); .. 
14dd0 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
14de0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
14df0 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
14e00 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
14e10 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
14e20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
14e30 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
14e40 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
14e50 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
14e60 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
14e70 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
14e80 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
14e90 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
14ea0 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
14eb0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
14ec0 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
14ed0 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
14ee0 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
14ef0 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
14f00 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
14f10 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
14f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14f30 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
14f40 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
14f50 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
14f60 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
14f70 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
14f80 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
14f90 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
14fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
14fb0 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
14fc0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
14fd0 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
14fe0 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
14ff0 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
15000 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
15010 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
15020 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
15030 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
15040 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
15050 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
15060 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
15070 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
15080 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
15090 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
150a0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
150b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
150c0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
150d0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
150e0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
150f0 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
15100 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
15110 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
15120 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
15130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15140 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
15150 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
15160 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
15170 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
15180 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
15190 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
151a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
151b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
151c0 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
151d0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
151e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
151f0 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
15200 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
15210 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
15220 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
15230 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
15240 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
15250 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
15260 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
15270 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
15280 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
15290 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
152a0 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
152b0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
152c0 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
152d0 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
152e0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
152f0 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
15300 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
15310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15320 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
15330 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
15340 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
15350 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
15360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
15380 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
15390 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
153a0 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
153b0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
153c0 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e          "winOpen
153d0 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
153e0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
153f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
15400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15410 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
15420 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
15430 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
15440 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
15450 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
15460 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
15470 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
15480 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
15490 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
154a0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
154b0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
154c0 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
154d0 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
154e0 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
154f0 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
15500 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
15510 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15520 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
15530 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
15540 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
15550 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
15560 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
15570 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
15580 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
15590 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
155a0 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
155b0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
155c0 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
155d0 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
155e0 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
155f0 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
15600 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
15610 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
15620 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
15630 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
15640 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
15650 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
15660 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
15670 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
15680 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
15690 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
156a0 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
156b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
156c0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
156d0 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
156e0 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
156f0 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
15700 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
15710 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
15720 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
15730 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
15740 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
15750 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
15760 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
15770 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
15780 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
15790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
157a0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
157b0 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
157c0 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
157d0 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
157e0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
157f0 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
15800 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
15810 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
15820 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
15830 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
15840 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
15850 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
15860 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
15870 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
15880 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
15890 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
158a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
158b0 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
158c0 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
158d0 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
158e0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
158f0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
15900 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
15910 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
15920 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
15930 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
15940 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
15950 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
15960 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
15970 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
15980 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
15990 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
159a0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
159b0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
159c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
159d0 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
159e0 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
159f0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
15a00 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
15a10 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
15a20 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
15a30 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
15a40 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
15a50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
15a60 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
15a70 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
15a80 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
15a90 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
15aa0 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
15ab0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
15ac0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
15ad0 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
15ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15af0 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
15b00 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
15b10 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
15b20 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
15b30 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
15b40 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
15b50 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
15b60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
15b70 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
15b80 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
15b90 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
15ba0 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
15bb0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
15bc0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
15bd0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
15be0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
15bf0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
15c00 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
15c10 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
15c20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15c30 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
15c40 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
15c50 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
15c60 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
15c70 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
15c80 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
15c90 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
15ca0 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
15cb0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
15cc0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
15cd0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
15ce0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
15cf0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
15d00 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
15d10 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
15d20 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
15d30 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
15d40 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
15d50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15d60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
15d70 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
15d80 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
15d90 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
15da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
15db0 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
15dc0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
15dd0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
15de0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
15df0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
15e00 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
15e30 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
15e40 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
15e50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15e60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15e70 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
15e80 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
15e90 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15eb0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
15ec0 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
15ed0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
15ee0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
15ef0 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
15f00 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
15f10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
15f20 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
15f30 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
15f40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
15f50 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
15f60 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
15f70 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
15fa0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
15fb0 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
15fc0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
15fd0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
15fe0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15ff0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
16000 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
16010 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
16020 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
16050 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
16060 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
16070 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
16080 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
16090 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
160a0 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
160b0 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
160c0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
160d0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
160e0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
160f0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
16100 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
16110 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
16120 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
16130 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
16140 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
16150 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
16160 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
16170 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
16180 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
16190 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
161a0 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
161b0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
161c0 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
161d0 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
161e0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
161f0 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
16200 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
16210 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
16220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16230 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
16240 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
16250 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
16260 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
16270 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
16280 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
16290 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
162a0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
162b0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
162c0 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
162d0 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
162e0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
162f0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
16300 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
16310 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
16320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16330 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
16340 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
16350 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
16360 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
16370 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
16380 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
16390 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
163a0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
163b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
163c0 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
163d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
163e0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
163f0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
16400 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
16410 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
16420 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16440 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
16450 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
16460 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
16470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16480 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
16490 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
164a0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
164b0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
164c0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
164d0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
164e0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
164f0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
16500 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
16510 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
16520 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
16530 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
16540 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
16550 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
16560 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
16570 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
16580 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
16590 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
165a0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
165b0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
165c0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
165d0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
165e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
165f0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
16600 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
16610 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
16620 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
16630 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
16640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16650 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16660 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16670 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
16680 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
16690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
166a0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
166b0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
166c0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
166d0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
166e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
166f0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
16700 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
16710 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
16720 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
16730 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
16740 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
16750 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
16760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16770 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
16780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16790 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
167a0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
167b0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
167c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
167d0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
167e0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
167f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
16800 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
16810 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
16820 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
16830 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
16840 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
16850 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
16860 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
16870 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
16880 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
16890 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
168a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
168b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
168c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
168d0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
168e0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
168f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
16900 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16910 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
16930 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
16940 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
16950 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
16960 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
16970 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
16980 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
16990 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
169a0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
169b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
169c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
169d0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
169e0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
169f0 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
16a00 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
16a10 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
16a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16a30 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16a40 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
16a50 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
16a60 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
16a70 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
16a80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16a90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16aa0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
16ab0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
16ac0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
16ad0 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
16ae0 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
16af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
16b00 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75  id, (int)osGetCu
16b10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
16b20 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
16b30 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
16b40 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
16b50 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
16b60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16b70 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
16b80 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
16b90 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
16ba0 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
16bb0 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
16bc0 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
16bd0 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
16be0 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
16bf0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
16c00 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
16c10 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
16c20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
16c30 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
16c40 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
16c50 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
16c60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
16c70 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
16c80 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
16c90 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
16ca0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
16cb0 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
16cc0 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
16cd0 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
16ce0 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
16cf0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
16d00 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
16d10 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
16d20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16d30 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
16d40 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
16d50 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
16d60 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
16d70 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
16d80 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
16d90 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
16da0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
16db0 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
16dc0 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
16dd0 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
16de0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
16df0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
16e00 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
16e10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
16e20 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
16e30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16e40 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
16e50 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
16e60 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
16e70 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
16e80 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
16e90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
16ea0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
16eb0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
16ec0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
16ed0 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
16ee0 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
16ef0 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
16f00 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
16f10 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
16f20 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
16f30 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
16f40 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
16f50 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
16f60 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
16f70 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
16f80 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
16f90 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
16fa0 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
16fb0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
16fc0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
16fd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
16fe0 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
16ff0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
17000 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
17010 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
17020 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
17030 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
17040 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
17050 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
17060 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
17070 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
17080 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
17090 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
170a0 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
170b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
170c0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
170d0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
170e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
170f0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
17100 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
17110 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
17120 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
17130 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
17140 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17150 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
17160 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
17170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17180 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
17190 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
171a0 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
171b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
171c0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
171d0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
171e0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
171f0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
17200 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
17210 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
17220 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
17230 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
17240 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
17250 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
17260 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
17270 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
17280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
17290 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
172a0 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
172b0 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
172c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
172d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
172e0 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
172f0 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
17300 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
17310 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
17320 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
17330 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
17340 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
17350 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
17360 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
17370 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
17380 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
17390 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
173a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
173b0 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
173c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
173d0 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
173e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
173f0 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
17400 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
17410 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
17420 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
17430 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
17440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17450 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
17460 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
17470 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
17480 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
17490 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
174a0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
174b0 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
174c0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
174d0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
174e0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
174f0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
17500 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
17510 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
17520 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
17530 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
17540 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
17550 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
17560 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
17570 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
17580 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
17590 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
175a0 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
175b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
175c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
175d0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
175e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
175f0 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
17600 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
17610 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
17620 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
17630 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
17640 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
17650 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
17660 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
17670 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
17680 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
17690 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
176a0 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
176b0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
176c0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
176d0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
176e0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
176f0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
17700 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
17710 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
17720 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
17730 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
17740 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
17750 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
17760 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
17770 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
17780 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
17790 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
177a0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
177b0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
177c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
177d0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
177e0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
177f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17800 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17810 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17820 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
17830 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
17840 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
17850 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
17860 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
17870 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
17880 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
17890 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
178a0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
178b0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
178c0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
178d0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
178e0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
178f0 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
17900 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
17910 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
17920 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
17930 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
17940 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
17950 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
17960 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
17970 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
17980 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
17990 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
179a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
179b0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
179c0 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
179d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
179e0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
179f0 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
17a00 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
17a10 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
17a20 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
17a30 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
17a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17a50 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
17a60 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20  egion */.     . 
17a70 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
17a80 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
17a90 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
17aa0 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
17ab0 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
17ac0 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
17ad0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ULL.      );.   
17ae0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
17af0 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65 61  -MAP pid-%d crea
17b00 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79  te region=%d nby
17b10 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  te=%d %s\n",.   
17b20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
17b30 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f  )osGetCurrentPro
17b40 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
17b50 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79  de->nRegion, nBy
17b60 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
17b70 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     hMap ? "ok" :
17b80 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
17b90 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
17ba0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
17bb0 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  et = pShmNode->n
17bc0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
17bd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
17be0 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
17bf0 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
17c00 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
17c10 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51  nularity;.#if SQ
17c20 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
17c30 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
17c40 61 70 56 69 65 77 4f 66 46 69 6c 65 45 78 28 68  apViewOfFileEx(h
17c50 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
17c60 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
17c70 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
17c80 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f   0, iOffset - iO
17c90 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
17ca0 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
17cb0 69 66 74 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  ift, NULL.      
17cc0 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
17cd0 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
17ce0 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20  iewOfFile(hMap, 
17cf0 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
17d00 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
17d10 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
17d20 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
17d30 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
17d40 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
17d50 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
17d60 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
17d70 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25  (("SHM-MAP pid-%
17d80 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  d map region=%d 
17d90 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25  offset=%d size=%
17da0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
17db0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
17dc0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
17dd0 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
17de0 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73  ->nRegion, iOffs
17df0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
17e00 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70       szRegion, p
17e10 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
17e20 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  iled"));.      }
17e30 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70  .      if( !pMap
17e40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d   ){.        pShm
17e50 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  Node->lastErrno 
17e60 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17e70 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ();.        rc =
17e80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
17e90 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
17ea0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74  , pShmNode->last
17eb0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17ec0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
17ed0 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
17ee0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
17ef0 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
17f00 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
17f10 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
17f20 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
17f30 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
17f40 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
17f50 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
17f60 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
17f70 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
17f80 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
17f90 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
17fa0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
17fb0 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
17fc0 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
17fd0 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
17fe0 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
17ff0 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
18000 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
18010 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
18020 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
18030 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
18040 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
18050 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
18060 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
18070 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
18080 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
18090 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
180a0 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
180b0 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
180c0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
180d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
180e0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
180f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
18100 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
18110 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
18120 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
18130 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
18140 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
18150 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
18160 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
18170 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
18180 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18190 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
181a0 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
181b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
181c0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
181d0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
181e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181f0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
18200 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
18210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18280 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
18290 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
182a0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
182b0 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
182c0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
182d0 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
182e0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
182f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
18300 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
18310 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
18340 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18360 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
18370 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
183a0 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
183c0 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
183d0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
183f0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
18400 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
18430 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18450 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
18460 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18480 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
18490 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184b0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
184c0 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
184d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
184e0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
184f0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
18500 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
18510 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
18520 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
18530 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18550 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
18560 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
18570 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
18580 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
18590 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
185a0 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185c0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
185d0 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
18600 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
18630 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
18640 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
18650 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
18660 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  ap */.};../*****
18670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
186c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186d0 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
186e0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
186f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18700 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
18710 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
18720 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
18730 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
18740 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
18750 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
18760 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
18770 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
18780 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
18790 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
187a0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
187b0 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
187c0 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
187d0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
187e0 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
187f0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
18800 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
18810 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
18820 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
18830 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
18840 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
18850 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
18860 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
18870 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
18880 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
18890 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
188a0 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
188b0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
188c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
188d0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
188e0 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
188f0 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
18900 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
18910 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  cs(zFilename);. 
18920 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
18930 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
18940 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
18950 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
18960 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
18970 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
18980 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
18990 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
189a0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
189b0 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56  to.** hold at pV
189c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63  fs->mxPathname c
189d0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
189e0 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
189f0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
18a00 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
18a10 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73  atic char zChars
18a20 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
18a30 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
18a40 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
18a50 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
18a60 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
18a70 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f  456789";.  size_
18a80 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
18a90 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54  TempPath[MAX_PAT
18aa0 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  H+2];..  /* It's
18ab0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
18ac0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
18ad0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
18ae0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
18af0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
18b00 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
18b10 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
18b20 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
18b30 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
18b40 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
18b50 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18b60 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
18b70 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d  _IOERR );..  mem
18b80 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30  set(zTempPath, 0
18b90 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a  , MAX_PATH+2);..
18ba0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
18bb0 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
18bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
18bd0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
18be0 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
18bf0 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
18c00 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a  directory);.  }.
18c10 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
18c20 49 4e 52 54 0a 20 20 65 6c 73 65 20 69 66 28 20  INRT.  else if( 
18c30 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  isNT() ){.    ch
18c40 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
18c50 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b  WCHAR zWidePath[
18c60 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f  MAX_PATH];.    o
18c70 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d 41  sGetTempPathW(MA
18c80 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64 65  X_PATH-30, zWide
18c90 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74  Path);.    zMult
18ca0 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  i = unicodeToUtf
18cb0 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  8(zWidePath);.  
18cc0 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a    if( zMulti ){.
18cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
18ce0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
18cf0 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
18d00 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
18d10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18d20 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65  (zMulti);.    }e
18d30 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18d40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
18d50 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
18d60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
18d70 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
18d80 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
18d90 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a  Utf8;.    char z
18da0 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54  MbcsPath[MAX_PAT
18db0 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d  H];.    osGetTem
18dc0 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d  pPathA(MAX_PATH-
18dd0 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a  30, zMbcsPath);.
18de0 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
18df0 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
18e00 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
18e10 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
18e20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18e30 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
18e40 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
18e50 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
18e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
18e70 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
18e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
18e90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18ea0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
18eb0 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
18ec0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
18ed0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
18ee0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
18ef0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
18f00 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
18f10 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
18f20 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
18f30 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
18f40 69 66 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c  if( (sqlite3Strl
18f50 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20  en30(zTempPath) 
18f60 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
18f70 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  0(SQLITE_TEMP_FI
18f80 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29  LE_PREFIX) + 18)
18f90 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20   >= nBuf ){.    
18fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
18fb0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ROR;.  }..  for(
18fc0 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  i=sqlite3Strlen3
18fd0 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e  0(zTempPath); i>
18fe0 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
18ff0 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
19000 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
19010 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
19020 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
19030 38 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  8, zBuf,.       
19040 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c              "%s\
19050 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  \"SQLITE_TEMP_FI
19060 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70  LE_PREFIX, zTemp
19070 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c  Path);.  j = sql
19080 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
19090 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
190a0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
190b0 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
190c0 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
190d0 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
190e0 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
190f0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
19100 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
19110 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
19120 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
19130 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20  ;.  zBuf[j+1] = 
19140 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
19150 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25  TEMP FILENAME: %
19160 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20  s\n", zBuf));.  
19170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19180 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ; .}../*.** Open
19190 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
191a0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
191b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
191c0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Vfs,        /* N
191d0 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
191e0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
191f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19200 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
19210 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
19220 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
19230 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
19240 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
19250 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
19260 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
19270 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
19280 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
19290 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
192a0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
192b0 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
192c0 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
192d0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
192e0 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65  no;.  DWORD dwDe
192f0 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
19300 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
19310 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
19320 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
19330 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
19340 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
19350 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
19360 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
19370 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
19380 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
19390 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
193a0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
193b0 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
193c0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
193d0 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
193e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
193f0 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
19400 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
19410 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
19420 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
19430 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
19440 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
19450 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
19460 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
19470 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
19480 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
19490 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
194a0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
194b0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
194c0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
194d0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d  name[MAX_PATH+2]
194e0 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ;     /* Buffer 
194f0 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74  used to create t
19500 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  emp filename */.
19510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
19530 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
19540 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
19550 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
19560 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
19570 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
19580 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
19590 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
195a0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
195b0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
195c0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
195d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
195e0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
195f0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
19600 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
19610 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
19620 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
19630 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
19640 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
19650 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e  EN_CREATE);.#ifn
19660 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
19670 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
19680 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
19690 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
196a0 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52  #endif.  int isR
196b0 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
196c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
196d0 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
196e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
196f0 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
19700 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
19710 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
19720 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
19730 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
19740 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
19750 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
19760 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
19770 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
19780 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
19790 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  f..  /* Check th
197a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
197b0 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
197c0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
197d0 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
197e0 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
197f0 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
19800 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
19810 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
19820 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
19830 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
19840 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
19850 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
19860 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
19870 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
19880 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
19890 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
198a0 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
198b0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
198c0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
198d0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
198e0 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
198f0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
19900 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
19910 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
19920 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
19930 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
19940 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
19950 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
19960 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
19970 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
19980 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
19990 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
199a0 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
199b0 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
199c0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
199d0 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
199e0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
199f0 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
19a00 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
19a10 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
19a20 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
19a30 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
19a40 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
19a50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
19a60 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
19a70 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
19a80 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
19a90 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
19aa0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
19ab0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
19ac0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
19ad0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19ae0 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
19af0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
19b00 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
19b10 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
19b20 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
19b30 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
19b40 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
19b50 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
19b60 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
19b70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
19b80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
19b90 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
19ba0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
19bb0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
19bc0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
19bd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
19be0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
19bf0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
19c00 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
19c10 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
19c20 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
19c30 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
19c40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19c50 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
19c60 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
19c70 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
19c80 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
19c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
19ca0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   );..  assert( i
19cb0 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  d!=0 );.  UNUSED
19cc0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
19cd0 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  ;..  pFile->h = 
19ce0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
19cf0 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ALUE;..  /* If t
19d00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19d10 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
19d20 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
19d30 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65  erate a .  ** te
19d40 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
19d50 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20  e to use .  */. 
19d60 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
19d70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
19d80 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
19d90 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  nJournal);.    r
19da0 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  c = getTempname(
19db0 4d 41 58 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70  MAX_PATH+2, zTmp
19dc0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
19dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19df0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
19e00 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
19e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62  .  }..  /* Datab
19e20 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
19e30 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
19e40 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
19e50 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52   are not.  ** UR
19e60 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
19e70 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
19e80 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
19e90 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
19ea0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
19eb0 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  meter()..  */.  
19ec0 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d  assert( (eType!=
19ed0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
19ee0 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26  _DB) || (flags &
19ef0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
19f00 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55 74  ) ||.        zUt
19f10 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55  f8Name[strlen(zU
19f20 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  tf8Name)+1]==0 )
19f30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
19f40 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  the filename to 
19f50 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64  the system encod
19f60 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65  ing. */.  zConve
19f70 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
19f80 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
19f90 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
19fa0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
19fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19fc0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
19fd0 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
19fe0 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
19ff0 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
1a000 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
1a010 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
1a020 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
1a030 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
1a040 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
1a050 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
1a060 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
1a070 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1a080 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  t a new file is 
1a090 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53  .  ** created. S
1a0a0 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73  QLite doesn't us
1a0b0 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65  e it to indicate
1a0c0 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65   "exclusive acce
1a0d0 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20  ss" .  ** as it 
1a0e0 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
1a0f0 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
1a100 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
1a110 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
1a120 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
1a130 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
1a140 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
1a150 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
1a160 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
1a170 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
1a180 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1a190 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
1a1a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
1a1b0 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
1a1c0 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
1a1d0 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
1a1e0 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
1a1f0 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
1a200 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
1a210 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
1a220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1a230 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
1a240 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
1a250 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1a260 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
1a270 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
1a280 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
1a290 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
1a2a0 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
1a2b0 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
1a2c0 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
1a2d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1a2e0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1a2f0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1a300 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
1a310 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
1a320 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
1a330 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1a340 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1a350 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
1a380 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
1a390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
1a3c0 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
1a3d0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1a3e0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1a3f0 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
1a400 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
1a410 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
1a420 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
1a430 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
1a440 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
1a450 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
1a460 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
1a470 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
1a480 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
1a490 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
1a4a0 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
1a4b0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
1a4c0 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1a4d0 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
1a4e0 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ..  if( isNT() )
1a4f0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1a500 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
1a510 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
1a520 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
1a530 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
1a540 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1a550 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
1a560 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
1a570 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
1a580 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
1a590 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
1a5a0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
1a5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
1a5c0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1a5d0 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
1a5e0 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
1a5f0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1a600 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
1a610 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1a620 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
1a630 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
1a640 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
1a650 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
1a660 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
1a670 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
1a680 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
1a690 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
1a6a0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
1a6b0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1a6c0 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
1a6d0 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
1a6e0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
1a6f0 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
1a700 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
1a730 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
1a760 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1a790 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
1a7c0 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
1a7d0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1a7e0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63     retryIoerr(&c
1a810 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1a820 29 7b 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  ){}.#else.    wh
1a830 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
1a840 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
1a850 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
1a880 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
1a8b0 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
1a8e0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1a8f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1a920 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
1a950 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1a960 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e    retryIoerr(&cn
1a990 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1a9a0 7b 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  {}.#endif.  }.#i
1a9b0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1a9c0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1a9d0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  e{.    while( (h
1a9e0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41   = osCreateFileA
1a9f0 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72  ((LPCSTR)zConver
1aa00 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1aa30 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e    dwShareMode, N
1aa60 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1aa90 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
1aac0 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
1aaf0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
1ab00 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49            retryI
1ab30 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1ab40 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 7d 0a 23  Errno) ){}.  }.#
1ab50 65 6e 64 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72  endif.  logIoerr
1ab60 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43  (cnt);..  OSTRAC
1ab70 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20 30  E(("OPEN %d %s 0
1ab80 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20  x%lx %s\n", .   
1ab90 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65          h, zName
1aba0 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  , dwDesiredAcces
1abb0 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68  s, .           h
1abc0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1abd0 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65 64  _VALUE ? "failed
1abe0 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69  " : "ok"));..  i
1abf0 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
1ac00 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
1ac10 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1ac20 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
1ac30 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
1ac40 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1ac50 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1ac60 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55  o, "winOpen", zU
1ac70 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  tf8Name);.    sq
1ac80 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1ac90 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20  erted);.    if( 
1aca0 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
1acb0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1acc0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f       return winO
1acd0 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  pen(pVfs, zName,
1ace0 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20   id, .          
1acf0 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
1ad00 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1ad10 26 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  &~(SQLITE_OPEN_C
1ad20 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  REATE|SQLITE_OPE
1ad30 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 20 70  N_READWRITE)), p
1ad40 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
1ad50 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1ad60 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1ad70 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
1ad80 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
1ad90 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
1ada0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
1adb0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
1adc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1add0 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
1ade0 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
1adf0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
1ae00 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
1ae10 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28  }.  }..  memset(
1ae20 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
1ae30 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  (*pFile));.  pFi
1ae40 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
1ae50 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
1ae60 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46  ile->h = h;.  pF
1ae70 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1ae80 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
1ae90 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  le->pVfs = pVfs;
1aea0 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d  .  pFile->pShm =
1aeb0 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61   0;.  pFile->zPa
1aec0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 66  th = zName;.  if
1aed0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
1aee0 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73  olean(zName, "ps
1aef0 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
1af00 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1af10 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1af20 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
1af30 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 0a 23  ILE_PSOW;.  }..#
1af40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1af50 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
1af60 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
1af70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1af80 44 42 0a 20 20 20 20 20 20 20 26 26 20 21 77 69  DB.       && !wi
1af90 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
1afa0 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b  ame, pFile).  ){
1afb0 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
1afc0 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  le(h);.    sqlit
1afd0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1afe0 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ed);.    return 
1aff0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1b000 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
1b010 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
1b020 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
1b030 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
1b040 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1b050 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1b060 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1b070 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f  );.  }..  OpenCo
1b080 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
1b090 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b0a0 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65   Delete the name
1b0b0 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  d file..**.** No
1b0c0 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20  te that Windows 
1b0d0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
1b0e0 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
1b0f0 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
1b100 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73  r.** process has
1b110 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74   it open.  Somet
1b120 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61  imes a virus sca
1b130 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67  nner or indexing
1b140 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c   program.** will
1b150 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
1b160 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74  file shortly aft
1b170 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64  er it is created
1b180 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a   in order to do.
1b190 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64  ** whatever it d
1b1a0 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
1b1b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1b1c0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
1b1d0 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
1b1e0 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
1b1f0 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
1b200 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
1b210 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
1b220 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
1b230 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
1b240 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
1b250 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
1b260 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
1b270 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
1b280 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
1b290 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
1b2a0 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
1b2b0 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
1b2c0 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20  nt winDelete(.  
1b2d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b2e0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s,          /* N
1b2f0 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
1b300 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b310 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
1b320 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1b330 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  e to delete */. 
1b340 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20   int syncDir    
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b360 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
1b370 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e  2 */.){.  int cn
1b380 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
1b390 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1b3a0 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
1b3b0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
1b3c0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1b3d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1b3e0 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a  ETER(syncDir);..
1b3f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b400 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
1b410 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
1b420 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
1b430 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
1b440 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1b450 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
1b460 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1b480 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 31  EM;.  }.  rc = 1
1b490 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
1b4a0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1b4b0 57 49 4e 52 54 0a 20 20 20 20 57 49 4e 33 32 5f  WINRT.    WIN32_
1b4c0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1b4d0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1b4e0 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1b4f0 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1b500 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1b510 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46 69 6c   while( osGetFil
1b520 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a  eAttributesExW(z
1b530 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69  Converted, GetFi
1b540 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
1b550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20      &sAttrData) 
1b580 26 26 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69  &&.#else.    whi
1b590 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  le( osGetFileAtt
1b5a0 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
1b5b0 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  ted)!=INVALID_FI
1b5c0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
1b5d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1b5e0 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46   (rc = osDeleteF
1b5f0 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileW(zConverted)
1b600 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65  )==0 && retryIoe
1b610 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1b620 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20  rno) ){}.    rc 
1b630 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  = rc ? SQLITE_OK
1b640 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
1b650 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1b660 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1b670 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68  I.  else{.    wh
1b680 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74  ile( osGetFileAt
1b690 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65  tributesA(zConve
1b6a0 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46  rted)!=INVALID_F
1b6b0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
1b6c0 26 0a 20 20 20 20 20 20 20 20 20 28 72 63 20 3d  &.         (rc =
1b6d0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a   osDeleteFileA(z
1b6e0 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26  Converted))==0 &
1b6f0 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e  & retryIoerr(&cn
1b700 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1b710 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f  {}.    rc = rc ?
1b720 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
1b730 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
1b740 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 29  endif.  if( rc )
1b750 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
1b760 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1b770 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74  ERR_DELETE, last
1b780 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1b790 20 20 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c      "winDelete",
1b7a0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d   zFilename);.  }
1b7b0 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65  else{.    logIoe
1b7c0 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  rr(cnt);.  }.  s
1b7d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1b7e0 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41  verted);.  OSTRA
1b7f0 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73  CE(("DELETE \"%s
1b800 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  \" %s\n", zFilen
1b810 61 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c  ame, (rc ? "fail
1b820 65 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a  ed" : "ok" )));.
1b830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b840 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
1b850 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74  existance and st
1b860 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a  atus of a file..
1b870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1b880 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  nAccess(.  sqlit
1b890 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
1b8a0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
1b8b0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
1b8c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1b8d0 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  ename,     /* Na
1b8e0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68  me of file to ch
1b8f0 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eck */.  int fla
1b900 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1b910 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
1b920 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74  est to make on t
1b930 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
1b940 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
1b950 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1b960 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20   Result */.){.  
1b970 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
1b980 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
1b990 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76  D lastErrno;.  v
1b9a0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
1b9b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b9c0 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69  TER(pVfs);..  Si
1b9d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1b9e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b9f0 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
1ba00 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1ba10 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1ba20 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
1ba30 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1ba40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1ba50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1ba60 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  M;.  }.  if( isN
1ba70 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
1ba80 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
1ba90 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
1baa0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
1bab0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
1bac0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
1bad0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
1bae0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
1baf0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1bb00 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
1bb10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
1bb40 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
1bb50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1bb70 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72  sAttrData)) && r
1bb80 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1bb90 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
1bba0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1bbb0 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51      /* For an SQ
1bbc0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1bbd0 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20  TS query, treat 
1bbe0 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69  a zero-length fi
1bbf0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  le.      ** as i
1bc00 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
1bc10 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
1bc20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73      if(    flags
1bc30 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
1bc40 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20  EXISTS.         
1bc50 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
1bc60 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a  ileSizeHigh==0 .
1bc70 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
1bc80 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
1bc90 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Low==0 ){.      
1bca0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
1bcb0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1bcc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bcd0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
1bce0 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
1bcf0 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
1bd00 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1bd10 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29     logIoerr(cnt)
1bd20 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
1bd30 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c  Errno!=ERROR_FIL
1bd40 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  E_NOT_FOUND ){. 
1bd50 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72         winLogErr
1bd60 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1bd70 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e  ACCESS, lastErrn
1bd80 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20  o, "winAccess", 
1bd90 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1bda0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1bdb0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1bdc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bdd0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1bde0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bdf0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
1be00 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1be10 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  BUTES;.      }. 
1be20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
1be30 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1be40 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1be50 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
1be60 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
1be70 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
1be80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
1be90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1bea0 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
1beb0 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
1bec0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1bed0 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
1bee0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1bef0 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
1bf00 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
1bf10 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1bf20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bf30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1bf40 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
1bf50 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
1bf60 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
1bf70 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
1bf80 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20            (attr 
1bf90 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
1bfa0 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20  _READONLY)==0;. 
1bfb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bfc0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
1bfd0 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
1bfe0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
1bff0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
1c000 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
1c010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1c020 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
1c030 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
1c040 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
1c050 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1c060 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a  verbatim.  If.**
1c070 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
1c080 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20  urned from this 
1c090 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61  function, the ca
1c0a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
1c0b0 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73  ust simply.** us
1c0c0 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70  e the provided p
1c0d0 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69  ath name verbati
1c0e0 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69  m -OR- resolve i
1c0f0 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  t into a full pa
1c100 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67  th name.** using
1c110 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68   the GetFullPath
1c120 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66  Name Win32 API f
1c130 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69  unction (if avai
1c140 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  lable)..*/.stati
1c150 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62  c BOOL winIsVerb
1c160 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20  atimPathname(.  
1c170 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1c180 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20  hname.){.  /*.  
1c190 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
1c1a0 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
1c1b0 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20  a forward slash 
1c1c0 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20  or a backslash, 
1c1d0 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a  it is either.  *
1c1e0 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61  * a legal UNC na
1c1f0 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c  me, a volume rel
1c200 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61  ative path, or a
1c210 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20  n absolute path 
1c220 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  name in the.  **
1c230 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f   "Unix" format o
1c240 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72  n Windows.  Ther
1c250 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79  e is no easy way
1c260 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
1c270 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  e between.  ** t
1c280 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73  he final two cas
1c290 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77  es; therefore, w
1c2a0 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66  e return the saf
1c2b0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
1c2c0 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20  of TRUE.  ** so 
1c2d0 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20  that callers of 
1c2e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
1c2f0 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74  ll simply use it
1c300 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a   verbatim..  */.
1c310 20 20 69 66 20 28 20 7a 50 61 74 68 6e 61 6d 65    if ( zPathname
1c320 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61 74  [0]=='/' || zPat
1c330 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29  hname[0]=='\\' )
1c340 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
1c350 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
1c360 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61  * If the path na
1c370 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
1c380 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f   letter and a co
1c390 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72  lon it is either
1c3a0 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72   a volume.  ** r
1c3b0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20  elative path or 
1c3c0 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
1c3d0 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68  .  Callers of th
1c3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
1c3f0 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70   not.  ** attemp
1c400 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73  t to treat it as
1c410 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1c420 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79   name (i.e. they
1c430 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75   should simply u
1c440 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61  se.  ** it verba
1c450 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  tim)..  */.  if 
1c460 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  ( sqlite3Isalpha
1c470 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26  (zPathname[0]) &
1c480 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d  & zPathname[1]==
1c490 27 3a 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ':' ){.    retur
1c4a0 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
1c4b0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74  *.  ** If we get
1c4c0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
1c4d0 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68  the path name sh
1c4e0 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74  ould almost cert
1c4f0 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c  ainly be a purel
1c500 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  y.  ** relative 
1c510 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20  one (i.e. not a 
1c520 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62  UNC name, not ab
1c530 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20  solute, and not 
1c540 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29  volume relative)
1c550 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1c560 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FALSE;.}../*.** 
1c570 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
1c580 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
1c590 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
1c5a0 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
1c5b0 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
1c5c0 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
1c5d0 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
1c5e0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1c5f0 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
1c600 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
1c610 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
1c620 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
1c630 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
1c640 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1c650 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
1c660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
1c670 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
1c680 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
1c690 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
1c6a0 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
1c6d0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
1c6e0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
1c6f0 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
1c700 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
1c710 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
1c720 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
1c730 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
1c740 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1c750 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
1c760 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1c770 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
1c780 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
1c790 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f 50 41  Pathname>=MAX_PA
1c7a0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
1c7b0 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
1c7c0 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
1c7d0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
1c7e0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
1c7f0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
1c800 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
1c810 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
1c820 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
1c830 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
1c840 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
1c850 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
1c860 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
1c870 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
1c880 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
1c890 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
1c8a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
1c8b0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
1c8c0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
1c8d0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
1c8e0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
1c8f0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
1c900 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
1c910 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
1c920 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
1c930 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 2b 31   zOut[MAX_PATH+1
1c940 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 4f  ];.    memset(zO
1c950 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b  ut, 0, MAX_PATH+
1c960 31 29 3b 0a 20 20 20 20 63 79 67 77 69 6e 5f 63  1);.    cygwin_c
1c970 6f 6e 76 5f 74 6f 5f 77 69 6e 33 32 5f 70 61 74  onv_to_win32_pat
1c980 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  h(zRelative, zOu
1c990 74 29 3b 20 2f 2a 20 50 4f 53 49 58 20 74 6f 20  t); /* POSIX to 
1c9a0 57 69 6e 33 32 20 2a 2f 0a 20 20 20 20 73 71 6c  Win32 */.    sql
1c9b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1c9c0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1c9d0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1c9e0 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20  l, "%s\\%s",.   
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
1ca10 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b  irectory, zOut);
1ca20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ca30 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68  .    ** NOTE: Th
1ca40 65 20 43 79 67 77 69 6e 20 64 6f 63 73 20 73 74  e Cygwin docs st
1ca50 61 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 78  ate that the max
1ca60 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6e 65 65 64  imum length need
1ca70 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
1ca80 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20 70  for the buffer p
1ca90 61 73 73 65 64 20 74 6f 20 63 79 67 77 69 6e 5f  assed to cygwin_
1caa0 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
1cab0 33 32 5f 70 61 74 68 0a 20 20 20 20 2a 2a 20 20  32_path.    **  
1cac0 20 20 20 20 20 69 73 20 4d 41 58 5f 50 41 54 48       is MAX_PATH
1cad0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 79 67  ..    */.    cyg
1cae0 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c  win_conv_to_full
1caf0 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c  _win32_path(zRel
1cb00 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20  ative, zFull);. 
1cb10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1cb20 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
1cb30 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
1cb40 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
1cb50 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69  _WINRT) && !defi
1cb60 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
1cb70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cb80 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1cb90 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57  _ERROR );.  /* W
1cba0 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63  inCE has no conc
1cbb0 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76  ept of a relativ
1cbc0 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73  e pathname, or s
1cbd0 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a  o I am told. */.
1cbe0 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e    /* WinRT has n
1cbf0 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74  o way to convert
1cc00 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1cc10 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   to an absolute 
1cc20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  one. */.  if ( s
1cc30 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
1cc40 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
1cc50 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
1cc60 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
1cc70 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
1cc80 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
1cc90 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
1cca0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
1ccb0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
1ccc0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
1ccd0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
1cce0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
1ccf0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
1cd00 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
1cd10 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
1cd20 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
1cd30 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
1cd40 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
1cd50 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
1cd60 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
1cd70 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
1cd80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1cd90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1cda0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1cdb0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1cdc0 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20  l, "%s\\%s",.   
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
1cdf0 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74  irectory, zRelat
1ce00 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ive);.  }else{. 
1ce10 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1ce20 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
1ce30 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
1ce40 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
1ce50 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20  Relative);.  }. 
1ce60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ce70 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  K;.#endif..#if !
1ce80 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1ce90 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
1cea0 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
1ceb0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e  __CYGWIN__).  in
1cec0 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  t nByte;.  void 
1ced0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63  *zConverted;.  c
1cee0 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a  har *zOut;..  /*
1cef0 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61   If this path na
1cf00 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
1cf10 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20  /X:", where "X" 
1cf20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69  is any alphabeti
1cf30 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  c.  ** character
1cf40 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e  , discard the in
1cf50 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74  itial "/" from t
1cf60 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a  he pathname..  *
1cf70 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  /.  if( zRelativ
1cf80 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c  e[0]=='/' && sql
1cf90 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c  ite3Isalpha(zRel
1cfa0 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65  ative[1]) && zRe
1cfb0 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29  lative[2]==':' )
1cfc0 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b  {.    zRelative+
1cfd0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27  +;.  }..  /* It'
1cfe0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
1cff0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
1d000 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
1d010 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
1d020 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
1d030 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
1d040 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
1d050 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
1d060 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1d070 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
1d080 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
1d090 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
1d0a0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
1d0b0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
1d0c0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
1d0d0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
1d0e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d0f0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1d100 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28  _ERROR );.  if (
1d110 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
1d120 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
1d130 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
1d140 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
1d150 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
1d160 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
1d170 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
1d180 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
1d190 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
1d1a0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
1d1b0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
1d1c0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
1d1d0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
1d1e0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
1d1f0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
1d200 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1d210 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
1d220 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
1d230 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
1d240 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1d250 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
1d260 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
1d270 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d280 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
1d290 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
1d2a0 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20  ull, "%s\\%s",. 
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
1d2d0 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c  _directory, zRel
1d2e0 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75  ative);.    retu
1d2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d300 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  }.  zConverted =
1d310 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1d320 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
1d330 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1d340 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1d350 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d360 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
1d370 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c   isNT() ){.    L
1d380 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
1d390 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
1d3a0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
1d3b0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1d3c0 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
1d3d0 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
1d3e0 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
1d3f0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
1d400 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
1d410 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
1d420 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1d430 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
1d440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d450 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
1d460 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74      osGetFullPat
1d470 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
1d480 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
1d490 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
1d4a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d4b0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1d4c0 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
1d4d0 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Utf8(zTemp);.   
1d4e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
1d4f0 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  emp);.  }.#ifdef
1d500 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
1d510 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
1d520 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a     char *zTemp;.
1d530 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
1d540 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
1d550 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1d560 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a  , 0, 0, 0) + 3;.
1d570 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
1d580 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
1d590 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
1d5a0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
1d5b0 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
1d5c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1d5d0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
1d5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d5f0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
1d600 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61  .    osGetFullPa
1d610 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
1d620 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
1d630 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
1d640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1d650 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
1d660 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
1d670 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
1d680 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
1d690 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
1d6a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
1d6b0 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73  f( zOut ){.    s
1d6c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d6d0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
1d6e0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
1d6f0 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  ull, "%s", zOut)
1d700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1d710 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
1d720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1d740 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d750 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
1d760 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  if.}..#ifndef SQ
1d770 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1d780 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
1d790 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
1d7a0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
1d7b0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
1d7c0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
1d7d0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
1d7e0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
1d7f0 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
1d800 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a  d library..*/./*
1d810 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
1d820 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
1d830 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
1d840 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
1d850 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
1d860 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1d870 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
1d880 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
1d890 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
1d8a0 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  winDlOpen(sqlite
1d8b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
1d8c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1d8d0 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  me){.  HANDLE h;
1d8e0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1d8f0 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1d900 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
1d910 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
1d920 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1d930 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1d940 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1d950 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  n 0;.  }.  if( i
1d960 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
1d970 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1d980 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
1d990 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
1d9a0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
1d9b0 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
1d9c0 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
1d9d0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1d9e0 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1d9f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1da00 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1da10 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
1da20 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
1da30 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
1da40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
1da50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1da60 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
1da70 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
1da80 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
1da90 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
1daa0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
1dab0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
1dac0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1dad0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
1dae0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
1daf0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
1db00 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
1db10 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
1db20 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
1db30 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
1db40 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
1db50 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29   char *zSymbol))
1db60 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44  (void){.  UNUSED
1db70 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1db80 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
1db90 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50  (*)(void))osGetP
1dba0 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
1dbb0 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79  DLE)pHandle, zSy
1dbc0 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  mbol);.}.static 
1dbd0 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
1dbe0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1dbf0 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
1dc00 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1dc10 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
1dc20 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
1dc30 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d  NDLE)pHandle);.}
1dc40 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
1dc50 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1dc60 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
1dc70 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
1dc80 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20   winDlOpen  0.  
1dc90 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72  #define winDlErr
1dca0 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  or 0.  #define w
1dcb0 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  inDlSym   0.  #d
1dcc0 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65  efine winDlClose
1dcd0 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1dce0 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42  * Write up to nB
1dcf0 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
1dd00 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66  omness into zBuf
1dd10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dd20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  winRandomness(sq
1dd30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1dd40 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1dd50 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20  *zBuf){.  int n 
1dd60 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
1dd70 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
1dd80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1dd90 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42  E_TEST).  n = nB
1dda0 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  uf;.  memset(zBu
1ddb0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c  f, 0, nBuf);.#el
1ddc0 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
1ddd0 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75  SYSTEMTIME)<=nBu
1dde0 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45  f-n ){.    SYSTE
1ddf0 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47  MTIME x;.    osG
1de00 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
1de10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1de20 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f  uf[n], &x, sizeo
1de30 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(x));.    n += 
1de40 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20  sizeof(x);.  }. 
1de50 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
1de60 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
1de70 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73    DWORD pid = os
1de80 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1de90 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  sId();.    memcp
1dea0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64  y(&zBuf[n], &pid
1deb0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
1dec0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
1ded0 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pid);.  }.#if SQ
1dee0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1def0 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47  if( sizeof(ULONG
1df00 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  LONG)<=nBuf-n ){
1df10 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63  .    ULONGLONG c
1df20 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
1df30 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d  unt64();.    mem
1df40 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
1df50 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
1df60 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1df70 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73  f(cnt);.  }.#els
1df80 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  e.  if( sizeof(D
1df90 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
1dfa0 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
1dfb0 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   osGetTickCount(
1dfc0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
1dfd0 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
1dfe0 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
1dff0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
1e000 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
1e010 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  f( sizeof(LARGE_
1e020 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e  INTEGER)<=nBuf-n
1e030 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e   ){.    LARGE_IN
1e040 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51  TEGER i;.    osQ
1e050 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
1e060 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
1e070 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1e080 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
1e090 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1e0a0 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
1e0b0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
1e0c0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1e0d0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1e0e0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1e0f0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1e100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e110 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
1e120 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1e130 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c  microsec){.  sql
1e140 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
1e150 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
1e160 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f  1000);.  UNUSED_
1e170 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1e180 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72  .  return ((micr
1e190 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a  osec+999)/1000)*
1e1a0 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  1000;.}../*.** T
1e1b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1e1c0 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
1e1d0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
1e1e0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
1e1f0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
1e200 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
1e210 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
1e220 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
1e230 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
1e240 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
1e250 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
1e260 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
1e270 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
1e280 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1e290 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
1e2a0 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
1e2b0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
1e2c0 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
1e2d0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
1e2e0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
1e2f0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
1e300 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
1e310 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
1e320 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
1e330 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
1e340 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
1e350 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
1e360 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
1e370 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
1e380 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
1e390 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
1e3a0 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
1e3b0 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
1e3c0 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
1e3d0 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
1e3e0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
1e3f0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
1e400 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
1e410 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
1e420 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
1e430 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1e440 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
1e450 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
1e460 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a  time and date .*
1e470 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
1e480 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e490 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
1e4a0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
1e4b0 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
1e4c0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
1e4d0 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
1e4e0 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
1e4f0 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
1e500 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
1e510 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
1e520 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
1e530 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
1e540 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
1e550 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
1e560 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
1e570 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1e580 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e  qlite3_int64 win
1e590 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20  FiletimeEpoch = 
1e5a0 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65  23058135*(sqlite
1e5b0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
1e5c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1e5d0 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EST.  static con
1e5e0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
1e5f0 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
1e600 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
1e610 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65  nt64)8640000;.#e
1e620 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d  ndif.  /* 2^32 -
1e630 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66   to avoid use of
1e640 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73   LL and warnings
1e650 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61   in gcc */.  sta
1e660 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1e670 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74  3_int64 max32Bit
1e680 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28  Value = .      (
1e690 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
1e6a0 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
1e6b0 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
1e6c0 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
1e6d0 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
1e6e0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1e6f0 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
1e700 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74  ME time;.  osGet
1e710 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65  SystemTime(&time
1e720 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65  );.  /* if Syste
1e730 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
1e740 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75  ) fails, it retu
1e750 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  rns zero. */.  i
1e760 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65  f (!osSystemTime
1e770 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
1e780 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75  ,&ft)){.    retu
1e790 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1e7a0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47  .  }.#else.  osG
1e7b0 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
1e7c0 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23  leTime( &ft );.#
1e7d0 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20  endif..  *piNow 
1e7e0 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  = winFiletimeEpo
1e7f0 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ch +.           
1e800 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   ((((sqlite3_int
1e810 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65  64)ft.dwHighDate
1e820 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61  Time)*max32BitVa
1e830 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20  lue) + .        
1e840 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1e850 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
1e860 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
1e870 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
1e880 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1e890 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
1e8a0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
1e8b0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
1e8c0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
1e8d0 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
1e8e0 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
1e8f0 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
1e900 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e910 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1e920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e930 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
1e940 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
1e950 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
1e960 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
1e970 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
1e980 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
1e990 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
1e9a0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
1e9b0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
1e9c0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
1e9d0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
1e9e0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
1e9f0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
1ea00 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
1ea10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1ea20 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
1ea30 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
1ea40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
1ea50 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
1ea60 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
1ea70 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
1ea80 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
1ea90 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
1eaa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1eab0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
1eac0 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
1ead0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
1eae0 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
1eaf0 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
1eb00 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
1eb10 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
1eb20 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
1eb30 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
1eb40 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
1eb50 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
1eb60 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
1eb70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
1eb80 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
1eb90 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
1eba0 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
1ebb0 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
1ebc0 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
1ebd0 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
1ebe0 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
1ebf0 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
1ec00 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
1ec10 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
1ec20 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
1ec30 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
1ec40 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
1ec50 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
1ec60 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
1ec70 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
1ec80 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1ec90 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
1eca0 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
1ecb0 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
1ecc0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1ecd0 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
1ece0 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
1ecf0 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
1ed00 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
1ed10 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
1ed20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
1ed30 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1ed40 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
1ed50 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
1ed60 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
1ed70 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
1ed80 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
1ed90 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
1eda0 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
1edb0 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
1edc0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
1edd0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
1ede0 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
1edf0 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
1ee00 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
1ee10 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
1ee20 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
1ee30 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
1ee40 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
1ee50 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
1ee60 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1ee70 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
1ee80 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
1ee90 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1eea0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1eeb0 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
1eec0 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
1eed0 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
1eee0 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
1eef0 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
1ef00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1ef10 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
1ef20 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
1ef30 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
1ef40 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
1ef50 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
1ef60 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
1ef70 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
1ef80 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
1ef90 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
1efa0 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
1efb0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
1efc0 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
1efd0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
1efe0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
1eff0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
1f000 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1f010 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
1f020 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
1f030 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1f040 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a   nBuf, zBuf);.}.
1f050 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1f060 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
1f070 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
1f080 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
1f090 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1f0a0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
1f0b0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
1f0c0 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
1f0d0 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
1f0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1f0f0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
1f100 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
1f110 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
1f120 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
1f130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
1f140 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
1f150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f160 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
1f170 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
1f180 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
1f190 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1b0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
1f1c0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
1f1d0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
1f1e0 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
1f1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1f200 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
1f210 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
1f220 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
1f230 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
1f240 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
1f250 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
1f260 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
1f270 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
1f280 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
1f290 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
1f2a0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
1f2b0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
1f2c0 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
1f2d0 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
1f2e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
1f2f0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
1f300 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
1f310 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
1f320 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
1f330 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1f340 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
1f350 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
1f360 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
1f370 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
1f380 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
1f390 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
1f3a0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
1f3b0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
1f3c0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
1f3d0 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
1f3e0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
1f3f0 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
1f400 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
1f410 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
1f420 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
1f430 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
1f440 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
1f450 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
1f460 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c    };..  /* Doubl
1f470 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
1f480 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
1f490 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
1f4a0 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
1f4b0 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
1f4c0 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
1f4d0 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
1f4e0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
1f4f0 79 73 63 61 6c 6c 29 3d 3d 37 31 20 29 3b 0a 0a  yscall)==71 );..
1f500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f510 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74  MIT_WAL.  /* get
1f520 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
1f530 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
1f540 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
1f550 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
1f560 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
1f570 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
1f580 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
1f590 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
1f5a0 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
1f5b0 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
1f5c0 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
1f5d0 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
1f5e0 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e  sert(winSysInfo.
1f5f0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
1f600 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65  ularity > 0);.#e
1f610 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
1f620 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
1f630 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75  nVfs, 1);.  retu
1f640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
1f650 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
1f660 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
1f670 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1f680 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 20  .  if( sleepObj 
1f690 21 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  != NULL ){.    o
1f6a0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
1f6b0 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
1f6c0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
1f6d0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1f6e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1f6f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f700 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.