/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 370c6f3399e3cd9f14343fb7dc4b2bbe8619d3bf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d  mmon.h"../*.** M
02a0: 61 63 72 6f 20 74 6f 20 66 69 6e 64 20 74 68 65  acro to find the
02b0: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74 77 6f 20   minimum of two 
02c0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e 0a  numeric values..
02d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23  */.#ifndef MIN.#
02e0: 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29   define MIN(x,y)
02f0: 20 28 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79   ((x)<(y)?(x):(y
0300: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0310: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
0320: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
0330: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
0340: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
0350: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
0360: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
0370: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
0380: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
0390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
03a0: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
03b0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
03c0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
03d0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
03e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
03f0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0400: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
0410: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
0420: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
0430: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
0440: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
0450: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0460: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0480: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
0490: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
04a0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
04b0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
04c0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
04d0: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
04e0: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43  y */../*.** WinC
04f0: 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73  E lacks native s
0500: 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20  upport for file 
0510: 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61  locking so we ha
0520: 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a  ve to fake it.**
0530: 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20   with some code 
0540: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23  of our own..*/.#
0550: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
0560: 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  CE.typedef struc
0570: 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20  t winceLock {.  
0580: 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20  int nReaders;   
0590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
05a0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62   reader locks ob
05b0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
05c0: 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   bPending;      
05d0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70  /* Indicates a p
05e0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
05f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0600: 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65  .  BOOL bReserve
0610: 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  d;     /* Indica
0620: 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  tes a reserved l
0630: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0640: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0650: 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f  bExclusive;    /
0660: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65  * Indicates an e
0670: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61  xclusive lock ha
0680: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0690: 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a  */.} winceLock;.
06a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
06b0: 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74  e winFile struct
06c0: 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73  ure is a subclas
06d0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
06e0: 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  e* specific to t
06f0: 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74  he win32.** port
0700: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
0710: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0720: 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65   winFile winFile
0730: 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  ;.struct winFile
0740: 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74   {.  const sqlit
0750: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
0760: 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73  Method; /*** Mus
0770: 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a  t be first ***/.
0780: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0790: 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Vfs;      /* The
07a0: 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65   VFS used to ope
07b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
07c0: 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
07d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
07e0: 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  le for accessing
07f0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
0800: 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  8 locktype;     
0810: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
0820: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
0830: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69   held on this fi
0840: 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68  le */.  short sh
0850: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20  aredLockByte;   
0860: 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73  /* Randomly chos
0870: 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20  en byte used as 
0880: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  a shared lock */
0890: 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b  .  u8 ctrlFlags;
08a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
08b0: 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c  ags.  See WINFIL
08c0: 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44  E_* below */.  D
08d0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
08e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
08f0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
0900: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0910: 72 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ror */.  winShm 
0920: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
0930: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
0940: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
0950: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
0960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
0970: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
0980: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
0990: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
09a0: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
09b0: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
09c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
09d0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
09e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
09f0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
0a00: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
0a10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
0a20: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
0a30: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
0a40: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
0a50: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
0a60: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
0a70: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
0a80: 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c  ock */  .  HANDL
0a90: 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20  E hShared;      
0aa0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
0ab0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64  ory segment used
0ac0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a   for locking */.
0ad0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61    winceLock loca
0ae0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63  l;        /* Loc
0af0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74  ks obtained by t
0b00: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
0b10: 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  winFile */.  win
0b20: 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20  ceLock *shared; 
0b30: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
0b40: 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72  hared lock memor
0b50: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20  y for the file  
0b60: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
0b70: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0b80: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
0b90: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
0ba0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
0bb0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
0bc0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
0bd0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
0be0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
0bf0: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
0c00: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
0c10: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
0c20: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
0c30: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
0c40: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
0c50: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
0c60: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
0c70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0c80: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
0c90: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
0cb0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
0cc0: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
0cd0: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
0ce0: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
0cf0: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
0d00: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
0d10: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
0d20: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
0d30: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
0d40: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
0d50: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
0d60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
0d70: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
0d80: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
0d90: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
0da0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
0db0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
0dc0: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
0dd0: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
0de0: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
0df0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
0e00: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
0e10: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
0e20: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
0e30: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
0e40: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
0e50: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
0e60: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
0e70: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
0e80: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
0e90: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
0ea0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
0eb0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f00: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
0f10: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
0f20: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
0f30: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
0f40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
0f50: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
0f60: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
0f70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
0f80: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
0f90: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
0fa0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
0fb0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
0fc0: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
0fd0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
0fe0: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
0ff0: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
1000: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
1010: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
1020: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
1030: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
1040: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
1050: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
1060: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
1070: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
1080: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
10e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f0: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
1100: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1110: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
1120: 45 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23  EATE    (TRUE).#
1130: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1140: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
1150: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1160: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1170: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1180: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
1190: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
11a0: 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65  _INIT_SIZE.#  de
11b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
11c0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
11d0: 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   ((SQLITE_DEFAUL
11e0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20  T_CACHE_SIZE) * 
11f0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
1220: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1230: 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23  ZE) + 4194304).#
1240: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1250: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
1260: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1270: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1280: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1290: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
12a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
12b0: 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66  _MAX_SIZE.#  def
12c0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
12d0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20  _HEAP_MAX_SIZE  
12e0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (0).#endif../*. 
12f0: 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67  * The extra flag
1300: 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c  s to use in call
1310: 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68  s to the Win32 h
1320: 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20  eap APIs.  This 
1330: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20  value may be. * 
1340: 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66  zero for the def
1350: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20  ault behavior.. 
1360: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1370: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
1380: 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  GS.#  define SQL
1390: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
13a0: 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e  LAGS     (0).#en
13b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  dif../*.** The w
13c0: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
13d0: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
13e0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
13f0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
1400: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
1410: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
1420: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
1430: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1440: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
1450: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
1460: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
1470: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
1480: 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69  agic;    /* Magi
1490: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
14a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
14b0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
14c0: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
14d0: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
14e0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
14f0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
1500: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
1510: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
1520: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
1530: 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  own)? */.};..#if
1540: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
1550: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
1560: 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a       0x42b2830b.
1570: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73  #endif..static s
1580: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
1590: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20   win_mem_data = 
15a0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
15b0: 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c  .  WINMEM_MAGIC,
15c0: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
15d0: 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65  FALSE.};..#ifnde
15e0: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
15f0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
1600: 69 63 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  ic() assert( win
1610: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d  _mem_data.magic=
1620: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a  =WINMEM_MAGIC ).
1630: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
1640: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
1650: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
1660: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
1670: 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68  ) win_mem_data.h
1680: 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69  Heap..static voi
1690: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
16a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
16b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
16c0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
16d0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
16e0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
16f0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
1700: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
1710: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
1720: 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20  oid *p);.static 
1730: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
1740: 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63  p(int n);.static
1750: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
1760: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
1770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1780: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
1790: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f   *pAppData);..co
17a0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
17b0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
17c0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
17d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
17f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1800: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1810: 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20  e is (normally) 
1820: 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76  set once and nev
1830: 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  er changes.** th
1840: 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65  ereafter.  It re
1850: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68  cords whether th
1860: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1870: 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f  em is Win9x.** o
1880: 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30  r WinNT..**.** 0
1890: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
18a0: 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  stem unknown..**
18b0: 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   1:   Operating 
18c0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e  system is Win9x.
18d0: 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69  .** 2:   Operati
18e0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
18f0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  NT..**.** In ord
1900: 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  er to facilitate
1910: 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69   testing on a Wi
1920: 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20  nNT system, the 
1930: 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20  test fixture.** 
1940: 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74  can manually set
1950: 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31   this value to 1
1960: 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39   to emulate Win9
1970: 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23  8 behavior..*/.#
1980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1990: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  T.int sqlite3_os
19a0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65  _type = 0;.#else
19b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
19c0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
19d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
19e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
19f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1a00: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
1a10: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1a20: 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  I.#endif..#if SQ
1a30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1a40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54   SQLITE_OS_WINNT
1a50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
1a60: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1a70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1a80: 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  IDE.#endif..#ifn
1a90: 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64  def SYSCALL.#  d
1aa0: 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71  efine SYSCALL sq
1ab0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
1ac0: 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  r.#endif../*.** 
1ad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ae0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
1af0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20  n Windows CE or 
1b00: 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20  WinRT.. */..#if 
1b10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1b20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1b30: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41  RT.#  define osA
1b40: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
1b50: 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a         1.#endif.
1b60: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
1b70: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
1b80: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
1b90: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
1ba0: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
1bb0: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
1bc0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
1bd0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
1be0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
1bf0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
1c00: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
1c10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1c20: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
1c30: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
1c40: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
1c50: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
1c60: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
1c70: 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63   struct win_sysc
1c80: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
1c90: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
1ca0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1cb0: 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20   the sytem call 
1cc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
1cd0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
1ce0: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
1cf0: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
1d00: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
1d10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
1d20: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
1d30: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
1d40: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
1d50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1d60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
1d70: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
1d80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1da0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
1db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1dc0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1dd0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1e10: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
1e20: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
1e30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1e40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1e50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1e60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1e70: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
1e80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1e90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ea0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1eb0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
1ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
1ed0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
1ee0: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
1ef0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
1f00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1f10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1f20: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1f40: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
1f50: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
1f60: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
1f70: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
1f80: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
1f90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fa0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
1fb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1fc0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
1fd0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
1fe0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
1ff0: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
2000: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2010: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
2020: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2030: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2060: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
2070: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
2080: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
2090: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
20a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
20b0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
20c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
20d0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
20e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
20f0: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
2100: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
2110: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
2120: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2140: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2150: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
2160: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
2170: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2180: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
2190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
21a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
21b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
21c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21f0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2200: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
2210: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
2220: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
2230: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
2240: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
2250: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
2260: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
2270: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
2280: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2290: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
22a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
22b0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
22d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
22e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
22f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
2300: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
2310: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2320: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2330: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2340: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2350: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
2360: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2370: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
2380: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
2390: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
23a0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
23b0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
23c0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
23d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23e0: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
23f0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2400: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2410: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
2420: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
2430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
2440: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2450: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
2460: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2470: 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20  FileMappingW,   
2480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2490: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
24a0: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
24b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
24d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
24e0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
24f0: 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c  MappingW ((HANDL
2500: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
2510: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
2520: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
2530: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
2540: 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53  WORD,LPCWSTR))aS
2550: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
2560: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
2570: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
2580: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2590: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
25a0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
25b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
25c0: 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57  ALL)CreateMutexW
25d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
25e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
25f0: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
2600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2630: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2640: 43 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48  CreateMutexW ((H
2650: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2660: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
2670: 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20  UTES,BOOL, \.   
2680: 20 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53       LPCWSTR))aS
2690: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
26a0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
26b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
26c0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c  S_ANSI).  { "Del
26d0: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
26e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
26f0: 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20  DeleteFileA,    
2700: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2710: 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  lse.  { "DeleteF
2720: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
2730: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2760: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65  ..#define osDele
2770: 74 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57  teFileA ((BOOL(W
2780: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
2790: 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72  aSyscall[8].pCur
27a0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
27b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
27c0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44  HAS_WIDE).  { "D
27d0: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
27e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
27f0: 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20  L)DeleteFileW,  
2800: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2810: 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74  #else.  { "Delet
2820: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2830: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2860: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65  if..#define osDe
2870: 6c 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c  leteFileW ((BOOL
2880: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
2890: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
28a0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
28b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
28c0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
28d0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
28e0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
28f0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
2900: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
2910: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2920: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
2930: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2950: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2960: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
2970: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
2980: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2990: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
29a0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
29b0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
29c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
29d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
29e0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
29f0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
2a00: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
2a10: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
2a20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
2a30: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2a40: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
2a50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2a70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2a80: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
2a90: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
2aa0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
2ab0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
2ac0: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
2ad0: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
2ae0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
2af0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
2b00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2b10: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
2b20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2b30: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
2b40: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
2b50: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
2b60: 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43  )aSyscall[12].pC
2b70: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2b80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2b90: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2ba0: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2bb0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2bc0: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
2bd0: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
2be0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
2bf0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
2c00: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2c10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2c30: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2c40: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
2c50: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2c60: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
2c70: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
2c80: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
2c90: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
2ca0: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
2cb0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2cc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2cd0: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
2ce0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
2cf0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
2d00: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
2d10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2d20: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
2d30: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
2d40: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2d70: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
2d80: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
2d90: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
2da0: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
2db0: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
2dc0: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
2dd0: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
2de0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
2df0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2e10: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
2e20: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
2e30: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
2e40: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
2e50: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
2e60: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  LE))aSyscall[15]
2e70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e80: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
2e90: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
2ea0: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
2eb0: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
2ec0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
2ed0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2ee0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
2ef0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
2f00: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
2f10: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2f20: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2f30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2f40: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
2f50: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2f60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
2f70: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2f80: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
2f90: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
2fa0: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
2fb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2fe0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
2ff0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
3000: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3010: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
3020: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
3030: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
3040: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3050: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3060: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3070: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3080: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3090: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
30a0: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
30b0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
30c0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
30d0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
30e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
30f0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3100: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
3110: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3140: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
3150: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
3160: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
3170: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3180: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
3190: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
31a0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
31b0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
31c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
31d0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
31e0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
31f0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3200: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3210: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
3220: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
3230: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
3240: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3270: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3280: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
3290: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
32a0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
32b0: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
32c0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
32d0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
32e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
32f0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
3300: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3310: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3320: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3330: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
3340: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3350: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
3360: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3390: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
33a0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
33b0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
33c0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
33d0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
33e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
33f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3400: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
3410: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3420: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
3430: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
3440: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3450: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3460: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
3470: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34a0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
34b0: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
34c0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
34d0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
34e0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
34f0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
3500: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3510: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3520: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
3530: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
3540: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3550: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3570: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
3580: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
3590: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
35a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
35c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
35d0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
35e0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
35f0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
3600: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
3610: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3620: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
3630: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3640: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3650: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
3660: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3670: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
3680: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
3690: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
36a0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
36b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
36c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
36e0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
36f0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
3700: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3710: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
3720: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
3730: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
3740: 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  23].pCurrent)..#
3750: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3760: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3770: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3780: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3790: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
37a0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
37b0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
37c0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
37d0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
37e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
37f0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
3800: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3830: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3840: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
3850: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3860: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
3870: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
3880: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
3890: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
38a0: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
38b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
38c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
38d0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
38e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
38f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
3900: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3910: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
3920: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
3930: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3940: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
3950: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
3960: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
3970: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
3980: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
3990: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
39a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
39b0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
39c0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
39d0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
39e0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
39f0: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
3a00: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
3a10: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
3a20: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
3a30: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
3a40: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
3a50: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
3a60: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
3a70: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
3a80: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
3a90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3aa0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
3ab0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
3ac0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
3ad0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
3ae0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
3af0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3b00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3b10: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
3b20: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3b30: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
3b40: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
3b50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3b60: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
3b70: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
3b80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3bb0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
3bc0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
3bd0: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
3be0: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  FO))aSyscall[27]
3bf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3c00: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
3c10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3c20: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
3c30: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
3c40: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
3c50: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
3c60: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
3c70: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
3c80: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
3c90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3ca0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
3cb0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3cc0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
3cd0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
3ce0: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
3cf0: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
3d00: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
3d10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3d40: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
3d50: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
3d60: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
3d70: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
3d80: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
3d90: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
3da0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3db0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3dc0: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
3dd0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
3de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
3df0: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
3e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3e10: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
3e20: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
3e30: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3e60: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
3e70: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
3e80: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
3e90: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e  R))aSyscall[30].
3ea0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3eb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3ec0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3ed0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3ee0: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
3ef0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3f00: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
3f10: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
3f20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f30: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
3f40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3f50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3f80: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
3f90: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
3fa0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
3fb0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
3fc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3fd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3fe0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
3ff0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4000: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
4010: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
4020: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4030: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
4040: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4050: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4060: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4070: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4080: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
4090: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
40a0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
40b0: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
40c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
40d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
40e0: 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  ).  { "GetVersio
40f0: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
4100: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
4110: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
4120: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4130: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
4140: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4150: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4170: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4180: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
4190: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
41a0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
41b0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
41c0: 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43  )aSyscall[33].pC
41d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
41e0: 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  apAlloc",       
41f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4200: 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20  )HeapAlloc,     
4210: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4220: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c  #define osHeapAl
4230: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
4240: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4250: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
4260: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
4270: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4280: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4290: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  RT.  { "HeapCrea
42a0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
42b0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
42c0: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
42d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
42e0: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4300: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4330: 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74  fine osHeapCreat
4340: 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  e ((HANDLE(WINAP
4350: 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54  I*)(DWORD,SIZE_T
4360: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4370: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  _T))aSyscall[35]
4380: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4390: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
43a0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
43b0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
43c0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73  (SYSCALL)HeapDes
43d0: 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20  troy,           
43e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
43f0: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
4400: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4410: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4430: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4440: 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ne osHeapDestroy
4450: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4460: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
4470: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
4480: 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c  .  { "HeapFree",
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65  (SYSCALL)HeapFre
44b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
44c0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
44d0: 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f  osHeapFree ((BOO
44e0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
44f0: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29  E,DWORD,LPVOID))
4500: 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75  aSyscall[37].pCu
4510: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
4520: 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  pReAlloc",      
4530: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4540: 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20  HeapReAlloc,    
4550: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4560: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41  define osHeapReA
4570: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
4580: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4590: 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20  ORD,LPVOID, \.  
45a0: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
45b0: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
45c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53  ent)..  { "HeapS
45d0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
45e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
45f0: 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  apSize,         
4600: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4610: 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20  fine osHeapSize 
4620: 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a  ((SIZE_T(WINAPI*
4630: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
4640: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
4650: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  D))aSyscall[39].
4660: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4680: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
4690: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
46a0: 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69  SYSCALL)HeapVali
46b0: 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
46c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
46d0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
46e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
46f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4720: 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  e osHeapValidate
4730: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4740: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
4750: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
4760: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
4770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4790: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
47a0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
47c0: 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79  CALL)LoadLibrary
47d0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  A,            0 
47e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
47f0: 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20  adLibraryA",    
4800: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4840: 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28  sLoadLibraryA ((
4850: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
4860: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
4870: 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[41].pCurrent).
4880: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4890: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
48a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
48b0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61  S_WIDE).  { "Loa
48c0: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
48d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
48e0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
48f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4900: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
4910: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
4920: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4950: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
4960: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
4970: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
4980: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32  STR))aSyscall[42
4990: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
49a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
49b0: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
49c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
49d0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
49e0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
49f0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4a00: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4a20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4a40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4a50: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
4a60: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
4a70: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
4a80: 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[43].pCurrent)
4a90: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4aa0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
4ab0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4ac0: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
4ad0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4ae0: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
4b10: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
4b20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b50: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
4b60: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
4b70: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
4b80: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4b90: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4ba0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
4bb0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
4bc0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  4].pCurrent).#en
4bd0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
4be0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
4bf0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4c00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c10: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
4c20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c30: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
4c40: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
4c50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c80: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
4c90: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
4ca0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
4cb0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4cc0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4cd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
4ce0: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
4cf0: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
4d00: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
4d10: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
4d20: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
4d30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4d40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4d50: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
4d60: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
4d70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4d80: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
4d90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
4da0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
4db0: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
4dc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4dd0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4de0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4df0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4e00: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
4e10: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
4e20: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
4e30: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
4e40: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
4e50: 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e  call[46].pCurren
4e60: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
4e70: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
4e80: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
4e90: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
4ea0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4eb0: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
4ec0: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
4ed0: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
4ee0: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
4ef0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4f00: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  int))aSyscall[47
4f10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4f20: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
4f30: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
4f40: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
4f50: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
4f60: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
4f70: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
4f80: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
4f90: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
4fa0: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
4fb0: 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43  )aSyscall[48].pC
4fc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
4fd0: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
4fe0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4ff0: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
5000: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5010: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
5020: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5030: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
5040: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
5050: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
5060: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
5070: 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [49].pCurrent)..
5080: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
5090: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
50a0: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
50b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
50c0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
50d0: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
50e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
50f0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
5100: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
5110: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5120: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
5130: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
5140: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
5150: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
5160: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5170: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
5180: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
5190: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
51c0: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
51d0: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
51e0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
51f0: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
5200: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
5210: 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74  all[51].pCurrent
5220: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5230: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65  S_WINRT.  { "Sle
5240: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
5250: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5260: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
5270: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5280: 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  lse.  { "Sleep",
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
52d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65  ..#define osSlee
52e0: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
52f0: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
5300: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
5310: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
5320: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
5330: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
5340: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
5350: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5360: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
5370: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
5380: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
5390: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
53a0: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
53b0: 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75  aSyscall[53].pCu
53c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
53d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
53e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
53f0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
5400: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5410: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
5420: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
5430: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5440: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5460: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5480: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
5490: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
54a0: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
54b0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
54c0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
54d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
54e0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
54f0: 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75  aSyscall[54].pCu
5500: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
5510: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5520: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
5530: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
5540: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
5550: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
5560: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5570: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
5580: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
5590: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
55c0: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
55d0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
55e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
55f0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
5600: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
5610: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
5620: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  55].pCurrent)..#
5630: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5640: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
5650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
5660: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
5670: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
5680: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
5690: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
56a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
56b0: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
56c0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
56d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
56f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5700: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
5710: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5720: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
5730: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
5740: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
5750: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
5760: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
5770: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
5780: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
5790: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
57a0: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
57b0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
57c0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
57d0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
57e0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
57f0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  OL))aSyscall[57]
5800: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5810: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
5820: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5830: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5850: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
5860: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
5870: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
5880: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
5890: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
58a0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
58b0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
58c0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
58d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
58e0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
58f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5900: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
5910: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5920: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
5930: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
5940: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5970: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
5980: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
5990: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
59a0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
59b0: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
59c0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
59d0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d  RD))aSyscall[59]
59e0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
59f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5a00: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
5a10: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
5a20: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
5a30: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
5a40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5a50: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
5a60: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
5a70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5a90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5aa0: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
5ab0: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
5ac0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5ad0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5ae0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  D))aSyscall[60].
5af0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
5b00: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5b10: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
5b20: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
5b30: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
5b40: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
5b50: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5b60: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
5b70: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
5b80: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5ba0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5bb0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
5bc0: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
5bd0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5be0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5bf0: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
5c00: 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [61].pCurrent)..
5c10: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
5c20: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
5c30: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
5c40: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
5c50: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
5c60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5c70: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
5c80: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
5c90: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5cc0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
5cd0: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
5ce0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5cf0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
5d00: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
5d10: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
5d20: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
5d30: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
5d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5d50: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
5d60: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
5d70: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
5d80: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
5d90: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
5da0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
5db0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
5dc0: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5df0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
5e00: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
5e10: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
5e20: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
5e30: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
5e40: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
5e50: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
5e60: 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75  aSyscall[63].pCu
5e70: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
5e80: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
5e90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5ea0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61  MIT_WAL).  { "Ma
5eb0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
5ec0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
5ed0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  )MapViewOfFileFr
5ee0: 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23  omApp,    0 },.#
5ef0: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
5f00: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
5f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5f40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
5f50: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
5f60: 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  p ((LPVOID(WINAP
5f70: 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47  I*)(HANDLE,ULONG
5f80: 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20  ,ULONG64, \.    
5f90: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5fa0: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
5fb0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
5fc0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
5fd0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
5fe0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5ff0: 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20  CreateFile2,    
6000: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6010: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
6020: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
6030: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6060: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
6070: 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45  teFile2 ((HANDLE
6080: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
6090: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  R,DWORD,DWORD,DW
60a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
60b0: 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  PCREATEFILE2_EXT
60c0: 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
60d0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
60e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
60f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6100: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6110: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6120: 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67  SCALL)LoadPackag
6130: 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30  edLibrary,     0
6140: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6150: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
6160: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
6170: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6180: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6190: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
61a0: 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
61b0: 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28  brary ((HMODULE(
61c0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
61d0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
61e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e  D))aSyscall[66].
61f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6200: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6210: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
6220: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
6230: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
6240: 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20  unt64,          
6250: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6260: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
6270: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6280: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6290: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
62a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
62b0: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
62c0: 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49  4 ((ULONGLONG(WI
62d0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
62e0: 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65  scall[67].pCurre
62f0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6300: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6310: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6320: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
6330: 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  )GetNativeSystem
6340: 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23  Info,     0 },.#
6350: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74  else.  { "GetNat
6360: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
6370: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
63a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
63b0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
63c0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
63d0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  ( \.        LPSY
63e0: 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63  STEM_INFO))aSysc
63f0: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
6400: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6420: 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75  ANSI).  { "Outpu
6430: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
6440: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
6450: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
6460: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
6470: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
6480: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
6490: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
64c0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
64d0: 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56  DebugStringA ((V
64e0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
64f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 39  STR))aSyscall[69
6500: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6510: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6520: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
6530: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
6540: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
6550: 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65  SYSCALL)OutputDe
6560: 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20  bugStringW,     
6570: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6580: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
6590: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
65a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
65c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
65d0: 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53  e osOutputDebugS
65e0: 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49  tringW ((VOID(WI
65f0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
6600: 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75  aSyscall[70].pCu
6610: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
6620: 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20  ProcessHeap",   
6630: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6640: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20  GetProcessHeap, 
6650: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6660: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
6670: 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45  essHeap ((HANDLE
6680: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
6690: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
66a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
66b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
66c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
66d0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72  MIT_WAL).  { "Cr
66e0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
66f0: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
6700: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
6710: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
6720: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
6730: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
6740: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
6750: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6760: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6770: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
6780: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
6790: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
67a0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
67b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
67c0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
67d0: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
67e0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
67f0: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
6800: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
6810: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
6820: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
6830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
6840: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
6850: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
6860: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
6870: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
6880: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
6890: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
68a0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
68b0: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
68c0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
68d0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
68e0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
68f0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
6900: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
6910: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
6920: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
6930: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
6940: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
6950: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
6960: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
6970: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
6980: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6990: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
69a0: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
69b0: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
69c0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
69d0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
69e0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
69f0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
6a00: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
6a10: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
6a20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6a30: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
6a40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6a50: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
6a60: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
6a70: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
6a80: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
6a90: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
6aa0: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
6ab0: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
6ac0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
6ad0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
6ae0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
6b00: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
6b10: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
6b20: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
6b30: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
6b40: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
6b50: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
6b60: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
6b70: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
6ba0: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
6bb0: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
6bc0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
6bd0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
6be0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
6bf0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
6c00: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
6c10: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
6c20: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
6c30: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6c40: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
6c50: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
6c60: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
6c70: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6c90: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
6ca0: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
6cb0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
6cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6cd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6ce0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
6cf0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
6d00: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
6d10: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
6d20: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
6d30: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
6d40: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
6d50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6d60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6d80: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
6d90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
6da0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
6db0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
6dc0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
6dd0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
6de0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
6df0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
6e00: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
6e10: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
6e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
6e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
6e40: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
6e50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6e60: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6e70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6e80: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6e90: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6ea0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6eb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6ec0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6ed0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6ee0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6ef0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6f00: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6f10: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6f20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6f30: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6f40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6f50: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6f60: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6f70: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
6f80: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
6f90: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
6fa0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6fb0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6fc0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
6fd0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
6fe0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
6ff0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7000: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7010: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
7020: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
7030: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7040: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
7050: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7060: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7070: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7080: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7090: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
70a0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
70b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
70c0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
70d0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
70e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
70f0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7100: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7110: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7120: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7130: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7140: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7150: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7160: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7170: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7180: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
71a0: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
71b0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
71c0: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
71d0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
71e0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
71f0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
7200: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
7210: 74 65 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a  te_debug(char *z
7220: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
7230: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
7240: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7250: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
7260: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
7270: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
7280: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
7290: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
72a0: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
72b0: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
72c0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
72d0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
72e0: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
72f0: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
7300: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
7310: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
7320: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
7330: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7340: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
7350: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
7360: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
7370: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
7380: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
7390: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
73a0: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
73b0: 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75  in);.    osOutpu
73c0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44  tDebugStringA(zD
73d0: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
73e0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
73f0: 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b  ugStringA(zBuf);
7400: 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e  .  }.#elif defin
7410: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
7420: 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73  HAS_WIDE).  mems
7430: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
7440: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7450: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20  BUF_SIZE);.  if 
7460: 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  ( osMultiByteToW
7470: 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20  ideChar(.       
7480: 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73     osAreFileApis
7490: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
74a0: 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a  : CP_OEMCP, 0, z
74b0: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  Buf,.          n
74c0: 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62  Min, (LPWSTR)zDb
74d0: 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e  gBuf, SQLITE_WIN
74e0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f  32_DBG_BUF_SIZE/
74f0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d  sizeof(WCHAR))<=
7500: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
7510: 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44  .  }.  osOutputD
7520: 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43  ebugStringW((LPC
7530: 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23  WSTR)zDbgBuf);.#
7540: 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  else.  if( nMin>
7550: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
7560: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
7570: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
7580: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
7590: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
75a0: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72  , nMin);.    fpr
75b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
75c0: 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  ", zDbgBuf);.  }
75d0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
75e0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
75f0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zBuf);.  }.#endi
7600: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
7610: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
7620: 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75   suspends the cu
7630: 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72  rrent thread for
7640: 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20   at least ms.** 
7650: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
7660: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
7670: 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53  t to the Win32 S
7680: 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65  leep() interface
7690: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
76a0: 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20  OS_WINRT.static 
76b0: 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20  HANDLE sleepObj 
76c0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
76d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
76e0: 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d  32_sleep(DWORD m
76f0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69  illiseconds){.#i
7700: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7710: 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62  T.  if ( sleepOb
7720: 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  j==NULL ){.    s
7730: 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61  leepObj = osCrea
7740: 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c  teEventExW(NULL,
7750: 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
7760: 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
7770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a    SYNCHRONIZE);.
77a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c    }.  assert( sl
77b0: 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a  eepObj!=NULL );.
77c0: 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c    osWaitForSingl
77d0: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
77e0: 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  bj, milliseconds
77f0: 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a  , FALSE);.#else.
7800: 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73    osSleep(millis
7810: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
7820: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7830: 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
7840: 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
7850: 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57  g under WinNT, W
7860: 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20  in2K, WinXP,.** 
7870: 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72  or WinCE.  Retur
7880: 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66  n false (zero) f
7890: 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  or Win95, Win98,
78a0: 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a   or WinME..**.**
78b0: 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65   Here is an inte
78c0: 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74  resting observat
78d0: 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e  ion:  Win95, Win
78e0: 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61  98, and WinME la
78f0: 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ck.** the LockFi
7900: 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74  leEx() API.  But
7910: 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74   we can still st
7920: 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67  atically link ag
7930: 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50  ainst that.** AP
7940: 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20  I as long as we 
7950: 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68  don't call it wh
7960: 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35  en running Win95
7970: 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20  /98/ME.  A call 
7980: 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
7990: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
79a0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68  termine if the h
79b0: 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f  ost is Win95/98/
79c0: 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32  ME or.** WinNT/2
79d0: 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20  K/XP so that we 
79e0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65  will know whethe
79f0: 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20  r or not we can 
7a00: 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74  safely call.** t
7a10: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
7a20: 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  API..*/.#if SQLI
7a30: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
7a40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
7a50: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
7a60: 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74  (1).#else.  stat
7a70: 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64  ic int isNT(void
7a80: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
7a90: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b  e3_os_type==0 ){
7aa0: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
7ab0: 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOA sInfo;.   
7ac0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
7ad0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
7ae0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
7af0: 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e      osGetVersion
7b00: 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20  ExA(&sInfo);.   
7b10: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79     sqlite3_os_ty
7b20: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61  pe = sInfo.dwPla
7b30: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41  tformId==VER_PLA
7b40: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f  TFORM_WIN32_NT ?
7b50: 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20   2 : 1;.    }.  
7b60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7b70: 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d  _os_type==2;.  }
7b80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7b90: 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23  E_OS_WINCE */..#
7ba0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
7bb0: 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20  32_MALLOC./*.** 
7bc0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20  Allocate nBytes 
7bd0: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  of memory..*/.st
7be0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
7bf0: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
7c00: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
7c10: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
7c20: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
7c30: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
7c40: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
7c50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
7c60: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
7c70: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
7c80: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
7c90: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
7ca0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
7cb0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
7cc0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
7cd0: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
7ce0: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
7cf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
7d00: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
7d10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
7d20: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
7d30: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
7d40: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
7d50: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
7d60: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
7d70: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
7d80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
7d90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
7da0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
7db0: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 64 29  oc %u bytes (%d)
7dc0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
7de0: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
7df0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
7e00: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
7e10: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  n p;.}../*.** Fr
7e20: 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ee memory..*/.st
7e30: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
7e40: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
7e50: 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  r){.  HANDLE hHe
7e60: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
7e70: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
7e80: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
7e90: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
7ea0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
7eb0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
7ec0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
7ed0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
7ee0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
7ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
7f00: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
7f10: 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f  TE).  assert ( o
7f20: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
7f30: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
7f40: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
7f50: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
7f60: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
7f70: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
7f80: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
7f90: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
7fa0: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
7fb0: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
7fc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
7fd0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
7fe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
7ff0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
8000: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
8010: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64  ree block %p (%d
8020: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
8040: 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ior, osGetLastEr
8050: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
8060: 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eap);.  }.}../*.
8070: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
8080: 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e  ze of an existin
8090: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
80a0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
80b0: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
80c0: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
80d0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
80e0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
80f0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
8100: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
8110: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
8120: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
8130: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
8140: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
8150: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
8160: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
8170: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8180: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8190: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
81a0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
81b0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
81c0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
81d0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
81e0: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
81f0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
8200: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
8210: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
8220: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
8230: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8240: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8250: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
8260: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
8270: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
8280: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8290: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
82a0: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
82b0: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
82c0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
82d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
82e0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
82f0: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
8300: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
8320: 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c  rior ? "HeapReAl
8330: 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f  loc" : "HeapAllo
8340: 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65  c", nBytes, osGe
8350: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
8370: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
8380: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
8390: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
83a0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73   size of an outs
83b0: 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69  tanding allocati
83c0: 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f  on, in bytes..*/
83d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
83e0: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b  emSize(void *p){
83f0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
8400: 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20  .  SIZE_T n;..  
8410: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
8420: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
8430: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
8440: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8450: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8460: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
8470: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8480: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8490: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
84a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
84b0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
84c0: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
84d0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
84e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
84f0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
8500: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
8510: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
8520: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
8530: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8540: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
8550: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
8560: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
8570: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
8580: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
8590: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
85a0: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
85b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
85c0: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
85d0: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
85e0: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
85f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
8600: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
8610: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
8620: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
8630: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
8640: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
8650: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
8660: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
8670: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
8680: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
8690: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
86a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
86b0: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
86c0: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
86d0: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
86e0: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
86f0: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
8700: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
8710: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
8720: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
8730: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
8740: 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  agic==WINMEM_MAG
8750: 49 43 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  IC );..#if !SQLI
8760: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
8770: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8780: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
8790: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
87a0: 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d  p ){.    pWinMem
87b0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
87c0: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
87d0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
87e0: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
8810: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
8820: 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
8850: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
8860: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66  AX_SIZE);.    if
8870: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
8880: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73  hHeap ){.      s
8890: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
88a0: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
88b0: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65     "failed to He
88c0: 61 70 43 72 65 61 74 65 20 28 25 64 29 2c 20 66  apCreate (%d), f
88d0: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
88e0: 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75  e=%u, maxSize=%u
88f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47  ",.          osG
8900: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53  etLastError(), S
8910: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8920: 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
8930: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
8940: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53  EAP_INIT_SIZE, S
8950: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8960: 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _MAX_SIZE);.    
8970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8980: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
8990: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
89a0: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
89b0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
89c0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
89d0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
89e0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
89f0: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
8a00: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
8a10: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
8a20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
8a30: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
8a40: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
8a50: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
8a60: 70 20 28 25 64 29 22 2c 20 6f 73 47 65 74 4c 61  p (%d)", osGetLa
8a70: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
8a80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8a90: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d  MEM;.  }.  pWinM
8aa0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
8ab0: 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74   FALSE;.  assert
8ac0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
8ad0: 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66  bOwned );.#endif
8ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
8af0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30  emData->hHeap!=0
8b00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
8b10: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
8b20: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
8b30: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
8b40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8b50: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8b60: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
8b70: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
8b80: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
8b90: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
8ba0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8bb0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
8bc0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
8bd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69  ;.}../*.** Deini
8bf0: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
8c00: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ule..*/.static v
8c10: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
8c20: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
8c30: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
8c40: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
8c50: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
8c60: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
8c70: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
8c80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e  turn;.  if( pWin
8c90: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
8ca0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
8cb0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
8cc0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
8cd0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
8ce0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8cf0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8d00: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
8d10: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
8d20: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
8d30: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
8d40: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8d50: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8d60: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
8d70: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
8d80: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
8d90: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
8da0: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
8db0: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
8dc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
8dd0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
8de0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
8df0: 44 65 73 74 72 6f 79 20 28 25 64 29 2c 20 68 65  Destroy (%d), he
8e00: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
8e20: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
8e30: 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61  oid*)pWinMemData
8e40: 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  ->hHeap);.      
8e50: 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44  }.      pWinMemD
8e60: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
8e70: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  LSE;.    }.    p
8e80: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
8e90: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  p = NULL;.  }.}.
8ea0: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
8eb0: 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65  the low-level me
8ec0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
8ed0: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
8ee0: 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47  s in.** sqlite3G
8ef0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69  lobalConfig.m wi
8f00: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  th pointers to t
8f10: 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  he routines in t
8f20: 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a  his file. The.**
8f30: 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69   arguments speci
8f40: 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  fy the block of 
8f50: 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65  memory to manage
8f60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8f70: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
8f80: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  led by sqlite3_c
8f90: 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65  onfig(), and the
8fa0: 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74  refore.** is not
8fb0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
8fc0: 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69  threadsafe (it i
8fd0: 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74  s not)..*/.const
8fe0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
8ff0: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
9000: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a  GetWin32(void){.
9010: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
9020: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
9030: 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  ds winMemMethods
9040: 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d   = {.    winMemM
9050: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
9060: 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mFree,.    winMe
9070: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  mRealloc,.    wi
9080: 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69  nMemSize,.    wi
9090: 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20  nMemRoundup,.   
90a0: 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20   winMemInit,.   
90b0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c   winMemShutdown,
90c0: 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61  .    &win_mem_da
90d0: 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e  ta.  };.  return
90e0: 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b   &winMemMethods;
90f0: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
9100: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f  MemSetDefault(vo
9110: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  id){.  sqlite3_c
9120: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
9130: 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69  FIG_MALLOC, sqli
9140: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29  te3MemGetWin32()
9150: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
9160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9170: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OC */../*.** Con
9180: 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72  vert a UTF-8 str
9190: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
91a0: 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36   Unicode (UTF-16
91b0: 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ?). .**.** Space
91c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
91d0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
91e0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
91f0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
9200: 4c 50 57 53 54 52 20 75 74 66 38 54 6f 55 6e 69  LPWSTR utf8ToUni
9210: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
9220: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
9230: 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53  nt nChar;.  LPWS
9240: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
9250: 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d  ;..  nChar = osM
9260: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
9270: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
9280: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
9290: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
92a0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
92b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
92c0: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  ideFilename = sq
92d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43  lite3_malloc( nC
92e0: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
92f0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
9300: 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
9310: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
9320: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
9330: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
9340: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
9350: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
9360: 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
9370: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
93a0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
93b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
93c0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
93d0: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
93e0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
93f0: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
9400: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
9410: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
9420: 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e  nicode to UTF-8.
9430: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
9440: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
9450: 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ing is.** obtain
9460: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
9470: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
9480: 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64  tic char *unicod
9490: 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20  eToUtf8(LPCWSTR 
94a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
94b0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
94c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
94d0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
94e0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
94f0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
9500: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
9510: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
9520: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
9530: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9540: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
9550: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
9560: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
9570: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zFilename==0 ){.
9580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9590: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
95a0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
95b0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
95c0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
95d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74   zFilename, nByt
95e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20     0, 0);.  if( 
9610: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
9620: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9630: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
9640: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
9650: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
9660: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
9670: 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73  onvert an ANSI s
9680: 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f  tring to Microso
9690: 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65  ft Unicode, base
96a0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72  d on the.** curr
96b0: 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74  ent codepage set
96c0: 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61  tings for file a
96d0: 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63  pis..** .** Spac
96e0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
96f0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
9700: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
9710: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
9720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
9730: 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65  TR mbcsToUnicode
9740: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
9750: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
9760: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
9770: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
9780: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
9790: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
97a0: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
97b0: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
97c0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
97d0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
97e0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
97f0: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
9820: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
9830: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
9840: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9850: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
9860: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
9870: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
9880: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d  zMbcsFilename[0]
9890: 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73  ) );.  if( zMbcs
98a0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
98b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
98c0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
98d0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
98e0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
98f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62  ilename, -1, zMb
9900: 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  csFilename,.    
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
9930: 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  e);.  if( nByte=
9940: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9950: 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65  3_free(zMbcsFile
9960: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
9970: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
9980: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
9990: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
99a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
99b0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
99c0: 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61  multi-byte chara
99d0: 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73  cter string, bas
99e0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65  ed on the.** use
99f0: 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67  r's ANSI codepag
9a00: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  e..**.** Space t
9a10: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
9a20: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
9a30: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
9a40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
9a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9a60: 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c  *unicodeToMbcs(L
9a70: 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  PCWSTR zWideFile
9a80: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
9a90: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  te;.  char *zFil
9aa0: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64  ename;.  int cod
9ab0: 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c  epage = osAreFil
9ac0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
9ad0: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
9ae0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
9af0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
9b00: 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  e(codepage, 0, z
9b10: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
9b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
9b30: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
9b40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9b50: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
9b60: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
9b70: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
9b80: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
9b90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9ba0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
9bb0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
9bc0: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
9bd0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
9be0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  -1, zFilename,. 
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
9c10: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
9c20: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
9c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9c40: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
9c50: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
9c60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
9c70: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
9c80: 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62  * Convert multib
9c90: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
9ca0: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20  ring to UTF-8.  
9cb0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
9cc0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
9cd0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
9ce0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
9cf0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
9d00: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
9d10: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
9d20: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
9d30: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
9d40: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57  enameUtf8;.  LPW
9d50: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
9d60: 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73   zTmpWide = mbcs
9d70: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
9d80: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
9d90: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
9da0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
9db0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75  FilenameUtf8 = u
9dc0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
9dd0: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
9de0: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
9df0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
9e00: 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a  nameUtf8;.}../*.
9e10: 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38  ** Convert UTF-8
9e20: 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68   to multibyte ch
9e30: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20  aracter string. 
9e40: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
9e50: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
9e60: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
9e70: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
9e80: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61  malloc()..*/.cha
9e90: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
9ea0: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f  _utf8_to_mbcs(co
9eb0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9ec0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ame){.  char *zF
9ed0: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c  ilenameMbcs;.  L
9ee0: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
9ef0: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75 74  .  zTmpWide = ut
9f00: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
9f10: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54  ename);.  if( zT
9f20: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
9f30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9f40: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d   zFilenameMbcs =
9f50: 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a   unicodeToMbcs(z
9f60: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
9f70: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
9f80: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69  e);.  return zFi
9f90: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 0a  lenameMbcs;.}...
9fa0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
9fb0: 20 76 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73   value of getLas
9fc0: 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20  tErrorMsg.** is 
9fd0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
9fe0: 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
9ff0: 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
a000: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
a010: 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
a020: 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
a030: 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ated)..*/.static
a040: 20 69 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f   int getLastErro
a050: 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45  rMsg(DWORD lastE
a060: 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20  rrno, int nBuf, 
a070: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f  char *zBuf){.  /
a080: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  * FormatMessage 
a090: 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69  returns 0 on fai
a0a0: 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65  lure.  Otherwise
a0b0: 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73   it.  ** returns
a0c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54   the number of T
a0d0: 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f  CHARs written to
a0e0: 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a   the output.  **
a0f0: 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69   buffer, excludi
a100: 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ng the terminati
a110: 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20  ng null char..  
a120: 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e  */.  DWORD dwLen
a130: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f   = 0;.  char *zO
a140: 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ut = 0;..  if( i
a150: 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
a160: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
a170: 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65   WCHAR zTempWide
a180: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a  [MAX_PATH+1]; /*
a190: 20 4e 4f 54 45 3a 20 53 6f 6d 65 77 68 61 74 20   NOTE: Somewhat 
a1a0: 61 72 62 69 74 72 61 72 79 2e 20 2a 2f 0a 20 20  arbitrary. */.  
a1b0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
a1c0: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
a1d0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
a1e0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
a210: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
a220: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
a2b0: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 0a 20 20      MAX_PATH,.  
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
a300: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
a310: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
a320: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
a330: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
a340: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
a350: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
a380: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
a390: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
a3c0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
a3d0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
a420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
a440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
a460: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
a470: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
a4c0: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
a4d0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
a4e0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
a4f0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
a500: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
a510: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
a520: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
a530: 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
a540: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20  TempWide);.     
a550: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
a560: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21  nMalloc();.#if !
a570: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
a580: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
a590: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
a5a0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
a5b0: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
a5c0: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
a5d0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64  zTempWide);.#end
a5e0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  if.    }.  }.#if
a5f0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
a600: 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
a610: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
a620: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
a630: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
a640: 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45  ssageA(FORMAT_ME
a650: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
a660: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
a690: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
a6a0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
a6c0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
a6d0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
a700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
a720: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a        (LPSTR) &z
a770: 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Temp,.          
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
a7c0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
a7d0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
a7e0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
a7f0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
a800: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
a810: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a820: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
a830: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
a840: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
a850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
a860: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a870: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
a880: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
a890: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
a8a0: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
a8b0: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
a8c0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
a8d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
a8e0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
a8f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a900: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
a910: 73 45 72 72 6f 72 20 30 78 25 78 20 28 25 75 29  sError 0x%x (%u)
a920: 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61  ", lastErrno, la
a930: 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73  stErrno);.  }els
a940: 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61  e{.    /* copy a
a950: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66   maximum of nBuf
a960: 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74   chars to output
a970: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
a980: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a990: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22  nBuf, zBuf, "%s"
a9a0: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  , zOut);.    /* 
a9b0: 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75  free the UTF8 bu
a9c0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
a9d0: 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
a9e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
a9f0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  }../*.**.** This
aa00: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c   function - winL
aa10: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20  ogErrorAtLine() 
aa20: 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  - is only ever c
aa30: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
aa40: 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72  cro.** winLogErr
aa50: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  or()..**.** This
aa60: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
aa70: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
aa80: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
aa90: 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  OS function..** 
aaa0: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
aab0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
aac0: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
aad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
aae0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63  ue of.** error c
aaf0: 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  ode and, if poss
ab00: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
ab10: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
ab20: 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72  ent from .** For
ab30: 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  matMessage..**.*
ab40: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
ab50: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
ab60: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
ab70: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
ab80: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
ab90: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
aba0: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
abb0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
abc0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
abd0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
abe0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
abf0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
ac00: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
ac10: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
ac20: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
ac30: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
ac40: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
ac50: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
ac60: 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  ine winLogError(
ac70: 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f  a,b,c,d)   winLo
ac80: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
ac90: 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,c,d,__LINE__).s
aca0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67  tatic int winLog
acb0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
acc0: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ace0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
acf0: 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ode */.  DWORD l
ad00: 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20  astErrno,       
ad10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33           /* Win3
ad20: 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a  2 last error */.
ad30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
ad40: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
ad50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
ad60: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
ad70: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
ad80: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
ad90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
ada0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
adb0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
adc0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
adf0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
ae00: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
ae10: 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35  ){.  char zMsg[5
ae20: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
ae30: 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65       /* Human re
ae40: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78  adable error tex
ae50: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ae80: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73  ounter */..  zMs
ae90: 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c  g[0] = 0;.  getL
aea0: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
aeb0: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
aec0: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
aed0: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
aee0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
aef0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
af00: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
af10: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
af20: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
af30: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
af40: 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
af50: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
af60: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
af70: 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
af80: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
af90: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
afa0: 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
afb0: 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
afc0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
afd0: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
afe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
aff0: 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
b000: 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
b010: 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
b020: 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
b030: 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
b040: 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
b050: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
b060: 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69  ed by .** antivi
b070: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
b080: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
b090: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
b0a0: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
b0b0: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
b0c0: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
b0d0: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
b0e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
b0f0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
b100: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
b110: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
b120: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
b130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
b140: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
b150: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
b160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
b170: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
b180: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
b190: 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74  nt win32IoerrRet
b1a0: 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ry = SQLITE_WIN3
b1b0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73  2_IOERR_RETRY;.s
b1c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49  tatic int win32I
b1d0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
b1e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
b1f0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
b200: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
b210: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
b220: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
b230: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
b240: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
b250: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
b260: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
b270: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
b280: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
b290: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
b2a0: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
b2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74 72  .static int retr
b2c0: 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65  yIoerr(int *pnRe
b2d0: 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72  try, DWORD *pErr
b2e0: 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  or){.  DWORD e =
b2f0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b300: 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72  );.  if( *pnRetr
b310: 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65 74  y>=win32IoerrRet
b320: 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
b330: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
b340: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
b350: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b360: 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f   }.  if( e==ERRO
b370: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20  R_ACCESS_DENIED 
b380: 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f  ||.      e==ERRO
b390: 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e  R_LOCK_VIOLATION
b3a0: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
b3b0: 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  OR_SHARING_VIOLA
b3c0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TION ){.    sqli
b3d0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
b3e0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
b3f0: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
b400: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
b410: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
b420: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72  ;.  }.  if( pErr
b430: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
b440: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
b450: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
b460: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
b470: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
b480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  /.static void lo
b490: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
b4a0: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
b4b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b4c0: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
b4d0: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
b4e0: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
b4f0: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
b500: 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f  ",.      win32Io
b510: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
b520: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
b530: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
b540: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b550: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
b560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
b5a0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
b5b0: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
b5c0: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
b5d0: 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45  /*.** Windows CE
b5e0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
b5f0: 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
b600: 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74  ction.  So creat
b610: 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74  e a.** substitut
b620: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  e..*/.#include <
b630: 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74  time.h>.struct t
b640: 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c  m *__cdecl local
b650: 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f  time(const time_
b660: 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63  t *t).{.  static
b670: 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20   struct tm y;.  
b680: 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54  FILETIME uTm, lT
b690: 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  m;.  SYSTEMTIME 
b6a0: 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  pTm;.  sqlite3_i
b6b0: 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20  nt64 t64;.  t64 
b6c0: 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74  = *t;.  t64 = (t
b6d0: 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30  64 + 11644473600
b6e0: 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54  )*10000000;.  uT
b6f0: 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20  m.dwLowDateTime 
b700: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20  = (DWORD)(t64 & 
b710: 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75  0xFFFFFFFF);.  u
b720: 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  Tm.dwHighDateTim
b730: 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e  e= (DWORD)(t64 >
b740: 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54  > 32);.  osFileT
b750: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
b760: 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20  me(&uTm,&lTm);. 
b770: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73   osFileTimeToSys
b780: 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54  temTime(&lTm,&pT
b790: 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20  m);.  y.tm_year 
b7a0: 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39  = pTm.wYear - 19
b7b0: 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d  00;.  y.tm_mon =
b7c0: 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b   pTm.wMonth - 1;
b7d0: 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70  .  y.tm_wday = p
b7e0: 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20  Tm.wDayOfWeek;. 
b7f0: 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d   y.tm_mday = pTm
b800: 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f  .wDay;.  y.tm_ho
b810: 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a  ur = pTm.wHour;.
b820: 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d    y.tm_min = pTm
b830: 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d  .wMinute;.  y.tm
b840: 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f  _sec = pTm.wSeco
b850: 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b  nd;.  return &y;
b860: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44  .}..#define HAND
b870: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29  LE_TO_WINFILE(a)
b880: 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68   (winFile*)&((ch
b890: 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66  ar*)a)[-(int)off
b8a0: 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29  setof(winFile,h)
b8b0: 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  ]../*.** Acquire
b8c0: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68   a lock on the h
b8d0: 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69  andle h.*/.stati
b8e0: 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65  c void winceMute
b8f0: 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20  xAcquire(HANDLE 
b900: 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45  h){.   DWORD dwE
b910: 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20  rr;.   do {.    
b920: 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46   dwErr = osWaitF
b930: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68  orSingleObject(h
b940: 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20  , INFINITE);.   
b950: 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21  } while (dwErr !
b960: 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20  = WAIT_OBJECT_0 
b970: 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54  && dwErr != WAIT
b980: 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f  _ABANDONED);.}./
b990: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c  *.** Release a l
b9a0: 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20  ock acquired by 
b9b0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
b9c0: 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77  e().*/.#define w
b9d0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
b9e0: 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78  (h) ReleaseMutex
b9f0: 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  (h)../*.** Creat
ba00: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
ba10: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73  shared memory us
ba20: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69  ed for locking i
ba30: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65  n the file.** de
ba40: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a  scriptor pFile.*
ba50: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
ba60: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
ba70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
ba80: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
ba90: 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a  ile){.  LPWSTR z
baa0: 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e  Tok;.  LPWSTR zN
bab0: 61 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69  ame;.  BOOL bIni
bac0: 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61  t = TRUE;..  zNa
bad0: 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  me = utf8ToUnico
bae0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
baf0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
bb00: 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
bb10: 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
bb20: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
bb30: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
bb40: 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61  the local lockda
bb50: 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ta */.  memset(&
bb60: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c  pFile->local, 0,
bb70: 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c   sizeof(pFile->l
bb80: 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  ocal));..  /* Re
bb90: 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c  place the backsl
bba0: 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66  ashes from the f
bbb0: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65  ilename and lowe
bbc0: 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f  rcase it.  ** to
bbd0: 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20   derive a mutex 
bbe0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20  name. */.  zTok 
bbf0: 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a  = osCharLowerW(z
bc00: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a  Name);.  for (;*
bc10: 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20  zTok;zTok++){.  
bc20: 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27    if (*zTok == '
bc30: 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27  \\') *zTok = '_'
bc40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
bc50: 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65  te/open the name
bc60: 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69  d mutex */.  pFi
bc70: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43  le->hMutex = osC
bc80: 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c  reateMutexW(NULL
bc90: 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b  , FALSE, zName);
bca0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
bcb0: 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c  Mutex){.    pFil
bcc0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
bcd0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
bce0: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
bcf0: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70  (SQLITE_ERROR, p
bd00: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
bd10: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
bd20: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
bd30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bd40: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
bd50: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
bd60: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
bd70: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
bd80: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
bd90: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
bda0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
bdb0: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
bdc0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
bdd0: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
bde0: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
bdf0: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
be00: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
be10: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
be20: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
be30: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
be40: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
be50: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
be60: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
be70: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
be80: 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
be90: 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
bea0: 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
beb0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
bec0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
bed0: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
bf10: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
bf20: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf50: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
bf60: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
bf70: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
bf80: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
bf90: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
bfa0: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
bfb0: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
bfc0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f  lized */.  if (o
bfd0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  sGetLastError() 
bfe0: 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59  == ERROR_ALREADY
bff0: 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49  _EXISTS){.    bI
c000: 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d  nit = FALSE;.  }
c010: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
c020: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  (zName);..  /* I
c030: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
c040: 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61  n making the sha
c050: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
c060: 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20  e, map it. */.  
c070: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  if (pFile->hShar
c080: 65 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ed){.    pFile->
c090: 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c  shared = (winceL
c0a0: 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66  ock*)osMapViewOf
c0b0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  File(pFile->hSha
c0c0: 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  red, .          
c0d0: 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44     FILE_MAP_READ
c0e0: 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c  |FILE_MAP_WRITE,
c0f0: 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69   0, 0, sizeof(wi
c100: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f  nceLock));.    /
c110: 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69  * If mapping fai
c120: 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73  led, close the s
c130: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
c140: 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74  dle and erase it
c150: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69   */.    if (!pFi
c160: 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20  le->shared){.   
c170: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c180: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
c190: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
c1a0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
c1b0: 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c  _ERROR, pFile->l
c1c0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
c1d0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
c1e0: 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
c1f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f  lename);.      o
c200: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
c210: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
c220: 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
c230: 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
c240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
c250: 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
c260: 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
c270: 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
c280: 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
c290: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
c2a0: 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29  hShared == NULL)
c2b0: 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  {.    winceMutex
c2c0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
c2d0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
c2e0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
c2f0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
c300: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
c310: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  LL;.    return F
c320: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ALSE;.  }.  .  /
c330: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
c340: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
c350: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
c360: 20 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e   to */.  if (bIn
c370: 69 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it) {.    memset
c380: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
c390: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
c3a0: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
c3b0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
c3c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
c3d0: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d    return TRUE;.}
c3e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
c3f0: 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
c400: 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
c410: 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
c420: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
c430: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
c440: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
c450: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
c460: 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
c470: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
c480: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
c490: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
c4a0: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
c4b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
c4c0: 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
c4d0: 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
c4e0: 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
c4f0: 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
c500: 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
c510: 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
c520: 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
c530: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
c540: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
c550: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
c560: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
c570: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
c580: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
c590: 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
c5a0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
c5b0: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
c5c0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
c5d0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
c5e0: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
c5f0: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
c600: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
c610: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
c620: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
c630: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
c640: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
c650: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
c660: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
c670: 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
c680: 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
c690: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
c6a0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
c6b0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
c6c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
c6d0: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
c6e0: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
c6f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
c700: 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
c710: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
c720: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
c730: 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20  Mutex);    .    
c740: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
c750: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
c760: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
c770: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = NULL;.  }.}../
c780: 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  * .** An impleme
c790: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c  ntation of the L
c7a0: 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66  ockFile() API of
c7b0: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
c7c0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
c7d0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20  inceLockFile(.  
c7e0: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
c7f0: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
c800: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
c810: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
c820: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
c830: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
c840: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
c850: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
c860: 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
c870: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
c880: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
c890: 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
c8a0: 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
c8b0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c8c0: 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
c8d0: 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
c8e0: 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
c8f0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
c900: 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
c910: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
c920: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
c930: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
c940: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
c950: 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63  * Wanting an exc
c960: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
c970: 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
c980: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
c990: 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20  SHARED_FIRST.   
c9a0: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
c9b0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
c9c0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
c9d0: 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70  SIZE){.    if (p
c9e0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
c9f0: 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70  eaders == 0 && p
ca00: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
ca10: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
ca20: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
ca30: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
ca40: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
ca50: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
ca60: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
ca70: 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d         bReturn =
ca80: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
ca90: 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65  ..  /* Want a re
caa0: 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f  ad-only lock? */
cab0: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
cac0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
cad0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
cae0: 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ST &&.          
caf0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
cb00: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
cb10: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
cb20: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
cb30: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70  e == 0){.      p
cb40: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
cb50: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69  ders ++;.      i
cb60: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
cb70: 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a  nReaders == 1){.
cb80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
cb90: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
cba0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
cbb0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
cbc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
cbd0: 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67  * Want a pending
cbe0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
cbf0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
cc00: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
cc10: 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e  ENDING_BYTE && n
cc20: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
cc30: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
cc40: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69    /* If no pendi
cc50: 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ng lock has been
cc60: 20 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20   acquired, then 
cc70: 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20  acquire it */.  
cc80: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
cc90: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d  red->bPending ==
cca0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
ccb0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
ccc0: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
ccd0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
cce0: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
ccf0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
cd00: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
cd10: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73  .  /* Want a res
cd20: 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  erved lock? */. 
cd30: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
cd40: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
cd50: 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
cd60: 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79  E && nNumberOfBy
cd70: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
cd80: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
cd90: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
cda0: 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20  rved == 0) {.   
cdb0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
cdc0: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  ->bReserved = TR
cdd0: 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
cde0: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
cdf0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
ce00: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
ce10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63     }.  }..  winc
ce20: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
ce30: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
ce40: 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a  return bReturn;.
ce50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
ce60: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
ce70: 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49  e UnlockFile API
ce80: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
ce90: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
cea0: 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c  L winceUnlockFil
ceb0: 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
cec0: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
ced0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
cee0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
cef0: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
cf00: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
cf10: 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  oUnlockLow,.  DW
cf20: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
cf30: 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29  esToUnlockHigh.)
cf40: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
cf50: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
cf60: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
cf70: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
cf80: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
cf90: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
cfa0: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
cfb0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
cfc0: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
cfd0: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a  ToUnlockHigh);..
cfe0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
cff0: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
d000: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
d010: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
d020: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  utex);..  /* Rel
d030: 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20  easing a reader 
d040: 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75  lock or an exclu
d050: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  sive lock */.  i
d060: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
d070: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
d080: 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20  RED_FIRST){.    
d090: 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61  /* Did we have a
d0a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
d0b0: 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  ? */.    if (pFi
d0c0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
d0d0: 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73  sive){.      ass
d0e0: 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
d0f0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
d100: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
d110: 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  IZE);.      pFil
d120: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
d130: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
d140: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
d150: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
d160: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
d170: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
d180: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  }..    /* Did we
d190: 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61   just have a rea
d1a0: 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  der lock? */.   
d1b0: 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d   else if (pFile-
d1c0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
d1d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
d1e0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
d1f0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
d200: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c  RD)SHARED_SIZE |
d210: 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
d220: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
d230: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
d240: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
d250: 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
d260: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
d270: 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
d280: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
d290: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
d2a0: 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
d2b0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
d2c0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
d2d0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
d2e0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
d2f0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
d300: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
d310: 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
d320: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
d330: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
d340: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
d350: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
d360: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
d370: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
d380: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
d390: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
d3a0: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
d3b0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
d3c0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
d3d0: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
d3e0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
d3f0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
d400: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
d410: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
d420: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
d430: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
d440: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
d450: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
d460: 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
d470: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
d480: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
d490: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
d4a0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
d4b0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
d4c0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
d4d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
d4e0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
d4f0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d500: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
d510: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
d520: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
d530: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
d540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69 66  ********/.#endif
d590: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
d5a0: 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  NCE */../*.** Lo
d5b0: 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
d5c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
d5d0: 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20   winLockFile(.  
d5e0: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
d5f0: 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a  .  DWORD flags,.
d600: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f    DWORD offsetLo
d610: 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  w,.  DWORD offse
d620: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
d630: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57  umBytesLow,.  DW
d640: 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ORD numBytesHigh
d650: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
d660: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  S_WINCE.  /*.  *
d670: 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
d680: 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
d690: 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
d6a0: 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
d6b0: 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20  he Win32.  **   
d6c0: 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
d6d0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
d6e0: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
d6f0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
d700: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
d730: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
d740: 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54  #else.  if( isNT
d750: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
d760: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
d770: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
d780: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
d790: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
d7a0: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
d7b0: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
d7c0: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
d7d0: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
d7e0: 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
d7f0: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
d800: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
d810: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
d820: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d830: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
d840: 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
d850: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
d860: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
d890: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
d8a0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
d8b0: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
d8c0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
d8d0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
d8e0: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
d8f0: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
d900: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
d910: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
d920: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
d930: 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
d940: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
d950: 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
d960: 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
d970: 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
d980: 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
d990: 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
d9a0: 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
d9b0: 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
d9c0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
d9d0: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
d9e0: 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
d9f0: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
da20: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
da30: 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
da40: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f   isNT() ){.    O
da50: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
da60: 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
da70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
da80: 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
da90: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
daa0: 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
dab0: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
dac0: 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
dad0: 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
dae0: 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e  Ex(*phFile, 0, n
daf0: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
db00: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
db10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
db20: 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
db30: 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
db40: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
db50: 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
db80: 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
db90: 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f.}../**********
dba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbe0: 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ***.** The next 
dbf0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
dc00: 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
dc10: 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63  I/O methods spec
dc20: 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
dc30: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
dc40: 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a  ds object..*****
dc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
dca0: 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
dcb0: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
dcc0: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
dcd0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
dce0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
dcf0: 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
dd00: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
dd10: 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
dd20: 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
dd30: 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e   Move the curren
dd40: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
dd50: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61  e file handle pa
dd60: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
dd70: 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  t .** argument t
dd80: 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74  o offset iOffset
dd90: 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65   within the file
dda0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
ddb0: 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f   return 0. .** O
ddc0: 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70 46  therwise, set pF
ddd0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61  ile->lastErrno a
dde0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
ddf0: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
de00: 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69  t seekWinFile(wi
de10: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  nFile *pFile, sq
de20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
de30: 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  set){.#if !SQLIT
de40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e  E_OS_WINRT.  LON
de50: 47 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20  G upperBits;    
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de70: 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74  Most sig. 32 bit
de80: 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20  s of new offset 
de90: 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42  */.  LONG lowerB
dea0: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
deb0: 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69       /* Least si
dec0: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
ded0: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57  w offset */.  DW
dee0: 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20  ORD dwRet;      
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df00: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
df10: 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  by SetFilePointe
df20: 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  r() */.  DWORD l
df30: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
df40: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
df50: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
df60: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
df70: 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28  .  upperBits = (
df80: 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e  LONG)((iOffset>>
df90: 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
dfa0: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
dfb0: 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20   (LONG)(iOffset 
dfc0: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a  & 0xffffffff);..
dfd0: 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a    /* API oddity:
dfe0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
dff0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
e000: 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64   returns a dword
e010: 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e   .  ** containin
e020: 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62  g the lower 32-b
e030: 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66  its of the new f
e040: 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20  ile-offset. Or, 
e050: 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a  if it fails,.  *
e060: 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56  * it returns INV
e070: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
e080: 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61  INTER. However a
e090: 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e  ccording to MSDN
e0a0: 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f  , .  ** INVALID_
e0b0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
e0c0: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76   may also be a v
e0d0: 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e  alid new offset.
e0e0: 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65   So to determine
e0f0: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61   .  ** whether a
e100: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
e110: 61 6c 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74  ally occured, it
e120: 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61   is also necessa
e130: 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a  ry to call .  **
e140: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e   GetLastError().
e150: 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20  .  */.  dwRet = 
e160: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
e170: 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72  (pFile->h, lower
e180: 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
e190: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
e1a0: 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e    if( (dwRet==IN
e1b0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
e1c0: 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20  OINTER.      && 
e1d0: 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
e1e0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
e1f0: 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20  =NO_ERROR)) ){. 
e200: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e210: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
e220: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
e230: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
e240: 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
e250: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
e260: 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22     "seekWinFile"
e270: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
e280: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
e290: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
e2a0: 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
e2b0: 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
e2c0: 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
e2d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
e2e0: 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
e2f0: 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
e300: 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
e310: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
e320: 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
e330: 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e350: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
e360: 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
e370: 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
e380: 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
e390: 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
e3a0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
e3b0: 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
e3c0: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
e3d0: 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
e3e0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e3f0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
e400: 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
e410: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
e420: 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
e430: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
e440: 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c       "seekWinFil
e450: 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
e460: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
e470: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
e480: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
e490: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
e4a0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f  **.** It is repo
e4b0: 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74  rted that an att
e4c0: 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20  empt to close a 
e4d0: 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d  handle might som
e4e0: 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20  etimes.** fail. 
e4f0: 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20   This is a very 
e500: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73  unreasonable res
e510: 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73  ult, but Windows
e520: 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a   is notorious.**
e530: 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61   for being unrea
e540: 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20  sonable so I do 
e550: 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69  not doubt that i
e560: 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20  t might happen. 
e570: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65   If.** the close
e580: 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65   fails, we pause
e590: 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65   for 100 millise
e5a0: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67  conds and try ag
e5b0: 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79  ain.  As.** many
e5c0: 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54   as MX_CLOSE_ATT
e5d0: 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f  EMPT attempts to
e5e0: 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c   close the handl
e5f0: 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72  e are made befor
e600: 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61  e.** giving up a
e610: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
e620: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
e630: 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  e MX_CLOSE_ATTEM
e640: 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  PT 3.static int 
e650: 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  winClose(sqlite3
e660: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
e670: 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  t rc, cnt = 0;. 
e680: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
e690: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
e6a0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
e6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
e6c0: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
e6d0: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
e6e0: 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E %d\n", pFile->
e6f0: 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72  h));.  do{.    r
e700: 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
e710: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
e720: 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
e730: 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
e740: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
e750: 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
e760: 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
e770: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
e780: 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77  PT && (sqlite3_w
e790: 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c  in32_sleep(100),
e7a0: 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
e7b0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
e7c0: 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
e7d0: 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
e7e0: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
e7f0: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
e800: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
e810: 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
e820: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
e830: 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
e840: 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
e850: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
e860: 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
e870: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
e880: 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
e890: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
e8a0: 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
e8b0: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
e8c0: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
e8d0: 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
e8e0: 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
e8f0: 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a  _sleep(100);  /*
e900: 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62   Wait a little b
e910: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61  efore trying aga
e920: 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  in */.    }.    
e930: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
e940: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
e950: 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
e960: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
e970: 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c  E %d %s\n", pFil
e980: 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20  e->h, rc ? "ok" 
e990: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
e9a0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
e9b0: 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
e9c0: 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
e9d0: 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (-1);.  return r
e9e0: 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
e9f0: 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
ea00: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
ea10: 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
ea20: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73          "winClos
ea50: 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
ea60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
ea70: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
ea80: 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
ea90: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
eaa0: 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
eab0: 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
eac0: 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
ead0: 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
eae0: 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
eaf0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
eb00: 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
eb10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
eb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
eb30: 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
eb40: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb60: 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
eb70: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
eb80: 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
ebb0: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
ebc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
ebd0: 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
ebe0: 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
ebf0: 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
ec00: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
ec10: 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50  _WINCE.  OVERLAP
ec20: 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
ec30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ec40: 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46  offset for ReadF
ec50: 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
ec60: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
ec70: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
ec80: 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
ec90: 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
eca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ecb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ecc0: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
ecd0: 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
ece0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
ecf0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ed00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ed10: 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
ed20: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
ed30: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
ed40: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
ed50: 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f  IOERR_READ);.  O
ed60: 53 54 52 41 43 45 28 28 22 52 45 41 44 20 25 64  STRACE(("READ %d
ed70: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
ed80: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
ed90: 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
eda0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
edb0: 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65   if( seekWinFile
edc0: 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20  (pFile, offset) 
edd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ede0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
edf0: 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
ee00: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
ee10: 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
ee20: 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
ee30: 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
ee40: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
ee50: 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
ee60: 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
ee70: 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
ee80: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
ee90: 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
eea0: 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
eeb0: 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
eec0: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
eed0: 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
eee0: 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
eef0: 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
ef00: 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
ef10: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
ef20: 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
ef30: 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
ef40: 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
ef50: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
ef60: 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  retryIoerr(&nRet
ef70: 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
ef80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ef90: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
efa0: 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
efb0: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
efc0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
efd0: 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c  R_READ, pFile->l
efe0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
eff0: 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64 22         "winRead"
f000: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
f010: 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28  .  }.  logIoerr(
f020: 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e  nRetry);.  if( n
f030: 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20  Read<(DWORD)amt 
f040: 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  ){.    /* Unread
f050: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
f060: 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
f070: 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
f080: 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
f090: 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c  pBuf)[nRead], 0,
f0a0: 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20   amt-nRead);.   
f0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
f0c0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
f0d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
f0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f0f0: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
f100: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
f110: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
f120: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f130: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
f140: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
f150: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
f160: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57  .static int winW
f170: 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
f180: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
f190: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
f1a0: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f  to write into */
f1b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
f1c0: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
f1d0: 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20     /* The bytes 
f1e0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
f1f0: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f220: 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a  bytes to write *
f230: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
f240: 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20  4 offset        
f250: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
f260: 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  to the file to b
f270: 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
f280: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
f290: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
f2a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f2b0: 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  if error has occ
f2c0: 75 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65  ured, else false
f2d0: 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
f2e0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
f2f0: 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
f300: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ndle */.  int nR
f310: 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
f320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f330: 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a  ber of retries *
f340: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  /..  assert( amt
f350: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
f360: 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
f370: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
f380: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
f390: 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74  RITE);.  Simulat
f3a0: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72  eDiskfullError(r
f3b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
f3c0: 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  L);..  OSTRACE((
f3d0: 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25  "WRITE %d lock=%
f3e0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
f3f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
f400: 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
f410: 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 73  S_WINCE.  rc = s
f420: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
f430: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
f440: 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a   rc==0 ){.#else.
f450: 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21    {.#endif.#if !
f460: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
f470: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
f480: 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
f490: 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
f4a0: 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a  for WriteFile. *
f4b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  /.#endif.    u8 
f4c0: 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42  *aRem = (u8 *)pB
f4d0: 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  uf;        /* Da
f4e0: 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  ta yet to be wri
f4f0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
f500: 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20  nRem = amt;     
f510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f520: 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74  ber of bytes yet
f530: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
f540: 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69  /.    DWORD nWri
f550: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
f560: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69      /* Bytes wri
f570: 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69  tten by each Wri
f580: 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f  teFile() call */
f590: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
f5a0: 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
f5b0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
f5c0: 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
f5d0: 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21  rror() */..#if !
f5e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
f5f0: 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72      memset(&over
f600: 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f  lapped, 0, sizeo
f610: 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
f620: 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
f630: 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
f640: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
f650: 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  ff);.    overlap
f660: 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
f670: 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
f680: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
f690: 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  f);.#endif..    
f6a0: 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b  while( nRem>0 ){
f6b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
f6c0: 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20 21  INCE.      if( !
f6d0: 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
f6e0: 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
f6f0: 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
f700: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
f710: 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
f720: 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
f730: 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76  em, &nWrite, &ov
f740: 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e  erlapped) ){.#en
f750: 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
f760: 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  retryIoerr(&nRet
f770: 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
f780: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f7a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72   }.      if( nWr
f7b0: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ite<=0 ){.      
f7c0: 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
f7d0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
f7e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f7f0: 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49       }.#if !SQLI
f800: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
f810: 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69    offset += nWri
f820: 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  te;.      overla
f830: 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
f840: 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
f850: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  ffffffff);.     
f860: 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
f870: 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
f880: 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
f890: 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
f8a0: 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  if.      aRem +=
f8b0: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
f8c0: 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
f8d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
f8e0: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
f8f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f900: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
f910: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
f920: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
f930: 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c      if(   ( pFil
f940: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
f950: 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f  ROR_HANDLE_DISK_
f960: 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c  FULL ).       ||
f970: 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
f980: 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f  rno==ERROR_DISK_
f990: 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 72  FULL )){.      r
f9a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
f9b0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
f9c0: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
f9d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
f9e0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
f9f0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
fa00: 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20 70     "winWrite", p
fa10: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
fa20: 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f  }else{.    logIo
fa30: 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
fa40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fa50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
fa60: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
fa70: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
fa80: 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
fa90: 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
faa0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
fab0: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
fac0: 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
fad0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
fae0: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
faf0: 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
fb00: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
fb10: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
fb20: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
fb30: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
fb40: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73  unction */..  as
fb50: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
fb60: 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
fb70: 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c  CATE %d %lld\n",
fb80: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
fb90: 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  ));.  SimulateIO
fba0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
fbb0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
fbc0: 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  TE);..  /* If th
fbd0: 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
fbe0: 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
fbf0: 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
fc00: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
fc10: 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
fc20: 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
fc30: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
fc40: 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
fc50: 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
fc60: 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
fc70: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
fc80: 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
fc90: 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
fca0: 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
fcb0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
fcc0: 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
fcd0: 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
fce0: 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
fcf0: 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
fd00: 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
fd10: 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
fd20: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
fd30: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
fd40: 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
fd50: 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
fd60: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
fd70: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
fd80: 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
fd90: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
fda0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
fdb0: 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
fdc0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
fdd0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
fde0: 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
fdf0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
fe00: 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
fe10: 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
fe20: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
fe30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
fe40: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
fe50: 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
fe60: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
fe70: 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
fe80: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
fe90: 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
fea0: 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
feb0: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f  zPath);.  }..  O
fec0: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
fed0: 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c  E %d %lld %s\n",
fee0: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
fef0: 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20  , rc ? "failed" 
ff00: 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
ff10: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
ff20: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
ff30: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
ff40: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
ff50: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
ff60: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
ff70: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
ff80: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
ff90: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
ffa0: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
ffb0: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
ffc0: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
ffd0: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
ffe0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
fff0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
10000 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
10010 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
10020 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
10030 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
10040 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
10050 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65  t winSync(sqlite
10060 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
10070 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20  flags){.#ifndef 
10080 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
10090 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e   /*.  ** Used on
100a0 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e  ly when SQLITE_N
100b0 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65  O_SYNC is not de
100c0 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42  fined..   */.  B
100d0 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  OOL rc;.#endif.#
100e0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
100f0 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  UG) || !defined(
10100 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20  SQLITE_NO_SYNC) 
10110 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65  || \.    (define
10120 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
10130 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
10140 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20  _DEBUG)).  /*.  
10150 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c  ** Used when SQL
10160 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
10170 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62  ot defined and b
10180 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61  y the assert() a
10190 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41  nd/or.  ** OSTRA
101a0 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20  CE() macros..   
101b0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
101c0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
101d0 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
101e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
101f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
10200 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
10210 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
10220 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
10230 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
10240 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
10250 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
10260 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
10270 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
10280 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
10290 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
102a0 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
102b0 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64  "SYNC %d lock=%d
102c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
102d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
102e0 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
102f0 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
10300 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
10310 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
10320 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
10330 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
10340 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
10350 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
10360 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
10370 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
10380 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
10390 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
103a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
103b0 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
103c0 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
103d0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
103e0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
103f0 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
10400 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
10410 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
10420 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
10430 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
10440 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
10450 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
10460 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
10470 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
10480 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
10490 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
104a0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74  TE_NO_SYNC.  ret
104b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
104c0 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
104d0 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
104e0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
104f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
10500 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
10510 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
10520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
10530 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
10540 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10550 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10560 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
10570 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10580 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
10590 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
105a0 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22         "winSync"
105b0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
105c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
105d0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
105e0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
105f0 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
10600 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
10610 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c   winFileSize(sql
10620 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
10630 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
10640 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  ize){.  winFile 
10650 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
10660 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
10670 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10680 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
10690 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
106a0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
106b0 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23  _IOERR_FSTAT);.#
106c0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
106d0 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
106e0 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
106f0 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
10700 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
10710 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
10720 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
10730 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10750 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
10760 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
10770 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
10780 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
10790 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
107a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
107b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
107c0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
107d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
107e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
107f0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
10800 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
10830 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
10840 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
10850 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
10860 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
10870 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
10880 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
10890 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
108a0 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
108b0 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
108c0 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
108d0 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
108e0 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
108f0 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
10900 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
10910 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
10920 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
10930 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
10940 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10950 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
10960 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
10970 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10980 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
10990 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
109a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
109b0 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
109c0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
109d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
109e0 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
109f0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
10a00 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
10a10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f   rc;.}../*.** LO
10a20 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
10a30 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66  DIATELY is undef
10a40 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e  ined on some Win
10a50 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dows systems..*/
10a60 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
10a70 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
10a80 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  LY.# define LOCK
10a90 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
10aa0 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a  ATELY 1.#endif..
10ab0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
10ac0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a  _EXCLUSIVE_LOCK.
10ad0 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
10ae0 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
10af0 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   2.#endif../*.**
10b00 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53   Historically, S
10b10 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62  QLite has used b
10b20 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  oth the LockFile
10b30 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20   and LockFileEx 
10b40 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68  functions..** Wh
10b50 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  en the LockFile 
10b60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65  function was use
10b70 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73  d, it was always
10b80 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69   expected to fai
10b90 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  l.** immediately
10ba0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75   if the lock cou
10bb0 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ld not be obtain
10bc0 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c  ed.  Also, it al
10bd0 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
10be0 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78  .** obtain an ex
10bf0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54  clusive lock.  T
10c00 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75  hese flags are u
10c10 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63  sed with the Loc
10c20 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
10c30 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20  .** and reflect 
10c40 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f  those expectatio
10c50 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74  ns; therefore, t
10c60 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  hey should not b
10c70 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69  e changed..*/.#i
10c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
10c90 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65  KFILE_FLAGS.# de
10ca0 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
10cb0 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f  FILE_FLAGS   (LO
10cc0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
10cd0 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20  DIATELY | \.    
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f                LO
10d00 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
10d10 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f  _LOCK).#endif../
10d20 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20  *.** Currently, 
10d30 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c  SQLite never cal
10d40 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ls the LockFileE
10d50 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f  x function witho
10d60 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a  ut wanting the.*
10d70 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69  * call to fail i
10d80 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
10d90 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
10da0 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69   obtained..*/.#i
10db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
10dc0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20  KFILEEX_FLAGS.# 
10dd0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
10de0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28  CKFILEEX_FLAGS (
10df0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
10e00 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69  MEDIATELY).#endi
10e10 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
10e20 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
10e30 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
10e40 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
10e50 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
10e60 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
10e70 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
10e80 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  x or WinNT..*/.s
10e90 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
10ea0 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
10eb0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
10ec0 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
10ed0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
10ee0 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20  WINCE.    /*.   
10ef0 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
10f00 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
10f10 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
10f20 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
10f30 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a   the Win32.    *
10f40 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
10f50 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20  FileEx..    */. 
10f60 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f     res = winceLo
10f70 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
10f80 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
10f90 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  0, 1, 0);.#else.
10fa0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
10fb0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
10fc0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
10fd0 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44  EX_FLAGS, SHARED
10fe0 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20  _FIRST, 0,.     
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
11010 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
11020 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
11030 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
11040 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20  {.    int lk;.  
11050 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
11060 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c  ness(sizeof(lk),
11070 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65   &lk);.    pFile
11080 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
11090 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26   = (short)((lk &
110a0 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
110b0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b  ARED_SIZE - 1));
110c0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
110d0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
110e0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
110f0 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11110 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
11120 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
11130 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  e, 0, 1, 0);.  }
11140 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65  .#endif.  if( re
11150 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  s == 0 ){.    pF
11160 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11170 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
11180 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65  );.    /* No nee
11190 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75  d to log a failu
111a0 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  re to lock */.  
111b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
111c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
111d0 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
111e0 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61  ic int unlockRea
111f0 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
11200 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
11210 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
11220 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  rno;.  if( isNT(
11230 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  ) ){.    res = w
11240 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
11250 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
11260 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
11270 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69  SIZE, 0);.  }.#i
11280 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
11290 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
112a0 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  e{.    res = win
112b0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
112c0 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
112d0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
112e0 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
112f0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
11300 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
11310 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
11320 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
11330 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44  ERROR_NOT_LOCKED
11340 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
11350 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
11360 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
11370 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11380 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c  ERR_UNLOCK, pFil
11390 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
113a0 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f             "unlo
113b0 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69  ckReadLock", pFi
113c0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
113d0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
113e0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
113f0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
11400 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
11410 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
11420 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
11430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
11440 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
11450 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11460 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
11470 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
11480 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
11490 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
114a0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
114b0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
114c0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
114d0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
114e0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
114f0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
11500 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
11510 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
11520 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
11530 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
11540 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
11550 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
11560 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
11570 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
11580 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
11590 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
115a0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
115b0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
115c0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
115d0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
115e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
115f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
11600 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
11610 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
11620 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
11630 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
11640 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11650 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
11660 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
11670 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
11680 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
11690 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
116a0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
116b0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
116c0 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28    The winUnlock(
116d0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61  ) routine.** era
116e0 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74  ses all locks at
116f0 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e   once and return
11700 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  s us immediately
11710 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
11720 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  l 0..** It is no
11730 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f  t possible to lo
11740 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11750 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61  level one step a
11760 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a  t a time.  You.*
11770 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67  * must go straig
11780 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ht to locking le
11790 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  vel 0..*/.static
117a0 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c   int winLock(sql
117b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
117c0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
117d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
117e0 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  OK;    /* Return
117f0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f   code from subro
11800 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20  utines */.  int 
11810 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
11820 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
11830 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63  a Windows lock c
11840 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  all */.  int new
11850 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  Locktype;       
11860 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f  /* Set pFile->lo
11870 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76  cktype to this v
11880 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74  alue before exit
11890 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74  ing */.  int got
118a0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
118b0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63  /* True if we ac
118c0 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47  quired a PENDING
118d0 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20   lock this time 
118e0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
118f0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
11900 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  id;.  DWORD last
11910 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
11920 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
11930 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
11940 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73  ("LOCK %d %d was
11950 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
11960 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
11970 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65   locktype, pFile
11980 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
11990 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
119a0 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
119b0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
119c0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
119d0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
119e0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
119f0 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
11a00 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
11a10 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
11a20 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
11a30 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
11a40 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
11a50 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
11a60 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
11a70 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
11a80 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
11a90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11aa0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
11ab0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
11ac0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
11ad0 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
11ae0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11af0 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
11b00 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
11b10 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11b20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
11b30 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
11b40 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
11b50 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
11b60 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
11b70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
11b80 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
11b90 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
11ba0 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
11bb0 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
11bc0 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
11bd0 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
11be0 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
11bf0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
11c00 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
11c10 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
11c20 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
11c30 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
11c40 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
11c50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11c60 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65  ;.  if(   (pFile
11c70 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
11c80 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20  OCK).     || (  
11c90 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
11ca0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20  USIVE_LOCK).    
11cb0 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e       && (pFile->
11cc0 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
11cd0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
11ce0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
11cf0 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
11d00 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e  >0 && (res = win
11d10 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
11d20 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
11d30 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
11d70 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
11d80 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
11d90 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
11da0 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
11db0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
11dc0 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
11dd0 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
11de0 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
11df0 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
11e00 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
11e10 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
11e20 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
11e30 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
11e40 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
11e50 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
11e60 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
11e70 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
11e80 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
11e90 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
11ea0 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
11eb0 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
11ec0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11ed0 20 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64   OSTRACE(("could
11ee0 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49   not get a PENDI
11ef0 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c  NG lock. cnt=%d\
11f00 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20  n", cnt));.     
11f10 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74   if( cnt ) sqlit
11f20 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
11f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
11f40 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65  PendingLock = re
11f50 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20  s;.    if( !res 
11f60 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  ){.      lastErr
11f70 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11f80 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
11f90 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
11fa0 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
11fb0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
11fc0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
11fd0 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
11fe0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
11ff0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
12000 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61      res = getRea
12010 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
12020 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
12030 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
12040 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
12050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
12060 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
12070 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
12080 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
12090 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
120a0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
120b0 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
120c0 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
120d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
120e0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
120f0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
12100 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
12110 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
12120 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
12130 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42  LAGS, RESERVED_B
12140 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
12150 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
12160 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
12170 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b  = RESERVED_LOCK;
12180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12190 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
121a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
121b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
121c0 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  Acquire a PENDIN
121d0 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  G lock.  */.  if
121e0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
121f0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
12200 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b  s ){.    newLock
12210 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
12220 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64  OCK;.    gotPend
12230 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d  ingLock = 0;.  }
12240 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
12250 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
12270 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
12280 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
12290 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
122a0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52  ->locktype>=SHAR
122b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
122c0 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c  es = unlockReadL
122d0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
122e0 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65 61 64  OSTRACE(("unread
122f0 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65  lock = %d\n", re
12300 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  s));.    res = w
12310 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
12320 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
12330 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41  KFILE_FLAGS, SHA
12340 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
12370 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
12380 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
12390 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
123a0 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
123b0 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
123c0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
123d0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
123e0 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64  RACE(("error-cod
123f0 65 20 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45  e = %d\n", lastE
12400 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 65  rrno));.      ge
12410 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
12420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12430 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
12440 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
12450 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
12460 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
12470 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
12480 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
12490 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
124a0 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
124b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
124c0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
124d0 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
124e0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
124f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
12500 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ate the state of
12510 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65   the lock has he
12520 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  ld in the file d
12530 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20  escriptor then. 
12540 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61   ** return the a
12550 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c  ppropriate resul
12560 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  t code..  */.  i
12570 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63  f( res ){.    rc
12580 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12590 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41  }else{.    OSTRA
125a0 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44  CE(("LOCK FAILED
125b0 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25   %d trying for %
125c0 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c  d but got %d\n",
125d0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
125e0 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20        locktype, 
125f0 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  newLocktype));. 
12600 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12610 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
12620 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12630 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69  _BUSY;.  }.  pFi
12640 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
12650 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a  u8)newLocktype;.
12660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12670 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12680 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
12690 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
126a0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
126b0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
126c0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
126d0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
126e0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
126f0 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
12700 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74  .** non-zero, ot
12710 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f  herwise zero..*/
12720 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
12730 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12740 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12750 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12760 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69  {.  int rc;.  wi
12770 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12780 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
12790 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
127a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
127b0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
127c0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
127d0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
127e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
127f0 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
12800 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
12810 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  1;.    OSTRACE((
12820 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12830 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20   %d (local)\n", 
12840 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
12850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
12860 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
12870 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
12880 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
12890 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
128a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
128b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e   rc ){.      win
128c0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
128d0 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
128e0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
128f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
12900 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  c;.    OSTRACE((
12910 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12920 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c   %d (remote)\n",
12930 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
12940 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
12950 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53  = rc;.  return S
12960 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12970 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
12980 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
12990 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64  le descriptor id
129a0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
129b0 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
129c0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
129d0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
129e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
129f0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12a00 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12a10 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12a20 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12a30 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
12a40 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
12a50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12a60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  op..**.** It is 
12a70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
12a80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
12a90 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63   fail if the sec
12aa0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
12ab0 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20  is NO_LOCK.  If 
12ac0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12ad0 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f  ent is SHARED_LO
12ae0 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  CK then this rou
12af0 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65  tine.** might re
12b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12b10 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R;.*/.static int
12b20 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   winUnlock(sqlit
12b30 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12b40 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
12b50 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c  t type;.  winFil
12b60 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
12b70 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
12b80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12b90 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
12ba0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  0 );.  assert( l
12bb0 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
12bc0 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43  LOCK );.  OSTRAC
12bd0 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f  E(("UNLOCK %d to
12be0 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
12bf0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
12c00 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
12c10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12c20 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
12c30 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70  ockByte));.  typ
12c40 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
12c50 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
12c60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
12c70 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
12c80 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12c90 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
12ca0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
12cb0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
12cc0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
12cd0 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28  && !getReadLock(
12ce0 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
12cf0 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
12d00 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
12d10 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
12d20 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
12d30 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
12d40 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
12d50 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
12d60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
12d70 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c  R_UNLOCK, osGetL
12d80 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
12d90 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
12da0 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
12db0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
12dc0 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
12dd0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
12de0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
12df0 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
12e00 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
12e10 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
12e20 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
12e30 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
12e40 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  LOCK ){.    unlo
12e50 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
12e60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70  );.  }.  if( typ
12e70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
12e80 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
12e90 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12ea0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
12eb0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
12ec0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
12ed0 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
12ee0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12ef0 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
12f00 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61  inititially nega
12f10 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
12f20 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
12f30 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
12f40 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
12f50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
12f60 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
12f70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
12f80 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
12f90 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
12fa0 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
12fb0 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
12fc0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
12fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12fe0 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46   winModeBit(winF
12ff0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
13000 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
13010 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
13020 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
13030 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
13040 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
13050 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
13060 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
13070 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
13080 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
13090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
130a0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
130b0 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
130c0 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20  .** Control and 
130d0 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65  query of the ope
130e0 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
130f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13100 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
13110 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13120 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
13130 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
13140 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
13150 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
13160 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
13170 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
13180 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
13190 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
131a0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
131b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
131c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
131d0 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
131e0 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
131f0 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74  int*)pArg = (int
13200 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  )pFile->lastErrn
13210 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
13220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
13230 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
13240 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
13250 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
13260 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
13270 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
13280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
132a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
132b0 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
132c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
132d0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unk>0 ){.       
132e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
132f0 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  ldSz;.        in
13300 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69  t rc = winFileSi
13310 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a  ze(id, &oldSz);.
13320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
13330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
13350 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73  nt64 newSz = *(s
13360 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41  qlite3_int64*)pA
13370 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rg;.          if
13380 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b  ( newSz>oldSz ){
13390 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
133a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
133b0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(1);.         
133c0 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
133d0 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a  ate(id, newSz);.
133e0 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
133f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
13400 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(0);.          
13410 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13420 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
13440 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13450 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
13460 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
13470 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
13480 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
13490 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
134a0 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
134b0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
134c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
134d0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
134e0 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
134f0 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
13500 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
13510 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
13520 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
13530 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
13540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
13550 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13560 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
13570 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
13580 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
13590 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b  printf("win32");
135a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
135b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
135c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
135d0 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
135e0 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  TRY: {.      int
135f0 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67   *a = (int*)pArg
13600 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d  ;.      if( a[0]
13610 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
13620 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20  n32IoerrRetry = 
13630 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
13640 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
13650 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  = win32IoerrRetr
13660 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
13670 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20   if( a[1]>0 ){. 
13680 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72         win32Ioer
13690 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b  rRetryDelay = a[
136a0 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
136b0 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20  .        a[1] = 
136c0 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
136d0 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  elay;.      }.  
136e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
136f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
13700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13710 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
13720 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
13730 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
13740 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
13750 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
13760 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
13770 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
13780 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
13790 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
137a0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
137b0 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
137c0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
137d0 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
137e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
137f0 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
13800 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
13810 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
13820 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
13830 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
13840 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
13850 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
13860 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
13870 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
13880 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
13890 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
138a0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
138b0 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f  tic int winSecto
138c0 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
138d0 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64  le *id){.  (void
138e0 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
138f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
13900 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
13910 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74  ** Return a vect
13920 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61  or of device cha
13930 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f  racteristics..*/
13940 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
13950 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
13960 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
13970 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c  e *id){.  winFil
13980 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a  e *p = (winFile*
13990 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
139a0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
139b0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
139c0 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d   |.         ((p-
139d0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
139e0 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54  FILE_PSOW)?SQLIT
139f0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
13a00 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a  E_OVERWRITE:0);.
13a10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13a20 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a  E_OMIT_WAL../* .
13a30 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20  ** Windows will 
13a40 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65  only let you cre
13a50 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61  ate file view ma
13a60 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c  ppings.** on all
13a70 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61  ocation size gra
13a80 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72  nularity boundar
13a90 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73  ies..** During s
13aa0 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
13ab0 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74   we do a GetSyst
13ac0 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67  emInfo().** to g
13ad0 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69  et the granulari
13ae0 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54  ty size..*/.SYST
13af0 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e  EM_INFO winSysIn
13b00 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  fo;../*.** Helpe
13b10 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
13b20 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
13b30 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
13b40 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
13b50 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
13b60 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
13b70 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62  e winLockInfo ob
13b80 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a  jects used by .*
13b90 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  * this file, all
13ba0 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
13bb0 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
13bc0 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
13bd0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53  ** Function winS
13be0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
13bf0 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
13c00 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
13c10 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
13c20 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
13c30 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
13c40 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
13c50 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
13c60 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
13c70 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77  . e.g..**.**   w
13c80 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
13c90 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
13ca0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
13cb0 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68  () );.**   winSh
13cc0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f  mLeaveMutex().*/
13cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
13ce0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  ShmEnterMutex(vo
13cf0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
13d00 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
13d10 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13d20 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13d30 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
13d40 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c  tic void winShmL
13d50 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
13d60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13d70 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
13d80 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13d90 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
13da0 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
13db0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
13dc0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75  tic int winShmMu
13dd0 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
13de0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13df0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
13e00 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
13e10 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
13e20 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
13e30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
13e40 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
13e50 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
13e60 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
13e70 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
13e80 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
13e90 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
13ea0 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
13eb0 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
13ec0 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
13ed0 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
13ee0 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
13ef0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
13f00 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
13f10 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
13f20 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
13f30 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
13f40 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
13f50 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
13f60 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
13f70 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
13f80 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
13f90 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
13fa0 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
13fb0 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
13fc0 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
13fd0 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
13fe0 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
13ff0 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
14000 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
14010 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a      pNext .**.**
14020 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
14030 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
14040 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
14050 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
14060 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
14070 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
14080 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
14090 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  winShmNode.mutex
140a0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
140b0 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
140c0 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68  ==0 and.** winSh
140d0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
140e0 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
140f0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
14100 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
14110 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
14120 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20  e..**.*/.struct 
14130 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73  winShmNode {.  s
14140 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
14150 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
14160 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
14170 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
14180 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
14190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
141a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
141b0 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b    winFile hFile;
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141d0 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
141e0 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69   winOpen */..  i
141f0 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
14200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
14210 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
14220 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
14230 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  int nRegion;    
14240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
14250 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
14260 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  gion */.  struct
14270 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20   ShmRegion {.   
14280 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
14290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
142a0 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72  e handle from Cr
142b0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20  eateFileMapping 
142c0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  */.    void *pMa
142d0 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b  p;.  } *aRegion;
142e0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
142f0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
14300 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
14310 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
14320 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20   I/O error */.. 
14330 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
14340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14350 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20  umber of winShm 
14360 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
14370 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
14380 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  nShm *pFirst;   
14390 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
143a0 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
143b0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
143c0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
143d0 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
143e0 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20  /* Next in list 
143f0 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
14400 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  e objects */.#if
14410 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14420 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14440 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
14450 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  winShm.id value 
14460 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
14470 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
14480 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  ay of all winShm
14490 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Node objects..**
144a0 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75  .** The winShmMu
144b0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
144c0 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
144d0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
144e0 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
144f0 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20  atic winShmNode 
14500 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20  *winShmNodeList 
14510 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  = 0;../*.** Stru
14520 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
14530 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
14540 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
14550 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
14560 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
14570 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
14580 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14590 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
145a0 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
145b0 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
145c0 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
145d0 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
145e0 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77  fter:.**.**    w
145f0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  inShm.pShmNode.*
14600 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a  *    winShm.id.*
14610 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
14620 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
14630 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68  rite.  The winSh
14640 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
14650 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
14660 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
14670 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
14680 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
14690 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
146a0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
146b0 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
146c0 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
146d0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
146e0 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14700 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
14710 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
14720 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
14730 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
14740 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14750 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
14760 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
14770 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
14780 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14790 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
147a0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
147b0 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
147c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
147d0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
147e0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
147f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14800 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14820 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
14830 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20  ection with its 
14840 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65  winShmNode */.#e
14850 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.};../*.** C
14860 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
14870 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
14880 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53  fine WIN_SHM_BAS
14890 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
148a0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
148b0 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
148c0 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
148d0 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20  ne WIN_SHM_DMS  
148e0 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b    (WIN_SHM_BASE+
148f0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
14900 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
14910 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
14920 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f  pply advisory lo
14930 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79  cks for all n by
14940 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  tes beginning at
14950 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   ofst..*/.#defin
14960 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a  e _SHM_UNLCK  1.
14970 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c  #define _SHM_RDL
14980 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53  CK  2.#define _S
14990 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74  HM_WRLCK  3.stat
149a0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73  ic int winShmSys
149b0 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68  temLock(.  winSh
149c0 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20  mNode *pFile,   
149d0 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
149e0 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
149f0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
14a00 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
14a10 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Type,         /*
14a20 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48   _SHM_UNLCK, _SH
14a30 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d  M_RDLCK, or _SHM
14a40 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
14a50 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
14a60 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66    /* Offset to f
14a70 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
14a80 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20  locked/unlocked 
14a90 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20  */.  int nByte  
14aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14ab0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
14ac0 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
14ad0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
14ae0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
14af0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
14b00 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c  m Lock/UnlockFil
14b10 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  eEx() */..  /* A
14b20 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e  ccess to the win
14b30 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
14b40 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
14b50 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
14b60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14b70 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
14b80 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c  ->mutex) || pFil
14b90 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
14ba0 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
14bb0 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
14bc0 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
14bd0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
14be0 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
14bf0 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  c = winUnlockFil
14c00 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
14c10 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  h, ofst, 0, nByt
14c20 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
14c30 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
14c40 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
14c50 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
14c60 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20  DWORD dwFlags = 
14c70 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
14c80 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69  MEDIATELY;.    i
14c90 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
14ca0 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
14cb0 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
14cc0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
14cd0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
14ce0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
14cf0 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f  le.h, dwFlags, o
14d00 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
14d10 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20  );.  }.  .  if( 
14d20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63  rc!= 0 ){.    rc
14d30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14d40 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
14d50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f  ->lastErrno =  o
14d60 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
14d70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14d80 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _BUSY;.  }..  OS
14d90 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
14da0 20 25 64 20 25 73 20 25 73 20 30 78 25 30 38 6c   %d %s %s 0x%08l
14db0 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  x\n", .         
14dc0 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
14dd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d  ,.           rc=
14de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
14df0 22 20 3a 20 22 66 61 69 6c 65 64 22 2c 0a 20 20  " : "failed",.  
14e00 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 54 79 70           lockTyp
14e10 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20  e==_SHM_UNLCK ? 
14e20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a  "UnlockFileEx" :
14e30 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20   "LockFileEx",. 
14e40 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14e50 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20  >lastErrno));.. 
14e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14e70 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
14e80 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68  nces to VFS meth
14e90 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods */.static in
14ea0 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65  t winOpen(sqlite
14eb0 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61  3_vfs*,const cha
14ec0 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  r*,sqlite3_file*
14ed0 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74  ,int,int*);.stat
14ee0 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
14ef0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63  (sqlite3_vfs *,c
14f00 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
14f10 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
14f20 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  e winShmNodeList
14f30 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
14f40 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d  ries with winShm
14f50 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
14f60 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
14f70 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
14f80 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
14f90 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
14fa0 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
14fb0 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
14fc0 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
14fd0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
14fe0 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f  hmPurge(sqlite3_
14ff0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64  vfs *pVfs, int d
15000 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69  eleteFlag){.  wi
15010 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20  nShmNode **pp;. 
15020 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a   winShmNode *p;.
15030 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73    BOOL bRc;.  as
15040 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
15050 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 70 70 20  xHeld() );.  pp 
15060 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  = &winShmNodeLis
15070 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d  t;.  while( (p =
15080 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20   *pp)!=0 ){.    
15090 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
150a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
150b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65       if( p->mute
150c0 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x ) sqlite3_mute
150d0 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
150e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
150f0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
15100 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 62 52 63  ++){.        bRc
15110 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66   = osUnmapViewOf
15120 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  File(p->aRegion[
15130 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].pMap);.      
15140 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
15150 50 55 52 47 45 20 70 69 64 2d 25 64 20 75 6e 6d  PURGE pid-%d unm
15160 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c  ap region=%d %s\
15170 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15180 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43       (int)osGetC
15190 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
151a0 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ), i,.          
151b0 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b         bRc ? "ok
151c0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
151d0 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
151e0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
151f0 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
15200 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
15210 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
15220 2d 25 64 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e  -%d close region
15230 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
15240 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
15250 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f  )osGetCurrentPro
15260 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20  cessId(), i,.   
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
15280 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
15290 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
152a0 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c       if( p->hFil
152b0 65 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48  e.h != INVALID_H
152c0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
152d0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
152e0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
152f0 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
15300 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
15310 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
15320 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
15330 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
15340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15350 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
15360 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
15370 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
15380 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15390 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
153a0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
153b0 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
153c0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
153d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
153e0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
153f0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
15400 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
15410 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15420 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
15430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15440 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
15450 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15460 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
15470 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
15480 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
15490 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
154a0 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
154b0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
154c0 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
154d0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
154e0 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
154f0 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
15500 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
15510 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
15520 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
15530 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
15540 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
15550 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
15560 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
15570 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
15580 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
15590 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
155a0 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
155b0 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
155c0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
155d0 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
155e0 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
155f0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
15620 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
15630 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
15640 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
15650 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
15660 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
15670 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
15680 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
156b0 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
156c0 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
156d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
156e0 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
156f0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
15700 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15720 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
15730 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
15740 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
15750 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
15760 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
15770 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
15780 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
15790 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
157a0 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
157b0 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
157c0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
157d0 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
157e0 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
157f0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
15800 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
15810 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
15820 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
15830 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15840 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
15850 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
15860 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
15870 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
15880 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
15890 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
158a0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  loc( sizeof(*pSh
158b0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
158c0 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
158d0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
158e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
158f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15900 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
15910 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
15920 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
15930 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 29 3b 0a 20  + nName + 17);. 
15940 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
15950 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
15960 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
15970 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
15980 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
15990 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
159a0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
159b0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
159c0 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
159d0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
159e0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
159f0 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
15a00 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
15a10 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
15a20 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
15a30 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
15a40 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
15a50 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
15a60 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
15a70 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
15a80 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
15a90 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
15aa0 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
15ab0 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
15ac0 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
15ad0 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
15ae0 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
15af0 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
15b00 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
15b10 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
15b20 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
15b30 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
15b40 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15b50 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
15b60 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
15b70 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
15b80 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
15b90 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
15ba0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
15bb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15bc0 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
15bd0 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
15be0 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
15bf0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
15c00 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
15c10 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
15c20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
15c30 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
15c40 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
15c50 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
15c60 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
15c70 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
15c80 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
15c90 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
15ca0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
15cb0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
15cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15cd0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
15ce0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
15cf0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
15d00 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
15d10 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
15d20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
15d30 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d50 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
15d60 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
15d80 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
15d90 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
15da0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
15db0 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
15dc0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
15dd0 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
15de0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
15df0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
15e00 41 54 45 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61  ATE, /* Mode fla
15e10 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
15e20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
15e30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15e40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
15e50 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
15e60 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
15e70 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
15e80 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
15e90 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
15ea0 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
15eb0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
15ec0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
15ed0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
15ee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
15ef0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
15f00 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
15f10 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
15f20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
15f30 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
15f40 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
15f50 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
15f60 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
15f70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15f90 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
15fa0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
15fb0 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
15fc0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
15fd0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f             "winO
15fe0 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e  penShm", pDbFd->
15ff0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
16000 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16020 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65       winShmSyste
16030 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
16040 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
16050 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
16060 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
16070 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
16080 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57  e, _SHM_RDLCK, W
16090 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
160a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
160b0 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
160c0 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _err;.  }..  /* 
160d0 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
160e0 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
160f0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  of the winShmNod
16100 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
16110 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
16120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
16130 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
16140 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
16150 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
16160 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
16170 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
16180 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
16190 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
161a0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
161b0 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
161c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
161d0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
161e0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
161f0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74  of the winShmEnt
16200 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
16210 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
16220 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
16230 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d  w (struct winShm
16240 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
16250 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
16260 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
16270 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
16280 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
16290 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
162a0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
162b0 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
162c0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
162d0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
162e0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
162f0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
16300 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
16310 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
16320 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16330 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
16340 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
16350 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
16360 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
16370 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
16380 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16390 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
163a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
163b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
163c0 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
163d0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
163e0 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74  rr:.  winShmSyst
163f0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
16400 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
16410 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
16420 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
16430 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20  d->pVfs, 0);    
16440 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
16450 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
16460 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
16470 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16480 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16490 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  New);.  winShmLe
164a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
164b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
164c0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
164d0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
164e0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
164f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
16500 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
16510 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
16520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16530 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  inShmUnmap(.  sq
16540 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
16560 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
16570 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
16580 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
16590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
165a0 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69  lete after closi
165b0 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ng if true */.){
165c0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
165d0 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  d;       /* Data
165e0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
165f0 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red-memory */.  
16600 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
16610 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
16620 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
16630 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  osed */.  winShm
16640 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
16650 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
16660 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
16670 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  file */.  winShm
16680 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
16690 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
166a0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
166b0 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44  ections */..  pD
166c0 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
166d0 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
166e0 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
166f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
16700 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
16710 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
16720 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
16730 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
16740 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
16750 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
16760 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
16770 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
16780 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
16790 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
167a0 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
167b0 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
167c0 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
167d0 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
167e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
167f0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
16800 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
16810 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
16820 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
16830 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
16840 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
16850 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
16860 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
16870 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
16880 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
16890 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
168a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
168b0 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e  le, too */.  win
168c0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
168d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
168e0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
168f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
16900 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
16910 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
16920 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
16930 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74  bFd->pVfs, delet
16940 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69  eFlag);.  }.  wi
16950 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
16960 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
16970 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16980 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
16990 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
169a0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
169b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
169c0 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73   winShmLock(.  s
169d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
169e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
169f0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
16a00 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
16a10 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
16a20 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
16a30 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
16a40 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
16a50 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
16a60 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
16a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16a80 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
16a90 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
16aa0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
16ad0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
16ae0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
16af0 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
16b00 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  )fd;        /* C
16b10 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
16b20 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
16b30 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  */.  winShm *p =
16b40 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
16b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16b60 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
16b70 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
16b80 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20    winShm *pX;   
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ba0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16bb0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
16bc0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69  siblings */.  wi
16bd0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
16be0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
16bf0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16c00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16c20 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
16c30 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
16c60 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
16c70 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
16c80 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
16c90 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
16ca0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
16cb0 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
16cc0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
16cd0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
16ce0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
16cf0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
16d00 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
16d10 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
16d20 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
16d30 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
16d40 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
16d50 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
16d60 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
16d70 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
16d80 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
16d90 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
16da0 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
16db0 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
16dc0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
16dd0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a  CLUSIVE)!=0 );..
16de0 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28    mask = (u16)((
16df0 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  1U<<(ofst+n)) - 
16e00 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61  (1U<<ofst));.  a
16e10 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
16e20 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
16e30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16e40 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
16e50 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
16e60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
16e70 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
16e80 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
16e90 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
16ea0 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
16eb0 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
16ec0 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
16ed0 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
16ee0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
16ef0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
16f00 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
16f10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
16f20 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
16f30 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
16f40 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
16f50 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
16f60 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
16f70 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
16f80 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
16f90 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
16fa0 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
16fb0 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
16fc0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
16fd0 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
16fe0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
16ff0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
17000 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
17010 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  UNLCK, ofst+WIN_
17020 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
17030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
17040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
17060 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
17070 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
17080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17090 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
170a0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
170b0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
170c0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20   ~mask;.    } . 
170d0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
170e0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
170f0 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
17100 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
17110 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
17120 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
17130 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
17140 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
17150 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
17160 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
17170 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
17180 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
17190 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
171a0 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
171b0 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
171c0 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
171d0 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
171e0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
171f0 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
17200 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
17210 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
17220 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
17230 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
17240 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
17250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
17260 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
17270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17280 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
17290 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
172a0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
172b0 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
172c0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
172d0 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
172e0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
172f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17300 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
17310 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
17320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
17330 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
17340 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
17350 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
17360 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
17370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17390 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
173a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
173b0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
173c0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
173d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
173e0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
173f0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
17400 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
17410 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
17420 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
17430 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
17440 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
17450 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
17460 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
17470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
17480 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
17490 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
174a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
174b0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
174c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
174d0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
174e0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
174f0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
17500 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
17510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17520 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
17530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17540 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
17550 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
17560 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
17570 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
17580 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
17590 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
175a0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
175b0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
175c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
175d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
175e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
175f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
17600 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
17610 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
17620 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
17630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
17650 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
17660 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
17670 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
17680 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
17690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
176a0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
176b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
176c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
176d0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
176e0 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
176f0 67 6f 74 20 25 30 33 78 2c 25 30 33 78 20 25 73  got %03x,%03x %s
17700 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17710 70 2d 3e 69 64 2c 20 28 69 6e 74 29 6f 73 47 65  p->id, (int)osGe
17720 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
17730 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
17740 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
17750 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3f  .           rc ?
17760 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
17770 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
17790 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
177a0 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
177b0 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
177c0 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
177d0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
177e0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
177f0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
17800 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
17810 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
17820 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
17830 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
17840 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
17850 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  inShmBarrier(.  
17860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
17870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
17880 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
17890 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
178a0 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
178b0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
178c0 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  /* MemoryBarrier
178d0 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20  (); // does not 
178e0 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b  work -- do not k
178f0 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20  now why not */. 
17900 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
17910 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  x();.  winShmLea
17920 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
17930 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17940 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
17950 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
17960 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
17970 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
17980 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
17990 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
179a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
179b0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
179c0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
179d0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
179e0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
179f0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
17a00 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
17a10 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
17a20 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
17a30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
17a40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
17a50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
17a60 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
17a70 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
17a80 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65  , if the isWrite
17a90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
17aa0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
17ab0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
17ac0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
17ad0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
17ae0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
17af0 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
17b00 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
17b10 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
17b20 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
17b30 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
17b40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
17b50 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65  . If .** isWrite
17b60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
17b70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
17b80 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
17b90 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
17ba0 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
17bb0 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
17bc0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
17bd0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
17be0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
17bf0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
17c00 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
17c10 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
17c20 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
17c30 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
17c40 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
17c50 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
17c60 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
17c70 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
17c80 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
17c90 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
17ca0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
17cb0 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
17cc0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
17cd0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
17ce0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
17cf0 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
17d00 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
17d10 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
17d20 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
17d30 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17d40 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
17d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17d60 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
17d70 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
17d80 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
17d90 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17da0 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
17db0 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20  nt isWrite,     
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17dd0 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
17de0 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
17df0 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
17e00 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
17e10 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
17e20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
17e30 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
17e40 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
17e50 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
17e60 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
17e70 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
17e80 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
17e90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
17ea0 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
17eb0 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
17ec0 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
17ed0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ee0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17ef0 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64  c;.    p = pDbFd
17f00 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53  ->pShm;.  }.  pS
17f10 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
17f20 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Node;..  sqlite3
17f30 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
17f40 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
17f50 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
17f60 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
17f70 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
17f80 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
17f90 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
17fa0 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
17fb0 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  on ){.    struct
17fc0 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65   ShmRegion *apNe
17fd0 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
17fe0 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72  New aRegion[] ar
17ff0 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
18000 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
18010 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
18020 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
18030 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
18040 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
18050 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
18060 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
18070 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64   size of wal-ind
18080 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ex file */..    
18090 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
180a0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
180b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
180c0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
180d0 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
180e0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
180f0 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
18100 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
18110 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
18120 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
18130 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
18140 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
18150 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
18160 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
18170 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
18180 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
18190 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
181a0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
181b0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a  Node->hFile, &sz
181c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
181d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
181e0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
181f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
18200 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
18210 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
18220 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
18230 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap1", pDbFd->z
18240 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74  Path);.      got
18250 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
18260 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a     }..    if( sz
18270 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
18280 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
18290 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
182a0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
182b0 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74  f isWrite is set
182c0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   to.      ** zer
182d0 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  o, exit early. *
182e0 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
182f0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
18300 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
18310 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18320 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
18330 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  if isWrite is no
18340 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75  n-zero, use ftru
18350 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
18360 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
18370 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
18380 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
18390 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
183a0 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d  Write ) goto shm
183b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
183c0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
183d0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
183e0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
183f0 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  e, nByte);.     
18400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
18420 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
18430 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
18440 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
18450 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
18460 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
18470 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap2", pDbFd->zPa
18480 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  th);.        got
18490 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
184a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
184b0 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
184c0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
184d0 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
184e0 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
184f0 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
18500 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53  pNew = (struct S
18510 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74  hmRegion *)sqlit
18520 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
18530 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
18540 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
18550 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b  1)*sizeof(apNew[
18560 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0]).    );.    i
18570 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
18580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
18590 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
185a0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
185b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
185c0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
185d0 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
185e0 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
185f0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
18600 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
18610 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
18620 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
18630 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
18640 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
18650 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18660 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
18670 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20  y region */.    
18680 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   .#if SQLITE_OS_
18690 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70  WINRT.      hMap
186a0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
186b0 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53  appingFromApp(pS
186c0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
186d0 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
186e0 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
186f0 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
18700 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
18710 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
18720 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53  eFileMappingW(pS
18730 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
18740 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c   .          NULL
18750 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
18760 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
18770 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  .      );.#endif
18780 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18790 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20  "SHM-MAP pid-%d 
187a0 63 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64  create region=%d
187b0 20 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c   nbyte=%d %s\n",
187c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
187d0 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
187e0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
187f0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
18800 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
18810 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f         hMap ? "o
18820 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
18830 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20  .      if( hMap 
18840 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
18850 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64  Offset = pShmNod
18860 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
18870 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ion;.        int
18880 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
18890 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
188a0 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
188b0 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69  nGranularity;.#i
188c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
188d0 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  T.        pMap =
188e0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
188f0 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49  FromApp(hMap, FI
18900 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
18910 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
18920 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65            iOffse
18930 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
18940 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
18950 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
18960 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
18970 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
18980 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20  iewOfFile(hMap, 
18990 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
189a0 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
189b0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
189c0 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
189d0 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
189e0 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
189f0 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
18a00 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
18a10 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25  (("SHM-MAP pid-%
18a20 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  d map region=%d 
18a30 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25  offset=%d size=%
18a40 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
18a50 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
18a60 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
18a70 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
18a80 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73  ->nRegion, iOffs
18a90 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
18aa0 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70       szRegion, p
18ab0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
18ac0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  iled"));.      }
18ad0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70  .      if( !pMap
18ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d   ){.        pShm
18af0 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  Node->lastErrno 
18b00 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
18b10 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ();.        rc =
18b20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
18b30 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
18b40 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74  , pShmNode->last
18b50 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
18b60 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
18b70 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
18b80 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
18b90 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
18ba0 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
18bb0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
18bc0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
18bd0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
18be0 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
18bf0 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
18c00 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
18c10 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
18c20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
18c30 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
18c40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
18c50 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
18c60 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
18c70 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
18c80 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
18c90 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
18ca0 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
18cb0 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
18cc0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
18cd0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
18ce0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
18cf0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
18d00 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
18d10 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
18d20 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
18d30 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
18d40 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
18d50 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
18d60 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
18d70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
18d80 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
18d90 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
18da0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
18db0 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
18dc0 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
18dd0 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
18de0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
18df0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
18e00 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
18e10 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
18e20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18e30 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
18e40 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
18e50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
18e60 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
18e70 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
18e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e90 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
18ea0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
18eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18f20 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
18f30 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
18f40 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
18f50 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
18f60 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
18f70 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
18f80 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
18f90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
18fa0 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
18fb0 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
18fe0 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
19010 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
19040 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19060 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
19070 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19090 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
190a0 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
190d0 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190f0 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
19100 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
19130 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19150 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
19160 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
19170 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
19180 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
19190 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
191a0 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
191b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
191c0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
191d0 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191f0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
19200 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
19210 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
19220 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
19230 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
19240 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19260 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
19270 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19290 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
192a0 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
192d0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
192e0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
192f0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
19300 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  ap */.};../*****
19310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19350 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
19360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19370 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
19380 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193a0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
193b0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
193c0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
193d0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
193e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
193f0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
19400 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
19410 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
19420 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
19430 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
19440 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
19450 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
19460 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
19470 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
19480 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
19490 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
194a0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
194b0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
194c0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
194d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
194e0 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
194f0 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
19500 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
19510 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
19520 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
19530 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
19540 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
19550 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
19560 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
19570 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
19580 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
19590 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
195a0 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
195b0 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  cs(zFilename);. 
195c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
195d0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
195e0 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
195f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
19600 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
19610 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
19620 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
19630 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
19640 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
19650 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56  to.** hold at pV
19660 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63  fs->mxPathname c
19670 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
19680 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
19690 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
196a0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
196b0 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73  atic char zChars
196c0 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
196d0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
196e0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
196f0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
19700 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
19710 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f  456789";.  size_
19720 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
19730 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61 72 20  empPath;.  char 
19740 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41  zTempPath[MAX_PA
19750 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27  TH+2];..  /* It'
19760 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
19770 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
19780 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
19790 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
197a0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
197b0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
197c0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
197d0 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
197e0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
197f0 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
19800 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
19810 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
19820 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 6d 65  E_IOERR );..  me
19830 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c 20  mset(zTempPath, 
19840 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a  0, MAX_PATH+2);.
19850 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
19860 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
19870 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
19880 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33  rintf(MAX_PATH-3
19890 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25  0, zTempPath, "%
198a0 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  s", sqlite3_temp
198b0 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d  _directory);.  }
198c0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
198d0 57 49 4e 52 54 0a 20 20 65 6c 73 65 20 69 66 28  WINRT.  else if(
198e0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63   isNT() ){.    c
198f0 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20  har *zMulti;.   
19900 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 68   WCHAR zWidePath
19910 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20  [MAX_PATH];.    
19920 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d  osGetTempPathW(M
19930 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64  AX_PATH-30, zWid
19940 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
19950 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
19960 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
19970 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
19980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
19990 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
199a0 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
199b0 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
199c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
199d0 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d  e(zMulti);.    }
199e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
199f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19a00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
19a10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
19a20 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
19a30 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
19a40 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20  zUtf8;.    char 
19a50 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41  zMbcsPath[MAX_PA
19a60 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65  TH];.    osGetTe
19a70 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48  mpPathA(MAX_PATH
19a80 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b  -30, zMbcsPath);
19a90 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c  .    zUtf8 = sql
19aa0 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
19ab0 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74  to_utf8(zMbcsPat
19ac0 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66  h);.    if( zUtf
19ad0 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
19ae0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
19af0 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
19b00 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  th, "%s", zUtf8)
19b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19b20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
19b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
19b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19b50 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
19b60 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   }.#endif.#endif
19b70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
19b80 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
19b90 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
19ba0 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
19bb0 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
19bc0 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
19bd0 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
19be0 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
19bf0 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73 71 6c   nTempPath = sql
19c00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
19c10 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66 28 20  mpPath);..  if( 
19c20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73 71 6c  (nTempPath + sql
19c30 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c  ite3Strlen30(SQL
19c40 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
19c50 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e  EFIX) + 18) >= n
19c60 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
19c70 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
19c80 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 54 65    }..  for(i=nTe
19c90 6d 70 50 61 74 68 3b 20 69 3e 30 20 26 26 20 7a  mpPath; i>0 && z
19ca0 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
19cb0 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
19cc0 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
19cd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
19ce0 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75  ntf(nBuf-18, zBu
19cf0 66 2c 20 28 6e 54 65 6d 70 50 61 74 68 20 3e 20  f, (nTempPath > 
19d00 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
19d10 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c              "%s\
19d20 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  \"SQLITE_TEMP_FI
19d30 4c 45 5f 50 52 45 46 49 58 20 3a 20 53 51 4c 49  LE_PREFIX : SQLI
19d40 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
19d50 46 49 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  FIX,.           
19d60 20 20 20 20 20 20 20 20 7a 54 65 6d 70 50 61 74          zTempPat
19d70 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65  h);.  j = sqlite
19d80 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
19d90 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
19da0 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
19db0 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  j]);.  for(i=0; 
19dc0 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
19dd0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28  .    zBuf[j] = (
19de0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
19df0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
19e00 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
19e10 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a  hars)-1) ];.  }.
19e20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
19e30 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
19e40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
19e50 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e  P FILENAME: %s\n
19e60 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74  ", zBuf));.  ret
19e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
19e80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19e90 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
19ea0 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79  d file is really
19eb0 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52   a directory.  R
19ec0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a  eturn false if.*
19ed0 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e  * it is somethin
19ee0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64  g other than a d
19ef0 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20  irectory, or if 
19f00 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
19f10 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  d of memory.** a
19f20 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
19f30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19f40 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20   winIsDir(const 
19f50 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
19f60 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
19f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
19f80 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
19f90 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
19fa0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
19fb0 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
19fc0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
19fd0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
19fe0 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
19ff0 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
1a000 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
1a010 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
1a020 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
1a030 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
1a040 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
1a070 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
1a0a0 44 61 74 61 29 29 20 26 26 20 72 65 74 72 79 49  Data)) && retryI
1a0b0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1a0c0 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
1a0d0 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
1a0e0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76  return 0; /* Inv
1a0f0 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20  alid name? */.  
1a100 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73    }.    attr = s
1a110 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
1a120 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53  ttributes;.#if S
1a130 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
1a140 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
1a150 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
1a160 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
1a170 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
1a180 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
1a190 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49  rn (attr!=INVALI
1a1a0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1a1b0 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45  S) && (attr&FILE
1a1c0 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
1a1d0 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TORY);.}../*.** 
1a1e0 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
1a1f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
1a200 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
1a210 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
1a220 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
1a230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1a240 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
1a250 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
1a260 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
1a270 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
1a280 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1a290 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
1a2a0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
1a2b0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1a2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1a2d0 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
1a2e0 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a300 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
1a310 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
1a320 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  E h;.  DWORD las
1a330 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20  tErrno;.  DWORD 
1a340 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
1a350 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
1a360 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
1a370 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1a380 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
1a390 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1a3a0 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
1a3b0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
1a3c0 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
1a3d0 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
1a3e0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
1a3f0 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
1a400 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
1a410 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
1a420 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
1a430 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a440 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
1a450 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
1a460 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
1a470 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  ng */.  int cnt 
1a480 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  = 0;..  /* If ar
1a490 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
1a4a0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
1a4b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1a4c0 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
1a4d0 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
1a4e0 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
1a4f0 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
1a500 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
1a510 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
1a520 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
1a530 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66  H+2];     /* Buf
1a540 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61  fer used to crea
1a550 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65  te temp filename
1a560 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
1a570 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1a580 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
1a590 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
1a5a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
1a5b0 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
1a5c0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
1a5d0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
1a5e0 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
1a5f0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
1a600 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
1a610 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
1a620 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1a630 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1a640 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
1a650 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1a660 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1a670 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
1a680 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
1a690 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1a6a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
1a6b0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1a6c0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
1a6d0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1a6e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1a6f0 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74  Y);.#endif.  int
1a700 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
1a710 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1a720 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
1a730 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a740 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75  .  int isOpenJou
1a750 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65  rnal = (isCreate
1a760 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
1a770 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1a780 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
1a790 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
1a7a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1a7b0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
1a7c0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1a7d0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
1a7e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
1a7f0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
1a800 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
1a810 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
1a820 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
1a830 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
1a840 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
1a850 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
1a860 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
1a870 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
1a880 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
1a890 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
1a8a0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
1a8b0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
1a8c0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
1a8d0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
1a8e0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
1a8f0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
1a900 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
1a910 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
1a920 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
1a930 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
1a940 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
1a950 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
1a960 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
1a970 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
1a980 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
1a990 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
1a9a0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
1a9b0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
1a9c0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
1a9d0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
1a9e0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
1a9f0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
1aa00 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
1aa10 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
1aa20 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
1aa30 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
1aa40 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
1aa50 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
1aa60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1aa70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
1aa80 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1aa90 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1aaa0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1aab0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
1aac0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1aad0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1aae0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1aaf0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
1ab00 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1ab10 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1ab20 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1ab30 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
1ab40 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1ab50 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1ab60 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1ab70 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
1ab80 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
1ab90 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
1aba0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
1abb0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
1abc0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
1abd0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
1abe0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
1abf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1ac00 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
1ac10 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
1ac20 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1ac30 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
1ac40 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1ac50 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
1ac60 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1ac70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
1ac80 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
1ac90 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1aca0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
1acb0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1acc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1acd0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
1ace0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
1acf0 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
1ad00 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e  t( id!=0 );.  UN
1ad10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1ad20 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e  Vfs);..  pFile->
1ad30 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
1ad40 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20  LE_VALUE;..  /* 
1ad50 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1ad60 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1ad70 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
1ad80 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a   generate a .  *
1ad90 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
1ada0 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20   name to use .  
1adb0 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
1adc0 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
1add0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
1ade0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  sOpenJournal);. 
1adf0 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e     rc = getTempn
1ae00 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20  ame(MAX_PATH+2, 
1ae10 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
1ae20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ae30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ae40 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
1ae50 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e  Utf8Name = zTmpn
1ae60 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
1ae70 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
1ae80 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
1ae90 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
1aea0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a  they are not.  *
1aeb0 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
1aec0 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
1aed0 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
1aee0 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
1aef0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
1af00 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a  parameter()..  *
1af10 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79  /.  assert( (eTy
1af20 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1af30 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61  MAIN_DB) || (fla
1af40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1af50 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20  _URI) ||.       
1af60 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65   zUtf8Name[strle
1af70 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d  n(zUtf8Name)+1]=
1af80 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  =0 );..  /* Conv
1af90 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ert the filename
1afa0 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65   to the system e
1afb0 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43  ncoding. */.  zC
1afc0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1afd0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1afe0 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28  Utf8Name);.  if(
1aff0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1b000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b010 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b020 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49  .  }..  if( winI
1b030 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
1b040 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b050 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1b060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b070 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
1b080 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  IR;.  }..  if( i
1b090 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
1b0a0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1b0b0 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
1b0c0 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
1b0d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1b0e0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
1b0f0 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
1b100 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   }..  /* SQLITE_
1b110 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69  OPEN_EXCLUSIVE i
1b120 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
1b130 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66  ure that a new f
1b140 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65  ile is .  ** cre
1b150 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65  ated. SQLite doe
1b160 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69  sn't use it to i
1b170 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69  ndicate "exclusi
1b180 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a  ve access" .  **
1b190 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c   as it is usuall
1b1a0 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20  y understood..  
1b1b0 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  */.  if( isExclu
1b1c0 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  sive ){.    /* C
1b1d0 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c  reates a new fil
1b1e0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f  e, only if it do
1b1f0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1b200 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  xist. */.    /* 
1b210 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  If the file exis
1b220 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  ts, it fails. */
1b230 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
1b240 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45  isposition = CRE
1b250 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65  ATE_NEW;.  }else
1b260 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b   if( isCreate ){
1b270 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69  .    /* Open exi
1b280 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63  sting file, or c
1b290 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73  reate if it does
1b2a0 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20  n't exist */.   
1b2b0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1b2c0 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c  sition = OPEN_AL
1b2d0 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  WAYS;.  }else{. 
1b2e0 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69     /* Opens a fi
1b2f0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65  le, only if it e
1b300 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77  xists. */.    dw
1b310 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1b320 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54  ion = OPEN_EXIST
1b330 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68  ING;.  }..  dwSh
1b340 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53  areMode = FILE_S
1b350 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1b360 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20  _SHARE_WRITE;.. 
1b370 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
1b380 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1b390 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73  INCE.    dwFlags
1b3a0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1b3b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
1b3c0 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d  IDDEN;.    isTem
1b3d0 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20  p = 1;.#else.   
1b3e0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1b3f0 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
1b400 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
1b410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  | FILE_ATTRIBUTE
1b440 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20  _HIDDEN.        
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
1b470 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
1b480 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  SE;.#endif.  }el
1b490 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41  se{.    dwFlagsA
1b4a0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
1b4b0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
1b4c0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52  RMAL;.  }.  /* R
1b4d0 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20  eports from the 
1b4e0 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61  internet are tha
1b4f0 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73  t performance is
1b500 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74   always.  ** bet
1b510 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47  ter if FILE_FLAG
1b520 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69  _RANDOM_ACCESS i
1b530 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20  s used.  Ticket 
1b540 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51  #2699. */.#if SQ
1b550 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1b560 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1b570 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41  utes |= FILE_FLA
1b580 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b  G_RANDOM_ACCESS;
1b590 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1b5a0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
1b5b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1b5c0 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54   CREATEFILE2_EXT
1b5d0 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
1b5e0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1b5f0 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ers;.    extende
1b600 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69  dParameters.dwSi
1b610 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41  ze = sizeof(CREA
1b620 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
1b630 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20  _PARAMETERS);.  
1b640 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1b650 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69  ters.dwFileAttri
1b660 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20  butes =.        
1b670 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
1b680 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
1b690 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a  ATTRIBUTE_MASK;.
1b6a0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1b6b0 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61  meters.dwFileFla
1b6c0 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41  gs = dwFlagsAndA
1b6d0 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
1b6e0 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  _FLAG_MASK;.    
1b6f0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
1b700 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73  rs.dwSecurityQos
1b710 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59  Flags = SECURITY
1b720 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20  _ANONYMOUS;.    
1b730 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
1b740 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74  rs.lpSecurityAtt
1b750 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ributes = NULL;.
1b760 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1b770 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65  meters.hTemplate
1b780 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  File = NULL;.   
1b790 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
1b7a0 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
1b7b0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1b7e0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
1b810 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
1b840 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78               &ex
1b870 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1b880 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
1b890 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49            retryI
1b8c0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1b8d0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
1b8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
1b8f0 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   */.    }.#else.
1b900 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
1b910 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c  osCreateFileW((L
1b920 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1b930 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1b960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
1b990 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1b9c0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
1b9f0 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
1ba20 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1ba30 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
1ba60 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1ba70 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
1ba80 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
1ba90 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  /.    }.#endif. 
1baa0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1bab0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1bac0 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c    else{.    whil
1bad0 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
1bae0 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43  FileA((LPCSTR)zC
1baf0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
1bb20 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
1bb50 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
1bb80 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
1bbb0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1bbc0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
1bbf0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
1bc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bc20 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1bc30 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc50 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
1bc60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49   }.#endif.  logI
1bc70 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
1bc80 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
1bc90 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20  %s 0x%lx %s\n", 
1bca0 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a  .           h, z
1bcb0 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
1bcc0 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20  ccess, .        
1bcd0 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41     h==INVALID_HA
1bce0 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61  NDLE_VALUE ? "fa
1bcf0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
1bd00 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
1bd10 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
1bd20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1bd30 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
1bd40 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
1bd50 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1bd60 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
1bd70 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
1bd80 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
1bd90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1bda0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1bdb0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
1bdc0 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
1bdd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1bde0 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
1bdf0 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
1be00 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
1be10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1be20 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50  NLY)&~(SQLITE_OP
1be30 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
1be40 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
1be50 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  ), pOutFlags);. 
1be60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1be70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1be80 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
1be90 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
1bea0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
1beb0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
1bec0 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
1bed0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
1bee0 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
1bef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
1bf00 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
1bf10 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
1bf20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
1bf30 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
1bf40 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20  zeof(*pFile));. 
1bf50 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
1bf60 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
1bf70 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
1bf80 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1bf90 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
1bfa0 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
1bfb0 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53  Vfs;.  pFile->pS
1bfc0 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  hm = 0;.  pFile-
1bfd0 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
1bfe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
1bff0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
1c000 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
1c010 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1c020 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
1c030 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
1c040 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
1c050 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
1c060 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52  _WINCE.  if( isR
1c070 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
1c080 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1c090 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26  AIN_DB.       &&
1c0a0 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   !winceCreateLoc
1c0b0 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a  k(zName, pFile).
1c0c0 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
1c0d0 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
1c0e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1c0f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
1c100 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
1c110 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  PEN_BKPT;.  }.  
1c120 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
1c130 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
1c140 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
1c150 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
1c160 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
1c170 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1c180 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70  rted);.  }..  Op
1c190 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
1c1a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c1b0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1c1c0 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
1c1d0 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
1c1e0 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
1c1f0 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
1c200 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
1c210 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1c220 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
1c230 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
1c240 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
1c250 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
1c260 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
1c270 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
1c280 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
1c290 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
1c2a0 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
1c2b0 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
1c2c0 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
1c2d0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1c2e0 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
1c2f0 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
1c300 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
1c310 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1c320 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
1c330 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
1c340 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
1c350 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
1c360 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
1c370 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
1c380 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
1c390 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
1c3a0 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
1c3b0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
1c3c0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
1c3d0 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
1c3e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1c3f0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
1c400 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
1c410 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
1c420 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1c430 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c440 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
1c450 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
1c480 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
1c490 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
1c4a0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
1c4b0 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
1c4c0 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  rrno;.  void *zC
1c4d0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
1c4e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1c4f0 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
1c500 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b  AMETER(syncDir);
1c510 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
1c520 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
1c530 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
1c540 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
1c550 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1c560 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
1c570 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1c580 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c590 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1c5a0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
1c5b0 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  isNT() ){.    do
1c5c0 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
1c5d0 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
1c5e0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
1c5f0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
1c600 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1c610 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
1c620 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
1c630 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
1c640 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
1c650 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
1c660 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
1c670 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
1c6a0 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
1c6b0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
1c6c0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
1c6d0 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
1c6e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c6f0 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65 61  ITE_OK; /* Alrea
1c700 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
1c710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c720 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61   }.#else.      a
1c730 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
1c740 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
1c750 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
1c760 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
1c770 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1c780 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
1c790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c7a0 4b 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  K; /* Already go
1c7b0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ne? */.        b
1c7c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c7d0 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
1c7e0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
1c7f0 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
1c800 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1c810 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
1c820 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
1c830 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c840 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
1c850 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
1c860 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
1c870 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
1c880 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
1c890 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c8a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
1c8b0 28 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63  ( !retryIoerr(&c
1c8c0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1c8d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c8e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
1c8f0 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
1c900 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
1c910 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c920 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
1c930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1c940 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1c950 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
1c960 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
1c970 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1c980 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1c990 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e     if ( attr==IN
1c9a0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1c9b0 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20  BUTES ){.       
1c9c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c9d0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
1c9e0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  ? */.        bre
1c9f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ca00 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45    if ( attr&FILE
1ca10 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
1ca20 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  TORY ){.        
1ca30 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1ca40 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79  R; /* Files only
1ca50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
1ca60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ca70 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46    if ( osDeleteF
1ca80 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileA(zConverted)
1ca90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1caa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44   SQLITE_OK; /* D
1cab0 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20  eleted OK. */.  
1cac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cad0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
1cae0 21 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  !retryIoerr(&cnt
1caf0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
1cb00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cb10 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e  LITE_ERROR; /* N
1cb20 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20  o more retries. 
1cb30 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
1cb40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1cb50 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65  while(1);.  }.#e
1cb60 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b  ndif.  if( rc ){
1cb70 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
1cb80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1cb90 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45  RR_DELETE, lastE
1cba0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1cbb0 20 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20     "winDelete", 
1cbc0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65  zFilename);.  }e
1cbd0 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72  lse{.    logIoer
1cbe0 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  r(cnt);.  }.  sq
1cbf0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1cc00 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43  erted);.  OSTRAC
1cc10 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c  E(("DELETE \"%s\
1cc20 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  " %s\n", zFilena
1cc30 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65  me, (rc ? "faile
1cc40 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20  d" : "ok" )));. 
1cc50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cc60 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
1cc70 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61  xistance and sta
1cc80 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
1cc90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1cca0 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
1ccb0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1ccc0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
1ccd0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
1cce0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1ccf0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
1cd00 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
1cd10 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
1cd20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1cd30 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
1cd40 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
1cd50 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
1cd60 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
1cd70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1cd80 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
1cd90 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
1cda0 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
1cdb0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f   lastErrno;.  vo
1cdc0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1cdd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1cde0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
1cdf0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1ce00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ce10 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a  R_ACCESS; );.  z
1ce20 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1ce30 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1ce40 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1ce50 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1ce60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ce70 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ce80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
1ce90 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
1cea0 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
1ceb0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
1cec0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
1ced0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
1cee0 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
1cef0 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
1cf00 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
1cf10 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1cf20 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
1cf30 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
1cf60 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20  ExInfoStandard, 
1cf70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
1cf90 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65  AttrData)) && re
1cfa0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1cfb0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
1cfc0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1cfd0 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
1cfe0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1cff0 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
1d000 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
1d010 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
1d020 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1d030 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
1d040 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
1d050 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
1d060 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
1d070 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
1d080 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
1d090 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
1d0a0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
1d0b0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
1d0c0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
1d0d0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
1d0e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d0f0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
1d100 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
1d110 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
1d120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d130 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
1d140 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
1d150 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno!=ERROR_FILE
1d160 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
1d170 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
1d180 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  r(SQLITE_IOERR_A
1d190 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f  CCESS, lastErrno
1d1a0 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a  , "winAccess", z
1d1b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1d1c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d1d0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1d1e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d1f0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
1d200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d210 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
1d220 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1d230 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
1d240 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
1d250 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1d260 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1d270 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
1d280 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
1d290 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
1d2a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1d2b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1d2c0 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
1d2d0 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
1d2e0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
1d2f0 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
1d300 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1d310 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
1d320 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
1d330 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
1d340 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d350 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
1d360 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
1d370 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
1d380 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
1d390 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
1d3a0 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
1d3b0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1d3c0 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
1d3d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1d3e0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
1d3f0 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
1d400 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
1d410 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
1d420 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53  = rc;.  return S
1d430 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1d440 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
1d450 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
1d460 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
1d470 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76  should be used v
1d480 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20  erbatim.  If.** 
1d490 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
1d4a0 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66  rned from this f
1d4b0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c  unction, the cal
1d4c0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
1d4d0 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65  st simply.** use
1d4e0 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70 61   the provided pa
1d4f0 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d  th name verbatim
1d500 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74   -OR- resolve it
1d510 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
1d520 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20  h name.** using 
1d530 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  the GetFullPathN
1d540 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66 75  ame Win32 API fu
1d550 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c  nction (if avail
1d560 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  able)..*/.static
1d570 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61   BOOL winIsVerba
1d580 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63  timPathname(.  c
1d590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1d5a0 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a  name.){.  /*.  *
1d5b0 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61  * If the path na
1d5c0 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
1d5d0 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f   forward slash o
1d5e0 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69  r a backslash, i
1d5f0 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a  t is either.  **
1d600 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d   a legal UNC nam
1d610 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61  e, a volume rela
1d620 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e  tive path, or an
1d630 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e   absolute path n
1d640 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ame in the.  ** 
1d650 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e  "Unix" format on
1d660 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65   Windows.  There
1d670 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20   is no easy way 
1d680 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 65  to differentiate
1d690 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68   between.  ** th
1d6a0 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65  e final two case
1d6b0 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65  s; therefore, we
1d6c0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66 65   return the safe
1d6d0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  r return value o
1d6e0 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74  f TRUE.  ** so t
1d6f0 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74  hat callers of t
1d700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
1d710 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20  l simply use it 
1d720 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20  verbatim..  */. 
1d730 20 69 66 20 28 20 7a 50 61 74 68 6e 61 6d 65 5b   if ( zPathname[
1d740 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61 74 68  0]=='/' || zPath
1d750 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29 7b  name[0]=='\\' ){
1d760 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
1d770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
1d780 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d   If the path nam
1d790 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
1d7a0 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c  letter and a col
1d7b0 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20  on it is either 
1d7c0 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65  a volume.  ** re
1d7d0 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61  lative path or a
1d7e0 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e  n absolute path.
1d7f0 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69    Callers of thi
1d800 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
1d810 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74  not.  ** attempt
1d820 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20   to treat it as 
1d830 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
1d840 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20  name (i.e. they 
1d850 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73  should simply us
1d860 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74  e.  ** it verbat
1d870 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  im)..  */.  if (
1d880 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28   sqlite3Isalpha(
1d890 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26  zPathname[0]) &&
1d8a0 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27   zPathname[1]=='
1d8b0 3a 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  :' ){.    return
1d8c0 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
1d8d0 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20  .  ** If we get 
1d8e0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
1d8f0 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  he path name sho
1d900 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61  uld almost certa
1d910 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79  inly be a purely
1d920 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f  .  ** relative o
1d930 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55  ne (i.e. not a U
1d940 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73  NC name, not abs
1d950 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76  olute, and not v
1d960 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e  olume relative).
1d970 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46  .  */.  return F
1d980 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALSE;.}../*.** T
1d990 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
1d9a0 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
1d9b0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
1d9c0 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
1d9d0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
1d9e0 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77  Out[].  zOut[] w
1d9f0 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20  ill be at least 
1da00 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1da10 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1da20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1da30 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
1da40 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1da50 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
1da60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1da70 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
1da80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
1da90 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a  ative,        /*
1daa0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
1dab0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
1dac0 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20  .  int nFull,   
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
1daf0 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
1db00 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
1db10 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ull             
1db20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
1db30 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a  buffer */.){.  .
1db40 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
1db50 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
1db60 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1db70 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
1db80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1db90 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61  ETER(nFull);.  a
1dba0 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
1dbb0 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f 50 41 54  athname>=MAX_PAT
1dbc0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  H );.  assert( n
1dbd0 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61  Full>=pVfs->mxPa
1dbe0 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28  thname );.  if (
1dbf0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
1dc00 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
1dc10 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
1dc20 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
1dc30 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
1dc40 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
1dc50 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
1dc60 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
1dc70 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
1dc80 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
1dc90 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
1dca0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
1dcb0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
1dcc0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
1dcd0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
1dce0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1dcf0 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
1dd00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
1dd10 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
1dd20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1dd30 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a  ry and a slash..
1dd40 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
1dd50 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  zOut[MAX_PATH+1]
1dd60 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 4f 75  ;.    memset(zOu
1dd70 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b 31  t, 0, MAX_PATH+1
1dd80 29 3b 0a 20 20 20 20 63 79 67 77 69 6e 5f 63 6f  );.    cygwin_co
1dd90 6e 76 5f 74 6f 5f 77 69 6e 33 32 5f 70 61 74 68  nv_to_win32_path
1dda0 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74  (zRelative, zOut
1ddb0 29 3b 20 2f 2a 20 50 4f 53 49 58 20 74 6f 20 57  ); /* POSIX to W
1ddc0 69 6e 33 32 20 2a 2f 0a 20 20 20 20 73 71 6c 69  in32 */.    sqli
1ddd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
1dde0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
1ddf0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
1de00 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20  , "%s\\%s",.    
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
1de30 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a  rectory, zOut);.
1de40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a    }else{.    /*.
1de50 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68 65      ** NOTE: The
1de60 20 43 79 67 77 69 6e 20 64 6f 63 73 20 73 74 61   Cygwin docs sta
1de70 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 78 69  te that the maxi
1de80 6d 75 6d 20 6c 65 6e 67 74 68 20 6e 65 65 64 65  mum length neede
1de90 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  d.    **       f
1dea0 6f 72 20 74 68 65 20 62 75 66 66 65 72 20 70 61  or the buffer pa
1deb0 73 73 65 64 20 74 6f 20 63 79 67 77 69 6e 5f 63  ssed to cygwin_c
1dec0 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33  onv_to_full_win3
1ded0 32 5f 70 61 74 68 0a 20 20 20 20 2a 2a 20 20 20  2_path.    **   
1dee0 20 20 20 20 69 73 20 4d 41 58 5f 50 41 54 48 2e      is MAX_PATH.
1def0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 79 67 77  .    */.    cygw
1df00 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
1df10 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61  win32_path(zRela
1df20 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20  tive, zFull);.  
1df30 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1df40 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
1df50 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f (SQLITE_OS_WIN
1df60 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
1df70 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e  WINRT) && !defin
1df80 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
1df90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1dfa0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1dfb0 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69  ERROR );.  /* Wi
1dfc0 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
1dfd0 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
1dfe0 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
1dff0 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
1e000 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f   /* WinRT has no
1e010 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   way to convert 
1e020 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
1e030 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f  to an absolute o
1e040 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ne. */.  if ( sq
1e050 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
1e060 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
1e070 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
1e080 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
1e090 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
1e0a0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
1e0b0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
1e0c0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
1e0d0 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
1e0e0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
1e0f0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
1e100 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
1e110 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
1e120 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
1e130 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
1e140 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
1e150 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
1e160 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
1e170 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
1e180 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
1e190 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
1e1a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1e1b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
1e1c0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
1e1d0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
1e1e0 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20  , "%s\\%s",.    
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
1e210 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69  rectory, zRelati
1e220 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ve);.  }else{.  
1e230 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e240 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
1e250 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
1e260 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
1e270 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20  elative);.  }.  
1e280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e290 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
1e2a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
1e2b0 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
1e2c0 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
1e2d0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
1e2e0 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a   nByte;.  void *
1e2f0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68  zConverted;.  ch
1e300 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20  ar *zOut;..  /* 
1e310 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d  If this path nam
1e320 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f  e begins with "/
1e330 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69  X:", where "X" i
1e340 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63  s any alphabetic
1e350 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c  .  ** character,
1e360 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69   discard the ini
1e370 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68  tial "/" from th
1e380 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f  e pathname..  */
1e390 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65  .  if( zRelative
1e3a0 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69  [0]=='/' && sqli
1e3b0 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61  te3Isalpha(zRela
1e3c0 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c  tive[1]) && zRel
1e3d0 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b  ative[2]==':' ){
1e3e0 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
1e3f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
1e400 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
1e410 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
1e420 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
1e430 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
1e440 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
1e450 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
1e460 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
1e470 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
1e480 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1e490 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
1e4a0 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
1e4b0 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
1e4c0 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
1e4d0 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
1e4e0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
1e4f0 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
1e500 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e510 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1e520 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
1e530 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
1e540 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
1e550 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
1e560 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
1e570 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
1e580 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
1e590 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
1e5a0 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
1e5b0 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
1e5c0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
1e5d0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
1e5e0 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
1e5f0 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
1e600 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
1e610 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
1e620 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
1e630 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
1e640 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
1e650 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
1e660 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
1e670 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
1e680 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
1e690 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1e6a0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
1e6b0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
1e6c0 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20  ll, "%s\\%s",.  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
1e6f0 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61  directory, zRela
1e700 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
1e710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e720 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
1e730 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1e740 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
1e750 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1e760 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1e770 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1e780 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
1e790 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50  isNT() ){.    LP
1e7a0 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20  WSTR zTemp;.    
1e7b0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
1e7c0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
1e7d0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
1e7e0 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20  0, 0, 0) + 3;.  
1e7f0 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
1e800 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  3_malloc( nByte*
1e810 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
1e820 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
1e830 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1e840 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1e850 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
1e860 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e870 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
1e880 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68     osGetFullPath
1e890 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
1e8a0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
1e8b0 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
1e8c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1e8d0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
1e8e0 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  Out = unicodeToU
1e8f0 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
1e900 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
1e910 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  mp);.  }.#ifdef 
1e920 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1e930 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1e940 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20    char *zTemp;. 
1e950 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
1e960 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
1e970 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
1e980 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
1e990 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
1e9a0 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
1e9b0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
1e9c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
1e9d0 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
1e9e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1e9f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
1ea00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ea10 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
1ea20 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74      osGetFullPat
1ea30 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
1ea40 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
1ea50 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
1ea60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1ea70 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
1ea80 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
1ea90 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
1eaa0 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
1eab0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
1eac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
1ead0 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
1eae0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1eaf0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
1eb00 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
1eb10 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
1eb20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1eb30 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
1eb40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1eb50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
1eb60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1eb70 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
1eb80 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
1eb90 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1eba0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
1ebb0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
1ebc0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
1ebd0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
1ebe0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
1ebf0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
1ec00 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
1ec10 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
1ec20 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
1ec30 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
1ec40 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
1ec50 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
1ec60 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
1ec70 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
1ec80 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
1ec90 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
1eca0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
1ecb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
1ecc0 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
1ecd0 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
1ece0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1ecf0 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
1ed00 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1ed10 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1ed20 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
1ed30 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
1ed40 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1ed50 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1ed60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ed70 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   0;.  }.  if( is
1ed80 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
1ed90 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1eda0 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  h = osLoadPackag
1edb0 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53  edLibrary((LPCWS
1edc0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
1edd0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  );.#else.    h =
1ede0 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   osLoadLibraryW(
1edf0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1ee00 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
1ee10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1ee20 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1ee30 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73  else{.    h = os
1ee40 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
1ee50 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
1ee60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1ee70 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1ee80 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
1ee90 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61   (void*)h;.}.sta
1eea0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72  tic void winDlEr
1eeb0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1eec0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
1eed0 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
1eee0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1eef0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74  TER(pVfs);.  get
1ef00 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
1ef10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
1ef20 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  Buf, zBufOut);.}
1ef30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77  .static void (*w
1ef40 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  inDlSym(sqlite3_
1ef50 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
1ef60 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  *pHandle, const 
1ef70 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28  char *zSymbol))(
1ef80 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  void){.  UNUSED_
1ef90 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1efa0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
1efb0 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72  *)(void))osGetPr
1efc0 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
1efd0 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d  LE)pHandle, zSym
1efe0 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  bol);.}.static v
1eff0 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
1f000 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1f010 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
1f020 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1f030 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
1f040 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
1f050 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  DLE)pHandle);.}.
1f060 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
1f070 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1f080 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
1f090 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
1f0a0 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
1f0b0 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
1f0c0 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
1f0d0 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
1f0e0 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
1f0f0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
1f100 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
1f110 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
1f120 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
1f130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f140 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
1f150 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1f160 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1f170 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
1f180 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
1f190 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
1f1a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f1b0 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
1f1c0 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
1f1d0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
1f1e0 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
1f1f0 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
1f200 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
1f210 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
1f220 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
1f230 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
1f240 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
1f250 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
1f260 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
1f270 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
1f280 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
1f290 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
1f2a0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1f2b0 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
1f2c0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
1f2d0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
1f2e0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
1f2f0 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  id);.  }.#if SQL
1f300 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
1f310 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c  f( sizeof(ULONGL
1f320 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ONG)<=nBuf-n ){.
1f330 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e      ULONGLONG cn
1f340 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
1f350 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63  nt64();.    memc
1f360 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
1f370 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
1f380 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1f390 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  (cnt);.  }.#else
1f3a0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
1f3b0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
1f3c0 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
1f3d0 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
1f3e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1f3f0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
1f400 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
1f410 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
1f420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
1f430 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
1f440 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
1f450 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
1f460 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
1f470 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
1f480 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
1f490 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
1f4a0 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
1f4b0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
1f4c0 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
1f4d0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
1f4e0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
1f4f0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
1f500 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
1f510 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
1f520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f530 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
1f540 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
1f550 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
1f560 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
1f570 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
1f580 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
1f590 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1f5a0 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
1f5b0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
1f5c0 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
1f5d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1f5e0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
1f5f0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
1f600 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
1f610 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
1f620 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
1f630 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
1f640 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
1f650 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
1f660 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
1f670 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
1f680 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
1f690 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1f6a0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
1f6b0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
1f6c0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
1f6d0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
1f6e0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
1f6f0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
1f700 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
1f710 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
1f720 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
1f730 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
1f740 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
1f750 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
1f760 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
1f770 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
1f780 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
1f790 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
1f7a0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
1f7b0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
1f7c0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
1f7d0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
1f7e0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
1f7f0 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
1f800 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
1f810 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
1f820 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
1f830 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
1f840 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
1f850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f860 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
1f870 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
1f880 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
1f890 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1f8a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f8b0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
1f8c0 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
1f8d0 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
1f8e0 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
1f8f0 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
1f900 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
1f910 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
1f920 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
1f930 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
1f940 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
1f950 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
1f960 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
1f970 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
1f980 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
1f990 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
1f9a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
1f9b0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
1f9c0 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
1f9d0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
1f9e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1f9f0 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
1fa00 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
1fa10 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
1fa20 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
1fa30 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
1fa40 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
1fa50 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
1fa60 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
1fa70 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
1fa80 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1fa90 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
1faa0 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73  alue = .      (s
1fab0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
1fac0 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
1fad0 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
1fae0 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
1faf0 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
1fb00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1fb10 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
1fb20 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53  E time;.  osGetS
1fb30 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
1fb40 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d  ;.  /* if System
1fb50 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29  TimeToFileTime()
1fb60 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72   fails, it retur
1fb70 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  ns zero. */.  if
1fb80 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54   (!osSystemTimeT
1fb90 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
1fba0 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
1fbb0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1fbc0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65    }.#else.  osGe
1fbd0 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
1fbe0 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
1fbf0 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
1fc00 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
1fc10 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
1fc20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
1fc30 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
1fc40 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
1fc50 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
1fc60 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
1fc70 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
1fc80 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
1fc90 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
1fca0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1fcb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
1fcc0 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
1fcd0 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
1fce0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
1fcf0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
1fd00 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
1fd10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
1fd20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1fd30 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
1fd40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1fd50 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
1fd60 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
1fd70 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
1fd80 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
1fd90 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
1fda0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
1fdb0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
1fdc0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
1fdd0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
1fde0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
1fdf0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
1fe00 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
1fe10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1fe20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
1fe30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1fe40 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
1fe50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1fe60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
1fe70 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
1fe80 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
1fe90 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
1fea0 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
1feb0 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
1fec0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1fed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
1fee0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
1fef0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
1ff00 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
1ff10 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
1ff20 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
1ff30 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64  essage() on Wind
1ff40 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
1ff50 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
1ff60 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65  ) on Unix). Afte
1ff70 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
1ff80 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
1ff90 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
1ffa0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
1ffb0 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
1ffc0 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
1ffd0 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
1ffe0 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
1fff0 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
20000 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
20010 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
20020 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
20030 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
20040 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
20050 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
20060 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
20070 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
20080 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
20090 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
200a0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
200b0 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
200c0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
200d0 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
200e0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
200f0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
20100 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
20110 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
20120 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
20130 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
20140 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
20150 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
20160 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
20170 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
20180 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
20190 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
201a0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
201b0 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
201c0 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
201d0 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
201e0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
201f0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
20200 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
20210 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
20220 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
20230 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
20240 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
20250 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
20260 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
20270 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
20280 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
20290 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
202a0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
202b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
202c0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
202d0 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
202e0 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
202f0 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
20300 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
20310 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
20320 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
20330 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
20340 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
20350 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
20360 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
20370 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
20380 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
20390 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
203a0 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
203b0 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
203c0 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
203d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
203e0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
203f0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
20400 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
20410 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
20420 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
20430 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  fs);.  return ge
20440 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
20450 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
20460 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
20470 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
20480 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
20490 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
204a0 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
204b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
204c0 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
204d0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
204e0 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
204f0 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
20500 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
20510 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
20520 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
20530 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
20540 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20      MAX_PATH,   
20550 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
20560 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
20590 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20     "win32",     
205a0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
205b0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205d0 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
205e0 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
205f0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
20600 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
20610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
20620 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
20630 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
20640 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
20650 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
20660 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
20670 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
20680 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
20690 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
206a0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
206b0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
206c0 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
206d0 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
206e0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
206f0 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
20700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
20710 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
20720 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
20730 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
20740 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
20750 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20760 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
20770 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
20780 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
20790 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
207a0 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
207b0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
207c0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
207d0 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
207e0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
207f0 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
20800 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
20810 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
20820 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
20830 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
20840 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
20850 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
20860 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
20870 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
20880 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65   };..  /* Double
20890 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  -check that the 
208a0 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79  aSyscall[] array
208b0 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72   has been constr
208c0 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65  ucted.  ** corre
208d0 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65  ctly.  See ticke
208e0 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65  t [bb3a86e890c8e
208f0 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72  96ab] */.  asser
20900 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79  t( ArraySize(aSy
20910 73 63 61 6c 6c 29 3d 3d 37 33 20 29 3b 0a 0a 23  scall)==73 );..#
20920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20930 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20  IT_WAL.  /* get 
20940 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63  memory map alloc
20950 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74  ation granularit
20960 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77  y */.  memset(&w
20970 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69  inSysInfo, 0, si
20980 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f  zeof(SYSTEM_INFO
20990 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ));.#if SQLITE_O
209a0 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e  S_WINRT.  osGetN
209b0 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28  ativeSystemInfo(
209c0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
209d0 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
209e0 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
209f0 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  o);.#endif.  ass
20a00 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64  ert(winSysInfo.d
20a10 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
20a20 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e  larity > 0);.#en
20a30 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  dif..  sqlite3_v
20a40 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
20a50 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  Vfs, 1);.  retur
20a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
20a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
20a80 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20  end(void){ .#if 
20a90 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
20aa0 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 20 21    if( sleepObj !
20ab0 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73  = NULL ){.    os
20ac0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65  CloseHandle(slee
20ad0 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70  pObj);.    sleep
20ae0 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Obj = NULL;.  }.
20af0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
20b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
20b10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
20b20 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.