/ Hex Artifact Content
Login

Artifact ce6b415a2efd30027d4881bc8266c90ed4bc3ad0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d  mmon.h"../*.** M
02a0: 61 63 72 6f 20 74 6f 20 66 69 6e 64 20 74 68 65  acro to find the
02b0: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74 77 6f 20   minimum of two 
02c0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e 0a  numeric values..
02d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23  */.#ifndef MIN.#
02e0: 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29   define MIN(x,y)
02f0: 20 28 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79   ((x)<(y)?(x):(y
0300: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0310: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
0320: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
0330: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
0340: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
0350: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
0360: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
0370: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
0380: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
0390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
03a0: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
03b0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
03c0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
03d0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
03e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
03f0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0400: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
0410: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
0420: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
0430: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
0440: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
0450: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0460: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0480: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
0490: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
04a0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
04b0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
04c0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
04d0: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
04e0: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43  y */../*.** WinC
04f0: 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73  E lacks native s
0500: 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20  upport for file 
0510: 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61  locking so we ha
0520: 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a  ve to fake it.**
0530: 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20   with some code 
0540: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23  of our own..*/.#
0550: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
0560: 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  CE.typedef struc
0570: 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20  t winceLock {.  
0580: 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20  int nReaders;   
0590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
05a0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62   reader locks ob
05b0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
05c0: 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   bPending;      
05d0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70  /* Indicates a p
05e0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
05f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0600: 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65  .  BOOL bReserve
0610: 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  d;     /* Indica
0620: 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  tes a reserved l
0630: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0640: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0650: 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f  bExclusive;    /
0660: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65  * Indicates an e
0670: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61  xclusive lock ha
0680: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0690: 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a  */.} winceLock;.
06a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
06b0: 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74  e winFile struct
06c0: 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73  ure is a subclas
06d0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
06e0: 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  e* specific to t
06f0: 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74  he win32.** port
0700: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
0710: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0720: 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65   winFile winFile
0730: 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  ;.struct winFile
0740: 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74   {.  const sqlit
0750: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
0760: 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73  Method; /*** Mus
0770: 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a  t be first ***/.
0780: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0790: 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Vfs;      /* The
07a0: 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65   VFS used to ope
07b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
07c0: 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
07d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
07e0: 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  le for accessing
07f0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
0800: 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  8 locktype;     
0810: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
0820: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
0830: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69   held on this fi
0840: 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68  le */.  short sh
0850: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20  aredLockByte;   
0860: 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73  /* Randomly chos
0870: 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20  en byte used as 
0880: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  a shared lock */
0890: 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b  .  u8 ctrlFlags;
08a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
08b0: 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c  ags.  See WINFIL
08c0: 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44  E_* below */.  D
08d0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
08e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
08f0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
0900: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0910: 72 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ror */.  winShm 
0920: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
0930: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
0940: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
0950: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
0960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
0970: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
0980: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
0990: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
09a0: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
09b0: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
09c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
09d0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
09e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
09f0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
0a00: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
0a10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
0a20: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
0a30: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
0a40: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
0a50: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
0a60: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
0a70: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
0a80: 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c  ock */  .  HANDL
0a90: 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20  E hShared;      
0aa0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
0ab0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64  ory segment used
0ac0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a   for locking */.
0ad0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61    winceLock loca
0ae0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63  l;        /* Loc
0af0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74  ks obtained by t
0b00: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
0b10: 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  winFile */.  win
0b20: 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20  ceLock *shared; 
0b30: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
0b40: 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72  hared lock memor
0b50: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20  y for the file  
0b60: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
0b70: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0b80: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
0b90: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
0ba0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
0bb0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
0bc0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
0bd0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
0be0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
0bf0: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
0c00: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
0c10: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
0c20: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
0c30: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
0c40: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
0c50: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
0c60: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
0c70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0c80: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
0c90: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
0cb0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
0cc0: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
0cd0: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
0ce0: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
0cf0: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
0d00: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
0d10: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
0d20: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
0d30: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
0d40: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
0d50: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
0d60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
0d70: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
0d80: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
0d90: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
0da0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
0db0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
0dc0: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
0dd0: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
0de0: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
0df0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
0e00: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
0e10: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
0e20: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
0e30: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
0e40: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
0e50: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
0e60: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
0e70: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
0e80: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
0e90: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
0ea0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
0eb0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f00: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
0f10: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
0f20: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
0f30: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
0f40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
0f50: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
0f60: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
0f70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
0f80: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
0f90: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
0fa0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
0fb0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
0fc0: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
0fd0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
0fe0: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
0ff0: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
1000: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
1010: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
1020: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
1030: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
1040: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
1050: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
1060: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
1070: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
1080: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
10e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f0: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
1100: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1110: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
1120: 45 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23  EATE    (TRUE).#
1130: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1140: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
1150: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1160: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1170: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1180: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
1190: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
11a0: 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65  _INIT_SIZE.#  de
11b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
11c0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
11d0: 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   ((SQLITE_DEFAUL
11e0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20  T_CACHE_SIZE) * 
11f0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
1220: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1230: 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23  ZE) + 4194304).#
1240: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1250: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
1260: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1270: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1280: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1290: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
12a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
12b0: 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66  _MAX_SIZE.#  def
12c0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
12d0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20  _HEAP_MAX_SIZE  
12e0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (0).#endif../*. 
12f0: 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67  * The extra flag
1300: 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c  s to use in call
1310: 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68  s to the Win32 h
1320: 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20  eap APIs.  This 
1330: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20  value may be. * 
1340: 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66  zero for the def
1350: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20  ault behavior.. 
1360: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1370: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
1380: 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  GS.#  define SQL
1390: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
13a0: 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e  LAGS     (0).#en
13b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  dif../*.** The w
13c0: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
13d0: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
13e0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
13f0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
1400: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
1410: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
1420: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
1430: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1440: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
1450: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
1460: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
1470: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
1480: 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69  agic;    /* Magi
1490: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
14a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
14b0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
14c0: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
14d0: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
14e0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
14f0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
1500: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
1510: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
1520: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
1530: 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  own)? */.};..#if
1540: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
1550: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
1560: 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a       0x42b2830b.
1570: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73  #endif..static s
1580: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
1590: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20   win_mem_data = 
15a0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
15b0: 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c  .  WINMEM_MAGIC,
15c0: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
15d0: 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65  FALSE.};..#ifnde
15e0: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
15f0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
1600: 69 63 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  ic() assert( win
1610: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d  _mem_data.magic=
1620: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a  =WINMEM_MAGIC ).
1630: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
1640: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
1650: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
1660: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
1670: 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68  ) win_mem_data.h
1680: 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69  Heap..static voi
1690: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
16a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
16b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
16c0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
16d0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
16e0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
16f0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
1700: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
1710: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
1720: 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20  oid *p);.static 
1730: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
1740: 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63  p(int n);.static
1750: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
1760: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
1770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1780: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
1790: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f   *pAppData);..co
17a0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
17b0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
17c0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
17d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
17f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1800: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1810: 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20  e is (normally) 
1820: 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76  set once and nev
1830: 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  er changes.** th
1840: 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65  ereafter.  It re
1850: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68  cords whether th
1860: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1870: 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f  em is Win9x.** o
1880: 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30  r WinNT..**.** 0
1890: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
18a0: 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  stem unknown..**
18b0: 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   1:   Operating 
18c0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e  system is Win9x.
18d0: 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69  .** 2:   Operati
18e0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
18f0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  NT..**.** In ord
1900: 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  er to facilitate
1910: 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69   testing on a Wi
1920: 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20  nNT system, the 
1930: 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20  test fixture.** 
1940: 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74  can manually set
1950: 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31   this value to 1
1960: 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39   to emulate Win9
1970: 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23  8 behavior..*/.#
1980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1990: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  T.int sqlite3_os
19a0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65  _type = 0;.#else
19b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
19c0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
19d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
19e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
19f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1a00: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
1a10: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1a20: 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  I.#endif..#if SQ
1a30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1a40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54   SQLITE_OS_WINNT
1a50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
1a60: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1a70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1a80: 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  IDE.#endif..#ifn
1a90: 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64  def SYSCALL.#  d
1aa0: 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71  efine SYSCALL sq
1ab0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
1ac0: 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  r.#endif../*.** 
1ad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ae0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
1af0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20  n Windows CE or 
1b00: 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20  WinRT.. */..#if 
1b10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1b20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1b30: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41  RT.#  define osA
1b40: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
1b50: 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a         1.#endif.
1b60: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
1b70: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
1b80: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
1b90: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
1ba0: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
1bb0: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
1bc0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
1bd0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
1be0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
1bf0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
1c00: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
1c10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1c20: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
1c30: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
1c40: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
1c50: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
1c60: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
1c70: 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63   struct win_sysc
1c80: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
1c90: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
1ca0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1cb0: 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20   the sytem call 
1cc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
1cd0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
1ce0: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
1cf0: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
1d00: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
1d10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
1d20: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
1d30: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
1d40: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
1d50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1d60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
1d70: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
1d80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1da0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
1db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1dc0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1dd0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1e10: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
1e20: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
1e30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1e40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1e50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1e60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1e70: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
1e80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1e90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ea0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1eb0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
1ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
1ed0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
1ee0: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
1ef0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
1f00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1f10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1f20: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1f40: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
1f50: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
1f60: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
1f70: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
1f80: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
1f90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fa0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
1fb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1fc0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
1fd0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
1fe0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
1ff0: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
2000: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2010: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
2020: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2030: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2060: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
2070: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
2080: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
2090: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
20a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
20b0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
20c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
20d0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
20e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
20f0: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
2100: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
2110: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
2120: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2140: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2150: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
2160: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
2170: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2180: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
2190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
21a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
21b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
21c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21f0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2200: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
2210: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
2220: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
2230: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
2240: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
2250: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
2260: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
2270: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
2280: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2290: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
22a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
22b0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
22d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
22e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
22f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
2300: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
2310: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2320: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2330: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2340: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2350: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
2360: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2370: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
2380: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
2390: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
23a0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
23b0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
23c0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
23d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
23e0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
23f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2400: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
2410: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
2420: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2430: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
2440: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
2450: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2460: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
2470: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
24a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
24b0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
24c0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
24d0: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
24e0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
24f0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
2500: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
2510: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2520: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2540: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2550: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2560: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
2570: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
2580: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
2590: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
25a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
25b0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
25c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
25d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
25f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2600: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
2610: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
2620: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
2630: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
2640: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
2650: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
2660: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2670: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2680: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2690: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
26a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
26b0: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
26d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
26e0: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
26f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2700: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2710: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2720: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2730: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
2740: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
2750: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
2760: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2780: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2790: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
27b0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
27c0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
27d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
27e0: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
27f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2800: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2820: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2830: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
2840: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
2850: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
2860: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
2870: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2880: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
2890: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
28a0: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
28b0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
28c0: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
28d0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
28e0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
28f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2910: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2920: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
2930: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
2940: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
2950: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
2960: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
2970: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 30  IME))aSyscall[10
2980: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2990: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
29a0: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
29b0: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
29c0: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
29d0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
29e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
29f0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
2a00: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
2a10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2a30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2a40: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
2a50: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
2a60: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2a70: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2a80: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
2a90: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  E))aSyscall[11].
2aa0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2ab0: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
2ac0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
2ad0: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
2ae0: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
2af0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
2b00: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
2b10: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
2b20: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  DLE))aSyscall[12
2b30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2b40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b50: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2b60: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2b70: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
2b80: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
2b90: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
2ba0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2bb0: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2bc0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2bd0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2bf0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c00: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
2c10: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
2c20: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
2c30: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
2c40: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2c50: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2c60: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
2c70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2c80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2c90: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
2ca0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
2cb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2cc0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
2cd0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
2ce0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
2cf0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
2d00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2d30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
2d40: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
2d50: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
2d60: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
2d70: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
2d80: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
2d90: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2da0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
2db0: 0a 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ..  { "FreeLibra
2dc0: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
2dd0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
2de0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
2df0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2e00: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
2e10: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
2e20: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
2e30: 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [15].pCurrent)..
2e40: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
2e50: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
2e60: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
2e70: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
2e80: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2e90: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2ea0: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
2eb0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
2ec0: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
2ed0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
2ee0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
2ef0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2f00: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2f10: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2f20: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
2f30: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
2f40: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
2f50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
2f60: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2f70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2fa0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
2fb0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2fc0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2fd0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
2fe0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
2ff0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
3000: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  RD))aSyscall[17]
3010: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3020: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
3030: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
3040: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3050: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3060: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
3070: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
3080: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3090: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
30a0: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
30b0: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
30c0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
30d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3100: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
3110: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
3120: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3130: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
3140: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
3150: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
3160: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3170: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3180: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3190: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
31a0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
31b0: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
31c0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
31d0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
31e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
31f0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
3200: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3210: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3220: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3230: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3240: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3250: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
3260: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
3270: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3280: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3290: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
32a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
32b0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
32c0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
32d0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
32e0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
32f0: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
3300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
3310: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3320: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3360: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3370: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
3380: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
3390: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
33a0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
33b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
33c0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
33d0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
33e0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
33f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3400: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
3410: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3420: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3430: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3460: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
3470: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
3480: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3490: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
34a0: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
34b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
34c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70  ))aSyscall[21].p
34d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
34e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
34f0: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
3500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3510: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
3520: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
3530: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3540: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
3550: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3560: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3570: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3580: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3590: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
35a0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
35b0: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
35c0: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
35d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
35e0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
35f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3600: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3610: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3620: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
3630: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
3640: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
3650: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3660: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
3670: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3680: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3690: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
36a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
36b0: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
36c0: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
36d0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
36e0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
36f0: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
3700: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
3710: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3720: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
3730: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3740: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3750: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3760: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
3770: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
3780: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
3790: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
37a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
37b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
37c0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
37d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
37e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
37f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3800: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
3810: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
3820: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
3830: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
3840: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
3850: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
3860: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
3870: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
3880: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3890: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
38a0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
38b0: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
38c0: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
38d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
38e0: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
38f0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3900: 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47  WINCE.  /* The G
3910: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29  etProcAddressA()
3920: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
3930: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
3940: 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b  ndows CE. */.  {
3950: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
3960: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
3970: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
3980: 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30 20  essA,         0 
3990: 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c  },.#else.  /* Al
39a0: 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20  l other Windows 
39b0: 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74  platforms expect
39c0: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
39d0: 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61  ) to take.  ** a
39e0: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65  n ANSI string re
39f0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
3a00: 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67  _UNICODE setting
3a10: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
3a20: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
3a30: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
3a40: 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20 20  rocAddress,     
3a50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3a60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
3a70: 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41  rocAddressA ((FA
3a80: 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48  RPROC(WINAPI*)(H
3a90: 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20  MODULE, \.      
3aa0: 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61    LPCSTR))aSysca
3ab0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
3ac0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3ad0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53  _WINRT.  { "GetS
3ae0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
3af0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3b00: 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  etSystemInfo,   
3b10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3b20: 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  se.  { "GetSyste
3b30: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3b40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3b70: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
3b80: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
3b90: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
3ba0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
3bb0: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
3bc0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
3bd0: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  me",           (
3be0: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
3bf0: 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  mTime,          
3c00: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3c10: 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28  sGetSystemTime (
3c20: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
3c30: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
3c40: 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65  scall[28].pCurre
3c50: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
3c60: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47  _OS_WINCE.  { "G
3c70: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
3c80: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
3c90: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  L)GetSystemTimeA
3ca0: 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  sFileTime, 0 },.
3cb0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79  #else.  { "GetSy
3cc0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3cd0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d00: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3d10: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
3d20: 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  eTime ((VOID(WIN
3d30: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
3d40: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
3d50: 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65  scall[29].pCurre
3d60: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3d70: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3d80: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3d90: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
3da0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3db0: 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20  GetTempPathA,   
3dc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3dd0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  lse.  { "GetTemp
3de0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
3df0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
3e30: 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44  empPathA ((DWORD
3e40: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
3e50: 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  LPSTR))aSyscall[
3e60: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
3e70: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3e80: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3e90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3ea0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
3eb0: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
3ec0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3ed0: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
3ee0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3ef0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
3f00: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3f10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3f40: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
3f50: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
3f60: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
3f70: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
3f80: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
3f90: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3fa0: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
3fb0: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
3fc0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
3fd0: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
3fe0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3ff0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
4000: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4010: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4040: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
4050: 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  unt ((DWORD(WINA
4060: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4070: 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74  all[32].pCurrent
4080: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4090: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
40a0: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65  ANSI).  { "GetVe
40b0: 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20  rsionExA",      
40c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
40d0: 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20  tVersionExA,    
40e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40f0: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
4100: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
4110: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4140: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
4150: 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57  sionExA ((BOOL(W
4160: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
4170: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
4180: 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  FOA))aSyscall[33
4190: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
41a0: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
41c0: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41e0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
41f0: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
4200: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4210: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4220: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4230: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[34].pCurrent)
4240: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4250: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
4260: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
4270: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4280: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
4290: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
42a0: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
42b0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
42c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
42f0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
4300: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
4310: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
4320: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
4330: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
4340: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
4350: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4360: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
4370: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
4380: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4390: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
43a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43b0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
43c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
43d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4400: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
4410: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
4420: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
4430: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
4440: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
4450: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
4460: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4470: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
4480: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4490: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
44a0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
44b0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
44c0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d  ID))aSyscall[37]
44d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
44e0: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
44f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4500: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4520: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
4530: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
4540: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
4550: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
4560: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4570: 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70  ))aSyscall[38].p
4580: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
4590: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
45a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
45b0: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
45c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
45d0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
45e0: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
45f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4600: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4610: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
4620: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  39].pCurrent)..#
4630: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4640: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
4650: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
4660: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
4670: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
4680: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4690: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
46a0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
46b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
46e0: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
46f0: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
4700: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4710: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
4720: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
4730: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4740: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4750: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4760: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4770: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
4780: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
4790: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
47a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
47b0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
47d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4800: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
4810: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
4820: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
4830: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
4840: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4850: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4870: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4880: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
4890: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
48a0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
48b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
48c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
48d0: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
48e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
48f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4900: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4910: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4920: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
4930: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
4940: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4950: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
4960: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4970: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
4980: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
4990: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
49a0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
49b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
49c0: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
49d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
49e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a00: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4a10: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
4a20: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
4a30: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
4a40: 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72  yscall[43].pCurr
4a50: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4a60: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
4a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4a80: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4aa0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4ad0: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
4ae0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4af0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4b20: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
4b30: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
4b40: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4b50: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
4b60: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4b70: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
4b80: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
4b90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
4ba0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4bb0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4bd0: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
4be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
4bf0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
4c00: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4c10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c20: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c40: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
4c50: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
4c60: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
4c70: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
4c80: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4c90: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4ca0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
4cb0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
4cc0: 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[45].pCurrent)
4cd0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
4ce0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4cf0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
4d00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4d10: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
4d20: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ile,           0
4d30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
4d40: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
4d50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4d70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4d80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4d90: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20  osMapViewOfFile 
4da0: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
4db0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4dc0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4dd0: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
4de0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
4df0: 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69  ent)..  { "Multi
4e00: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c  ByteToWideChar",
4e10: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75       (SYSCALL)Mu
4e20: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
4e30: 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  r,     0 },..#de
4e40: 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65  fine osMultiByte
4e50: 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74  ToWideChar ((int
4e60: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
4e70: 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c  WORD,LPCSTR,int,
4e80: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4e90: 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b    int))aSyscall[
4ea0: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  47].pCurrent).. 
4eb0: 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d   { "QueryPerform
4ec0: 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53  anceCounter", (S
4ed0: 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66  YSCALL)QueryPerf
4ee0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20  ormanceCounter, 
4ef0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4f00: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
4f10: 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57  Counter ((BOOL(W
4f20: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
4f30: 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
4f40: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  *))aSyscall[48].
4f50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4f60: 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20  ReadFile",      
4f70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f80: 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20  LL)ReadFile,    
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4fa0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ..#define osRead
4fb0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
4fc0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f  PI*)(HANDLE,LPVO
4fd0: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
4fe0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
4ff0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
5000: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
5010: 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46  ..  { "SetEndOfF
5020: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5030: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64   (SYSCALL)SetEnd
5040: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
5050: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5060: 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20   osSetEndOfFile 
5070: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5080: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
5090: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
50a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
50b0: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
50c0: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
50d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
50e0: 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20  FilePointer,    
50f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5100: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5110: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
5120: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5150: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
5160: 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28  Pointer ((DWORD(
5170: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5180: 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20  LONG,PLONG, \.  
5190: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
51a0: 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65  scall[51].pCurre
51b0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
51c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
51d0: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
51e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
51f0: 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  L)Sleep,        
5200: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5210: 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70  #else.  { "Sleep
5220: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5230: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5260: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c  if..#define osSl
5270: 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50  eep ((VOID(WINAP
5280: 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63  I*)(DWORD))aSysc
5290: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
52a0: 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69  )..  { "SystemTi
52b0: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20  meToFileTime",  
52c0: 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65    (SYSCALL)Syste
52d0: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c  mTimeToFileTime,
52e0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
52f0: 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  e osSystemTimeTo
5300: 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28  FileTime ((BOOL(
5310: 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53  WINAPI*)(CONST S
5320: 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20  YSTEMTIME*, \.  
5330: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
5340: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
5350: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5370: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
5380: 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  RT.  { "UnlockFi
5390: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
53a0: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
53b0: 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  kFile,          
53c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
53d0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
53f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5420: 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  ndef osUnlockFil
5430: 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f  e.#define osUnlo
5440: 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  ckFile ((BOOL(WI
5450: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5460: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5470: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5480: 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70  ))aSyscall[54].p
5490: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
54a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
54b0: 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINCE.  { "Unloc
54c0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
54d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
54e0: 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  lockFileEx,     
54f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5500: 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  e.  { "UnlockFil
5510: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
5520: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5550: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
5560: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
5570: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5580: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5590: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
55a0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
55b0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
55c0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
55d0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
55e0: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
55f0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
5600: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5610: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
5620: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
5630: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
5640: 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74  all[56].pCurrent
5650: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
5660: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
5670: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
5680: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
5690: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
56a0: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
56b0: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
56c0: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
56d0: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
56e0: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
56f0: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
5700: 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70  ))aSyscall[57].p
5710: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
5720: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
5730: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5740: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
5750: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5760: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
5770: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
5780: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
5790: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
57a0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
57b0: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
57c0: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
57d0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
57e0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 43 72 65  S_WINCE.  { "Cre
57f0: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
5800: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5810: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20  CreateEventExW, 
5820: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5830: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45  lse.  { "CreateE
5840: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
5850: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5880: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
5890: 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e  teEventExW ((HAN
58a0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
58b0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
58c0: 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20  ES,LPCWSTR, \.  
58d0: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
58e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e  D))aSyscall[59].
58f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5900: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5910: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
5920: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
5930: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
5940: 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20  ingleObject,    
5950: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5960: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
5970: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
5980: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
59a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
59b0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
59c0: 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28  eObject ((DWORD(
59d0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
59e0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
59f0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
5a00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5a10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5a20: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
5a30: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
5a40: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
5a50: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
5a60: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5a70: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
5a80: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
5a90: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5ab0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5ac0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
5ad0: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
5ae0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5af0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5b00: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
5b10: 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [61].pCurrent)..
5b20: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5b30: 49 4e 43 45 0a 20 20 7b 20 22 53 65 74 46 69 6c  INCE.  { "SetFil
5b40: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
5b50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
5b60: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20  FilePointerEx,  
5b70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5b80: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5b90: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
5ba0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5bd0: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
5be0: 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c  PointerEx ((BOOL
5bf0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5c00: 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20  ,LARGE_INTEGER, 
5c10: 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45  \.        PLARGE
5c20: 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29  _INTEGER,DWORD))
5c30: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
5c40: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5c50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
5c60: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
5c70: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
5c80: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
5c90: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
5ca0: 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c  ndleEx, 0 },.#el
5cb0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  se.  { "GetFileI
5cc0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
5cd0: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
5ce0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5cf0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5d00: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5d10: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
5d20: 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  andleEx ((BOOL(W
5d30: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
5d40: 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49  \.        FILE_I
5d50: 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c  NFO_BY_HANDLE_CL
5d60: 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  ASS,LPVOID,DWORD
5d70: 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70  ))aSyscall[63].p
5d80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
5d90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5da0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
5db0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
5dc0: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
5dd0: 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30  ileFromApp,    0
5de0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
5df0: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
5e00: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
5e10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5e20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5e30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5e40: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
5e50: 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28  romApp ((LPVOID(
5e60: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5e70: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c  ULONG,ULONG64, \
5e80: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
5e90: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
5ea0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
5eb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5ec0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5ee0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32  CALL)CreateFile2
5ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
5f00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
5f10: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
5f20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5f30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5f40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f60: 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48  sCreateFile2 ((H
5f70: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
5f80: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
5f90: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
5fa0: 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45      LPCREATEFILE
5fb0: 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
5fc0: 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b  ETERS))aSyscall[
5fd0: 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  65].pCurrent)..#
5fe0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5ff0: 52 54 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  RT.  { "LoadPack
6000: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
6010: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
6020: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
6030: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6040: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
6050: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
6060: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6090: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
60a0: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
60b0: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
60c0: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
60d0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
60e0: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
60f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6100: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
6110: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
6120: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
6130: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
6140: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6150: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
6160: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
6170: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
61a0: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
61b0: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
61c0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
61d0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70  ))aSyscall[67].p
61e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
61f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6200: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
6210: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
6220: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
6230: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
6240: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6250: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
6260: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
6270: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6280: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6290: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
62a0: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
62b0: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
62c0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
62d0: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
62e0: 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75  aSyscall[68].pCu
62f0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6300: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
6310: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
6320: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
6330: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
6340: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
6350: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
6360: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
6370: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
6380: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
63a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
63b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
63c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
63d0: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
63e0: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
63f0: 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[69].pCurrent)
6400: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6410: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
6420: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
6430: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
6440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
6450: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
6460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6470: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
6480: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
6490: 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
64c0: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
64d0: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
64e0: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
64f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  STR))aSyscall[70
6500: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6510: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
6520: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6530: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
6540: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
6550: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
6560: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
6570: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
6580: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 31  OID))aSyscall[71
6590: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
65a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
65b0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
65c0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
65d0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
65e0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
65f0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
6600: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
6610: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
6620: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6650: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
6660: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
6670: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6680: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
6690: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
66a0: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
66b0: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
66c0: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
66d0: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
66e0: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
66f0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
6700: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
6710: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
6720: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
6730: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
6740: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
6750: 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73  ** "win32" VFSes
6760: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6770: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
6780: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
6790: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
67a0: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
67b0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
67c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
67d0: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
67e0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
67f0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
6800: 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d  int winSetSystem
6810: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
6820: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
6830: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
6840: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
6850: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
6860: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
6870: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
6880: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
6890: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
68a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
68b0: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
68c0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
68d0: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
68e0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
68f0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
6900: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
6910: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
6920: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
6930: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
6940: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
6950: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
6960: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
6970: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
6980: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
6990: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
69a0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
69b0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
69c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
69d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
69e0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
69f0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
6a00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
6a10: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
6a20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
6a30: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
6a40: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
6a50: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6a60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
6a70: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
6a80: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
6a90: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
6aa0: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
6ab0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
6ac0: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
6ad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
6ae0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
6af0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
6b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6b10: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
6b20: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
6b30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6b40: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6b50: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
6b60: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
6b70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
6b80: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
6b90: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
6ba0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
6bb0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
6bc0: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
6bd0: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
6be0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
6bf0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
6c00: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
6c10: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
6c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6c30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
6c40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6c50: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
6c60: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
6c70: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
6c80: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
6c90: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
6ca0: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
6cb0: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
6cc0: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
6cd0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
6ce0: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
6cf0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
6d00: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
6d10: 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79  all_ptr winGetSy
6d20: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
6d30: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
6d40: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
6d50: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
6d60: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
6d70: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6d80: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
6d90: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
6da0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
6db0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
6dc0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
6dd0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
6de0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
6df0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
6e00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
6e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6e20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6e30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
6e40: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
6e50: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
6e60: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
6e70: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
6e80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
6e90: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
6ea0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
6eb0: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
6ec0: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
6ed0: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
6ee0: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
6ef0: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
6f00: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
6f10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69  c const char *wi
6f20: 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28  nNextSystemCall(
6f30: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20  sqlite3_vfs *p, 
6f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
6f50: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
6f60: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6f70: 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20  METER(p);.  if( 
6f80: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72  zName ){.    for
6f90: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
6fa0: 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69  e(aSyscall)-1; i
6fb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
6fc0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
6fd0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
6fe0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
6ff0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b  }.  }.  for(i++;
7000: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
7010: 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20  scall); i++){.  
7020: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
7030: 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20  ].pCurrent!=0 ) 
7040: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
7050: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  i].zName;.  }.  
7060: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7070: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7080: 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 65   outputs the spe
7090: 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 74  cified (ANSI) st
70a0: 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33  ring to the Win3
70b0: 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69  2 debugger.** (i
70c0: 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f  f available)..*/
70d0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
70e0: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
70f0: 28 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74  (char *zBuf, int
7100: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
7110: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
7120: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7130: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
7140: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
7150: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
7160: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
7170: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
7180: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
7190: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
71a0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
71b0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
71c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
71d0: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
71e0: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
71f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
7200: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
7210: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
7220: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
7230: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
7240: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
7250: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
7260: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
7270: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
7280: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
7290: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
72a0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
72b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
72c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
72d0: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
72e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
72f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
7300: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
7310: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
7320: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7330: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
7340: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
7350: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
7360: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
7370: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
7380: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
7390: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
73a0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
73b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
73c0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
73d0: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
73e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
73f0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
7400: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
7410: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
7420: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
7430: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
7440: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
7450: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
7460: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
7470: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
7480: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
7490: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
74a0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
74b0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
74c0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
74d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
74e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
74f0: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
7500: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
7510: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
7520: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
7530: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
7540: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
7550: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
7560: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
7570: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7580: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
7590: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
75a0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
75b0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
75c0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
75d0: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
75e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
75f0: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
7600: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
7610: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
7620: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
7630: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
7640: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
7670: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
7680: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
7690: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
76a0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
76b0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
76c0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
76d0: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
76e0: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
76f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
7700: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
7710: 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72  n-zero) if we ar
7720: 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20  e running under 
7730: 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69  WinNT, Win2K, Wi
7740: 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45  nXP,.** or WinCE
7750: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
7760: 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35  (zero) for Win95
7770: 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d  , Win98, or WinM
7780: 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73  E..**.** Here is
7790: 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20   an interesting 
77a0: 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69  observation:  Wi
77b0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20  n95, Win98, and 
77c0: 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68  WinME lack.** th
77d0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
77e0: 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20  PI.  But we can 
77f0: 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79  still statically
7800: 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68   link against th
7810: 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e  at.** API as lon
7820: 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61  g as we don't ca
7830: 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69  ll it when runni
7840: 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20  ng Win95/98/ME. 
7850: 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68   A call to.** th
7860: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
7870: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
7880: 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57  if the host is W
7890: 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a  in95/98/ME or.**
78a0: 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20   WinNT/2K/XP so 
78b0: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  that we will kno
78c0: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
78d0: 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63   we can safely c
78e0: 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  all.** the LockF
78f0: 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a  ileEx() API..*/.
7900: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7910: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
7920: 5f 57 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20  _WINRT.# define 
7930: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
7940: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
7950: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
7960: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
7970: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
7980: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
7990: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
79a0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
79b0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
79c0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
79d0: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
79e0: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
79f0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
7a00: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
7a10: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
7a20: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
7a30: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7a40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
7a50: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ==2;.  }.#endif 
7a60: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
7a70: 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  CE */..#ifdef SQ
7a80: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
7a90: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
7aa0: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
7ab0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
7ac0: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
7ad0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
7ae0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
7af0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
7b00: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
7b10: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
7b20: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
7b30: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
7b40: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
7b50: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
7b60: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
7b70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
7b80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
7b90: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
7ba0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
7bb0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
7bc0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
7bd0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
7be0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
7bf0: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
7c00: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f  es>=0 );.  p = o
7c10: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
7c20: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
7c30: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
7c40: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  _T)nBytes);.  if
7c50: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
7c60: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
7c70: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
7c80: 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79   HeapAlloc %u by
7c90: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
7ca0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
7cb0: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
7cc0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
7cd0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
7ce0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
7cf0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
7d00: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
7d10: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
7d20: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
7d30: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
7d40: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
7d50: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
7d60: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
7d70: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
7d80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
7d90: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
7da0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
7db0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7dc0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
7dd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
7de0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
7df0: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
7e00: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
7e10: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
7e20: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
7e30: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
7e40: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20  Prior ) return; 
7e50: 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20  /* Passing NULL 
7e60: 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75  to HeapFree is u
7e70: 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69  ndefined. */.  i
7e80: 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68  f( !osHeapFree(h
7e90: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
7ea0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
7eb0: 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71  Prior) ){.    sq
7ec0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
7ed0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
7ee0: 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63  to HeapFree bloc
7ef0: 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d  k %p (%d), heap=
7f00: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
7f10: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
7f20: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
7f30: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
7f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7f50: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
7f60: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
7f70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
7f80: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
7f90: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
7fa0: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
7fb0: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
7fc0: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
7fd0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
7fe0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
7ff0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
8000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
8010: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
8020: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
8030: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8040: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
8050: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
8060: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
8070: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
8080: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
8090: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
80a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
80b0: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
80c0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
80d0: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
80e0: 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  );.  if( !pPrior
80f0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65   ){.    p = osHe
8100: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
8110: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8120: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
8130: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65  nBytes);.  }else
8140: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
8150: 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  ReAlloc(hHeap, S
8160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8170: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20  _FLAGS, pPrior, 
8180: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
8190: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b  .  }.  if( !p ){
81a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
81b0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
81c0: 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20  failed to %s %u 
81d0: 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70  bytes (%d), heap
81e0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
81f0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
8200: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
8210: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
8220: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
8230: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
8240: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
8250: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
8260: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
8270: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
8280: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
8290: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
82a0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
82b0: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
82c0: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
82d0: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
82e0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
82f0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
8300: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
8310: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
8320: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
8330: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
8340: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8350: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
8360: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
8370: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8380: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
8390: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
83a0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
83b0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
83c0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
83d0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
83e0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
83f0: 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70   0;.  n = osHeap
8400: 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Size(hHeap, SQLI
8410: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8420: 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e  AGS, p);.  if( n
8430: 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a  ==(SIZE_T)-1 ){.
8440: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8450: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
8460: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a  ailed to HeapSiz
8470: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
8480: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
8490: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
84a0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
84b0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
84c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
84d0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
84f0: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
8500: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
8510: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
8520: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
8530: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
8540: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
8550: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
8560: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
8570: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
8580: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
8590: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
85a0: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
85b0: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
85c0: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
85d0: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
85e0: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
85f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8600: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
8610: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49  mData->magic==WI
8620: 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23  NMEM_MAGIC );..#
8630: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8640: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
8650: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a  N32_HEAP_CREATE.
8660: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
8670: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
8680: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
8690: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61  eap = osHeapCrea
86a0: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  te(SQLITE_WIN32_
86b0: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
86f0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20  EAP_INIT_SIZE,. 
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
8730: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
8740: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
8750: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
8760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
8770: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
8780: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
8790: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
87a0: 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c   (%d), flags=%u,
87b0: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
87c0: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
87d0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
87e0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
87f0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
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 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
8830: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
8840: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
8850: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8860: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
8870: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
8880: 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RUE;.    assert(
8890: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
88a0: 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  wned );.  }.#els
88b0: 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  e.  pWinMemData-
88c0: 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72  >hHeap = osGetPr
88d0: 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69  ocessHeap();.  i
88e0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
88f0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71  >hHeap ){.    sq
8900: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
8910: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
8920: 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72  "failed to GetPr
8930: 6f 63 65 73 73 48 65 61 70 20 28 25 64 29 22 2c  ocessHeap (%d)",
8940: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
8950: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
8960: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
8970: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
8980: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
8990: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
89a0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
89b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
89c0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
89d0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
89e0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
89f0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
8a00: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8a10: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
8a20: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
8a30: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
8a40: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
8a50: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
8a60: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
8a70: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
8a80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8a90: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
8aa0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
8ab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8ac0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
8ad0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
8ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
8af0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
8b00: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
8b10: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
8b20: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
8b30: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
8b40: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
8b50: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
8b60: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
8b70: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
8b80: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
8b90: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
8ba0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8bb0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
8bc0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
8bd0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
8be0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
8bf0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
8c00: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
8c10: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
8c20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8c30: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
8c40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
8c50: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
8c60: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
8c70: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
8c80: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8c90: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
8ca0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
8cb0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
8cc0: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
8cd0: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
8d00: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69  or(), (void*)pWi
8d10: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
8d20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8d30: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
8d40: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ned = FALSE;.   
8d50: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
8d60: 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c  ta->hHeap = NULL
8d70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
8d80: 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d  opulate the low-
8d90: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
8da0: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
8db0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20   pointers in.** 
8dc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
8dd0: 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74  fig.m with point
8de0: 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69  ers to the routi
8df0: 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
8e00: 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  . The.** argumen
8e10: 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62  ts specify the b
8e20: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
8e30: 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o manage..**.** 
8e40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8e50: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
8e60: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c  qlite3_config(),
8e70: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a   and therefore.*
8e80: 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
8e90: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
8ea0: 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a  fe (it is not)..
8eb0: 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
8ec0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
8ed0: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
8ee0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
8ef0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
8f00: 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65  em_methods winMe
8f10: 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  mMethods = {.   
8f20: 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20   winMemMalloc,. 
8f30: 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20     winMemFree,. 
8f40: 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63     winMemRealloc
8f50: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65  ,.    winMemSize
8f60: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e  ,.    winMemRoun
8f70: 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49  dup,.    winMemI
8f80: 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  nit,.    winMemS
8f90: 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69  hutdown,.    &wi
8fa0: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a  n_mem_data.  };.
8fb0: 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d    return &winMem
8fc0: 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64  Methods;.}..void
8fd0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
8fe0: 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73  fault(void){.  s
8ff0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
9000: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
9010: 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65  OC, sqlite3MemGe
9020: 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e  tWin32());.}.#en
9030: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
9040: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
9050: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
9060: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d  TF-8 string to M
9070: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
9080: 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a   (UTF-16?). .**.
9090: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
90a0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
90b0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
90c0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f   from malloc..*/
90d0: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 75  .static LPWSTR u
90e0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  tf8ToUnicode(con
90f0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9100: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  me){.  int nChar
9110: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
9120: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68  Filename;..  nCh
9130: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
9140: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
9150: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
9160: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
9170: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
9180: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9190: 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e    }.  zWideFilen
91a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
91b0: 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65  lloc( nChar*size
91c0: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
91d0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
91e0: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
91f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9200: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
9210: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
9220: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
9230: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
9240: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
9270: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
9280: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
9290: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
92a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
92b0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
92c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
92d0: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
92e0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
92f0: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
9300: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
9310: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
9320: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
9330: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
9340: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
9350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9360: 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28   *unicodeToUtf8(
9370: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
9380: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
9390: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
93a0: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
93b0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
93c0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
93d0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
93e0: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
93f0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
9400: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
9410: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
9420: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
9430: 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
9440: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
9450: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
9460: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
9470: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
9480: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
9490: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
94a0: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
94b0: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
94e0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
94f0: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
9500: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
9510: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
9520: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
9530: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
9540: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
9550: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f  n ANSI string to
9560: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
9570: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  de, based on the
9580: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65  .** current code
9590: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f  page settings fo
95a0: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20  r file apis..** 
95b0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
95c0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
95d0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
95e0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
95f0: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  3_malloc..*/.sta
9600: 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63 73 54  tic LPWSTR mbcsT
9610: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
9620: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
9630: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
9640: 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65  LPWSTR zMbcsFile
9650: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
9660: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
9670: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
9680: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
9690: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
96a0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
96b0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
96c0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
96d0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48     0)*sizeof(WCH
9700: 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  AR);.  if( nByte
9710: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9720: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73  n 0;.  }.  zMbcs
9730: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
9740: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
9750: 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c  *sizeof(zMbcsFil
9760: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
9770: 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  f( zMbcsFilename
9780: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9790: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
97a0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
97b0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
97c0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
97d0: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
97e0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66      nByte);.  if
9810: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
9820: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9830: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  MbcsFilename);. 
9840: 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65     zMbcsFilename
9850: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
9860: 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  rn zMbcsFilename
9870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
9880: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
9890: 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79  code to multi-by
98a0: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
98b0: 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ing, based on th
98c0: 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49  e.** user's ANSI
98d0: 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   codepage..**.**
98e0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
98f0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
9900: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
9910: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
9920: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
9930: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
9940: 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a  ToMbcs(LPCWSTR z
9950: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
9960: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
9970: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
9980: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
9990: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
99a0: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
99b0: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
99c0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
99d0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
99e0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
99f0: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
9a00: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
9a10: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
9a20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
9a30: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
9a40: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
9a50: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
9a60: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
9a70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
9a80: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
9a90: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
9aa0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
9ab0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
9ac0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c         nByte, 0,
9af0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
9b00: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
9b10: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e  ite3_free(zFilen
9b20: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
9b30: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
9b40: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
9b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
9b60: 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  t multibyte char
9b70: 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20  acter string to 
9b80: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
9b90: 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74   hold the.** ret
9ba0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
9bb0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
9bc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
9bd0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
9be0: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
9bf0: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
9c00: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
9c10: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66  ar *zFilenameUtf
9c20: 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  8;.  LPWSTR zTmp
9c30: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
9c40: 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  e = mbcsToUnicod
9c50: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
9c60: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
9c70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9c80: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
9c90: 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Utf8 = unicodeTo
9ca0: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
9cb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9cc0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
9cd0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
9ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
9cf0: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
9d00: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
9d10: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
9d20: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
9d30: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
9d40: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
9d50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
9d60: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
9d70: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
9d80: 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  _mbcs(const char
9d90: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
9da0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
9db0: 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  bcs;.  LPWSTR zT
9dc0: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
9dd0: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
9de0: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
9df0: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
9e00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9e10: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
9e20: 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65  meMbcs = unicode
9e30: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29  ToMbcs(zTmpWide)
9e40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9e50: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
9e60: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62  turn zFilenameMb
9e70: 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  cs;.}.../*.** Th
9e80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
9e90: 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  f getLastErrorMs
9ea0: 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  g.** is zero if 
9eb0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9ec0: 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
9ed0: 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
9ee0: 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
9ef0: 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
9f00: 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a  as truncated)..*
9f10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
9f20: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f  LastErrorMsg(DWO
9f30: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e  RD lastErrno, in
9f40: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
9f50: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
9f60: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
9f70: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
9f80: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
9f90: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
9fa0: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
9fb0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
9fc0: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
9fd0: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
9fe0: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
9ff0: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
a000: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
a010: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
a020: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
a030: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a040: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
a050: 54 65 6d 70 57 69 64 65 5b 4d 41 58 5f 50 41 54  TempWide[MAX_PAT
a060: 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53  H+1]; /* NOTE: S
a070: 6f 6d 65 77 68 61 74 20 61 72 62 69 74 72 61 72  omewhat arbitrar
a080: 79 2e 20 2a 2f 0a 20 20 20 20 64 77 4c 65 6e 20  y. */.    dwLen 
a090: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
a0a0: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
a0b0: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
a0e0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
a0f0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
a140: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20      zTempWide,. 
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 58 5f              MAX_
a1b0: 50 41 54 48 2c 0a 20 20 20 20 20 20 20 20 20 20  PATH,.          
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20     0);.#else.   
a1e0: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
a1f0: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
a200: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
a210: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
a220: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
a230: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
a260: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
a270: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
a290: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
a2a0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
a2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
a2f0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a330: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
a340: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a380: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64          0);.#end
a390: 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  if.    if( dwLen
a3a0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
a3b0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
a3c0: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
a3d0: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
a3e0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
a3f0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
a400: 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65    zOut = unicode
a410: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65  ToUtf8(zTempWide
a420: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a430: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
a440: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
a450: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a  S_WINRT.      /*
a460: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
a470: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
a480: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
a490: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
a4a0: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64  calFree(zTempWid
a4b0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
a4c0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
a4d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
a4e0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
a4f0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
a500: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
a510: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
a520: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
a530: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
a560: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
a570: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
a5a0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
a5b0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
a600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
a620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
a640: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a660: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
a690: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
a6a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
a6b0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
a6c0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
a6d0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
a6e0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a6f0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
a700: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
a710: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
a720: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
a730: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
a740: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
a750: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
a760: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
a770: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
a780: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
a790: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
a7a0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
a7b0: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
a7c0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
a7d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
a7e0: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
a7f0: 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45  x%x (%u)", lastE
a800: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
a810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a820: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
a830: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
a840: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
a850: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
a860: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
a870: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
a880: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
a890: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
a8a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a8b0: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
a8c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
a8d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a8e0: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
a8f0: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
a900: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
a910: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
a920: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
a930: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a940: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
a950: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
a960: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
a970: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
a980: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
a990: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
a9a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
a9b0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
a9c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
a9d0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
a9e0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
a9f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
aa00: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61   .** FormatMessa
aa10: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
aa20: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
aa30: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
aa40: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
aa50: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
aa60: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
aa70: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
aa80: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
aa90: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
aaa0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
aab0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
aac0: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
aad0: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
aae0: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
aaf0: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
ab00: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f  and the the asso
ab10: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
ab20: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
ab30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
ab40: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
ab50: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
ab60: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
ab70: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
ab80: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
ab90: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
aba0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
abb0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
abc0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
abd0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
abe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
abf0: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
ac00: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
ac10: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
ac20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ac30: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
ac40: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
ac50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
ac60: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
ac70: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
ac80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
ac90: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
aca0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
acb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
acc0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
acd0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
ace0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
acf0: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad10: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
ad20: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
ad30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ad60: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
ad70: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
ad80: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
ad90: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
ada0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
adb0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
adc0: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
add0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
ade0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
adf0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
ae00: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
ae10: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
ae20: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
ae30: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
ae40: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
ae50: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
ae60: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
ae70: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
ae80: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
ae90: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
aea0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
aeb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
aec0: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
aed0: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
aee0: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
aef0: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
af00: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
af10: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
af20: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
af30: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
af40: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
af50: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
af60: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
af70: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
af80: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
af90: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
afa0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
afb0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
afc0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
afd0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
afe0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
aff0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
b000: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
b010: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
b020: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
b030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
b040: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
b050: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
b060: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
b070: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
b080: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
b090: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
b0a0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
b0b0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
b0c0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
b0d0: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
b0e0: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
b0f0: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
b100: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
b110: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
b120: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
b130: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
b140: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
b150: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
b160: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
b170: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
b180: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
b190: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
b1a0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
b1b0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
b1c0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
b1d0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
b1e0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
b1f0: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
b200: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
b210: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
b220: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
b230: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
b240: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
b250: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
b260: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
b270: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
b280: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
b290: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
b2a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
b2b0: 32 5f 73 6c 65 65 70 28 77 69 6e 33 32 49 6f 65  2_sleep(win32Ioe
b2c0: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
b2d0: 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
b2e0: 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
b2f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
b300: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
b310: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
b320: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
b330: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f  ../*.** Log a I/
b340: 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70  O error retry ep
b350: 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  isode..*/.static
b360: 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69   void logIoerr(i
b370: 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66  nt nRetry){.  if
b380: 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20  ( nRetry ){.    
b390: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b3a0: 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20  TE_IOERR, .     
b3b0: 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66   "delayed %dms f
b3c0: 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20  or lock/sharing 
b3d0: 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20  conflict",.     
b3e0: 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
b3f0: 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52  Delay*nRetry*(nR
b400: 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b  etry+1)/2.    );
b410: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
b420: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_OS_WINCE./***
b430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b470: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
b480: 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
b490: 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
b4a0: 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69  nly..*/./*.** Wi
b4b0: 6e 64 6f 77 73 20 43 45 20 64 6f 65 73 20 6e 6f  ndows CE does no
b4c0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
b4d0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
b4e0: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
b4f0: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
b500: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
b510: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
b520: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
b530: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
b540: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
b550: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
b560: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
b570: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
b580: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
b590: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
b5a0: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
b5b0: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
b5c0: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
b5d0: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
b5e0: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
b5f0: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
b600: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
b610: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
b620: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
b630: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
b640: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
b650: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
b660: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
b670: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
b680: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
b690: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
b6a0: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
b6b0: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
b6c0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
b6d0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
b6e0: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
b6f0: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
b700: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
b710: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
b720: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
b730: 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 23 64 65 66  turn &y;.}..#def
b740: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
b750: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
b760: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
b770: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
b780: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
b790: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
b7a0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
b7b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
b7c0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
b7d0: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
b7e0: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
b7f0: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
b800: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
b810: 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
b820: 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
b830: 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
b840: 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
b850: 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
b860: 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
b870: 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
b880: 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
b890: 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
b8a0: 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
b8b0: 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
b8c0: 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
b8d0: 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
b8e0: 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
b8f0: 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
b900: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
b910: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
b920: 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
b930: 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74   BOOL winceCreat
b940: 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
b950: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
b960: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b970: 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
b980: 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 42  PWSTR zName;.  B
b990: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
b9a0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66  ;..  zName = utf
b9b0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
b9c0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
b9d0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
b9e0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
b9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
ba00: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  E;.  }..  /* Ini
ba10: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
ba20: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
ba30: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
ba40: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
ba50: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
ba60: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
ba70: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
ba80: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
ba90: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
baa0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
bab0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
bac0: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
bad0: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
bae0: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
baf0: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
bb00: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
bb10: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
bb20: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
bb30: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
bb40: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
bb50: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
bb60: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
bb70: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
bb80: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
bb90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
bba0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
bbb0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
bbc0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
bbd0: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
bbe0: 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63 65 43  stErrno, "winceC
bbf0: 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69  reateLock1", zFi
bc00: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  lename);.    sql
bc10: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
bc20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
bc30: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  SE;.  }..  /* Ac
bc40: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
bc50: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
bc60: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
bc70: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
bc80: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
bc90: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
bca0: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
bcb0: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
bcc0: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
bcd0: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
bce0: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
bcf0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
bd00: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
bd10: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
bd20: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
bd30: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
bd40: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
bd50: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61  me..  */.  osCha
bd60: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
bd70: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
bd80: 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
bd90: 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f  appingW(INVALID_
bda0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55  HANDLE_VALUE, NU
bdb0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
bde0: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73  _READWRITE, 0, s
bdf0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
be00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29            zName)
be30: 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20  ;  ..  /* Set a 
be40: 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
be50: 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69  tes we're the fi
be60: 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68  rst to create th
be70: 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a  e memory so it .
be80: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72    ** must be zer
be90: 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  o-initialized */
bea0: 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61 73 74  .  if (osGetLast
beb0: 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52  Error() == ERROR
bec0: 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
bed0: 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
bee0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
bef0: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
bf00: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
bf10: 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
bf20: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
bf30: 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
bf40: 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  t. */.  if (pFil
bf50: 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20  e->hShared){.   
bf60: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
bf70: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
bf80: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
bf90: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
bfa0: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
bfb0: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
bfc0: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
bfd0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
bfe0: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
bff0: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
c000: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
c010: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
c020: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
c030: 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72  if (!pFile->shar
c040: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
c050: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
c060: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
c070: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
c080: 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
c090: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c0a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c0b0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
c0c0: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
c0d0: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
c0e0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
c0f0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
c100: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
c110: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
c120: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
c130: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
c140: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
c150: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
c160: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
c170: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
c180: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
c190: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
c1a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
c1b0: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
c1c0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
c1d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
c1e0: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
c1f0: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20  return FALSE;.  
c200: 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61  }.  .  /* Initia
c210: 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
c220: 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
c230: 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
c240: 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20   if (bInit) {.  
c250: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
c260: 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
c270: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
c280: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
c290: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
c2a0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
c2b0: 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   TRUE;.}../*.** 
c2c0: 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74  Destroy the part
c2d0: 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74   of winFile that
c2e0: 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63   deals with winc
c2f0: 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  e locks.*/.stati
c300: 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74  c void winceDest
c310: 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  royLock(winFile 
c320: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70  *pFile){.  if (p
c330: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
c340: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68     /* Acquire th
c350: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
c360: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
c370: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
c380: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
c390: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68  lowing blocks sh
c3a0: 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73  ould probably as
c3b0: 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f  sert in debug mo
c3c0: 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20  de, but they.   
c3d0: 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e      are to clean
c3e0: 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c  up in case any l
c3f0: 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70  ocks remained op
c400: 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  en */.    if (pF
c410: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
c420: 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ers){.      pFil
c430: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
c440: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ers --;.    }.  
c450: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
c460: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20  al.bReserved){. 
c470: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
c480: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
c490: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
c4a0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
c4b0: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
c4c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
c4d0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
c4e0: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
c4f0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
c500: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
c510: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
c520: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
c530: 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LSE;.    }..    
c540: 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20  /* De-reference 
c550: 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f  and close our co
c560: 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  py of the shared
c570: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a   memory handle *
c580: 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65  /.    osUnmapVie
c590: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
c5a0: 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c  hared);.    osCl
c5b0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
c5c0: 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
c5d0: 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
c5e0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
c5f0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
c600: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20  pFile->hMutex); 
c610: 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48     .    osCloseH
c620: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
c630: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
c640: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
c650: 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e    }.}../* .** An
c660: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c670: 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
c680: 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
c690: 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
c6a0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
c6b0: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
c6c0: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
c6d0: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
c6e0: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
c6f0: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
c700: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
c710: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
c720: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
c730: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
c740: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
c750: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
c760: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
c770: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
c780: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
c790: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
c7a0: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
c7b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
c7c0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
c7d0: 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
c7e0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
c7f0: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
c800: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
c810: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
c820: 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
c830: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
c840: 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
c850: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
c860: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
c870: 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
c880: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
c890: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
c8a0: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
c8b0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
c8c0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
c8d0: 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
c8e0: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
c8f0: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
c900: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
c910: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
c920: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
c930: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
c940: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
c950: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
c960: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
c970: 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
c980: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
c990: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
c9a0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
c9b0: 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
c9c0: 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
c9d0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
c9e0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
c9f0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
ca00: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
ca10: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
ca20: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
ca30: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
ca40: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
ca50: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
ca60: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
ca70: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
ca80: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
ca90: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
caa0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
cab0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
cac0: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
cad0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
cae0: 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
caf0: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
cb00: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
cb10: 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
cb20: 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
cb30: 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
cb40: 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
cb50: 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
cb60: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
cb70: 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
cb80: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
cb90: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
cba0: 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
cbb0: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
cbc0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
cbd0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
cbe0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
cbf0: 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
cc00: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
cc10: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
cc20: 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
cc30: 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75  RVED_BYTE && nNu
cc40: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
cc50: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
cc60: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
cc70: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
cc80: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
cc90: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
cca0: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
ccb0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
ccc0: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
ccd0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
cce0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
ccf0: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
cd00: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
cd10: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
cd20: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
cd30: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
cd40: 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
cd50: 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
cd60: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
cd70: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
cd80: 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
cd90: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
cda0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
cdb0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
cdc0: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
cdd0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
cde0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
cdf0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
ce00: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ce10: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
ce20: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
ce30: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
ce40: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
ce50: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
ce60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ce70: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
ce80: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
ce90: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
cea0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ceb0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
cec0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
ced0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
cee0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
cef0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
cf00: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
cf10: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
cf20: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
cf30: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
cf40: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
cf50: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
cf60: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
cf70: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
cf80: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
cf90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
cfa0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
cfb0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
cfc0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
cfd0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
cfe0: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
cff0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
d000: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
d010: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
d020: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
d030: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
d040: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
d050: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
d060: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
d070: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
d080: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
d090: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
d0a0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
d0b0: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
d0c0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
d0d0: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
d0e0: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
d0f0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
d100: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
d110: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
d120: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
d130: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
d140: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
d150: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
d160: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
d170: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
d180: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
d190: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
d1a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
d1b0: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
d1c0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
d1d0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
d1e0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
d1f0: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
d200: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
d210: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
d220: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
d230: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
d240: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
d250: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
d260: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
d270: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
d280: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
d290: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
d2a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
d2b0: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
d2c0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
d2d0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
d2e0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
d2f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
d300: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
d310: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
d320: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
d330: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
d340: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
d350: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
d360: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
d370: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
d380: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
d390: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
d3a0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
d3b0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
d3c0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
d3d0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d3e0: 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a  bReturn;.}./*.**
d3f0: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63   End of the spec
d400: 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e  ial code for win
d410: 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
d420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d460: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
d470: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a  TE_OS_WINCE */..
d480: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c  /*.** Lock a fil
d490: 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  e region..*/.sta
d4a0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b  tic BOOL winLock
d4b0: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
d4c0: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
d4d0: 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20   flags,.  DWORD 
d4e0: 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
d4f0: 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
d500: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
d510: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
d520: 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
d530: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
d540: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
d550: 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
d560: 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
d570: 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
d580: 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
d590: 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
d5a0: 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  LockFile..  */. 
d5b0: 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63   return winceLoc
d5c0: 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66  kFile(phFile, of
d5d0: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
d5e0: 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  igh,.           
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
d600: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
d610: 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
d620: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
d630: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
d640: 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
d650: 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
d660: 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
d670: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
d680: 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
d690: 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
d6a0: 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
d6b0: 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
d6c0: 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
d6d0: 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
d6e0: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
d6f0: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
d700: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
d710: 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
d720: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
d730: 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
d740: 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
d750: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
d760: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
d770: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
d780: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
d790: 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
d7a0: 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
d7b0: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
d7c0: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
d7d0: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
d7e0: 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
d7f0: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
d800: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
d810: 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
d820: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
d830: 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
d840: 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
d850: 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
d860: 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
d870: 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
d880: 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
d890: 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
d8a0: 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
d8b0: 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
d8c0: 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
d8d0: 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
d900: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
d910: 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  se.  if( isNT() 
d920: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
d930: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
d940: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
d950: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
d960: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
d970: 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
d980: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
d990: 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
d9a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
d9b0: 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
d9c0: 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
d9d0: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
d9e0: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
d9f0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
da00: 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
da10: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
da20: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
da30: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
da60: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
da70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
daa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
dac0: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
dad0: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
dae0: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
daf0: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
db00: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
db10: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
db20: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
db30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
db70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
db80: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
db90: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
dba0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
dbb0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
dbc0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
dbd0: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
dbe0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
dbf0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
dc00: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
dc10: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
dc20: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
dc30: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
dc40: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
dc50: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
dc60: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
dc70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
dc80: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
dc90: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
dca0: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
dcb0: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
dcc0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
dcd0: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69  tatic int seekWi
dce0: 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  nFile(winFile *p
dcf0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
dd00: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
dd10: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
dd20: 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
dd30: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
dd40: 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
dd50: 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
dd60: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
dd70: 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd90: 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
dda0: 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
ddb0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
ddc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
ddd0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
dde0: 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
ddf0: 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
de00: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
de10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de20: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
de30: 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
de40: 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72  or() */..  upper
de50: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
de60: 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
de70: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
de80: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
de90: 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
dea0: 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
deb0: 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
dec0: 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
ded0: 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
dee0: 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
def0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
df00: 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
df10: 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
df20: 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
df30: 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
df40: 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
df50: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
df60: 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
df70: 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
df80: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
df90: 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
dfa0: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
dfb0: 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
dfc0: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
dfd0: 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
dfe0: 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
dff0: 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f  ured, it is also
e000: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61   necessary to ca
e010: 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74  ll .  ** GetLast
e020: 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  Error()..  */.  
e030: 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c  dwRet = osSetFil
e040: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
e050: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
e060: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
e070: 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64  EGIN);..  if( (d
e080: 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  wRet==INVALID_SE
e090: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20  T_FILE_POINTER. 
e0a0: 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
e0b0: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
e0c0: 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
e0d0: 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  R)) ){.    pFile
e0e0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
e0f0: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
e100: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e110: 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
e120: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
e130: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65 6b             "seek
e140: 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  WinFile", pFile-
e150: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74  >zPath);.    ret
e160: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  urn 1;.  }..  re
e170: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
e180: 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20  /*.  ** Same as 
e190: 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
e1a0: 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  at this implemen
e1b0: 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72  tation works for
e1c0: 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20   WinRT..  */..  
e1d0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b  LARGE_INTEGER x;
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65  /* The new offse
e200: 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74  t */.  BOOL bRet
e210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e220: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
e230: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
e240: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a  ilePointerEx() *
e250: 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20  /..  x.QuadPart 
e260: 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65  = iOffset;.  bRe
e270: 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
e280: 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c  nterEx(pFile->h,
e290: 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49   x, 0, FILE_BEGI
e2a0: 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29  N);..  if(!bRet)
e2b0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
e2c0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
e2d0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
e2e0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
e2f0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
e300: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65               "se
e320: 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c  ekWinFile", pFil
e330: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
e340: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
e350: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e370: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
e380: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
e390: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
e3a0: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
e3b0: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
e3c0: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
e3d0: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
e3e0: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
e3f0: 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
e400: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
e410: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
e420: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
e430: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
e440: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
e450: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
e460: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
e470: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
e480: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
e490: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
e4a0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
e4b0: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
e4c0: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
e4d0: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
e4e0: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
e4f0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
e500: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
e510: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
e520: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
e530: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e540: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
e550: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
e560: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
e570: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
e580: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
e590: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68  sert( pFile->pSh
e5a0: 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  m==0 );.  OSTRAC
e5b0: 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
e5c0: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64   pFile->h));.  d
e5d0: 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
e5e0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
e5f0: 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
e600: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
e610: 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
e620: 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
e630: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
e640: 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
e650: 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
e660: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
e670: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
e680: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
e690: 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
e6a0: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
e6b0: 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
e6c0: 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
e6d0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
e6e0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
e6f0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
e700: 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
e710: 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
e720: 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
e730: 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
e740: 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
e750: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
e760: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
e770: 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
e780: 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74   .        && cnt
e790: 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54  ++ < WINCE_DELET
e7a0: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20  ION_ATTEMPTS.   
e7b0: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
e7c0: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
e7d0: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
e7e0: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
e7f0: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
e800: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
e810: 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
e820: 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
e830: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
e840: 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c  E(("CLOSE %d %s\
e850: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
e860: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
e870: 64 22 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29  d"));.  if( rc )
e880: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  {.    pFile->h =
e890: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65   NULL;.  }.  Ope
e8a0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
e8b0: 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
e8c0: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
e8d0: 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28    : winLogError(
e8e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
e8f0: 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  SE, osGetLastErr
e900: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c  "winClose", pFil
e930: 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  e->zPath);.}../*
e940: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
e950: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
e960: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
e970: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
e980: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
e990: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
e9a0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
e9b0: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
e9c0: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
e9d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
e9e0: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
e9f0: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
ea00: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61    /* File to rea
ea10: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64  d from */.  void
ea20: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
ea30: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ea40: 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69  content into thi
ea50: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
ea60: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
ea70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ea80: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
ea90: 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ead */.  sqlite3
eaa0: 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
eab0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
eac0: 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66  ding at this off
ead0: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53  set */.){.#if !S
eae0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
eaf0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
eb00: 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20  lapped;         
eb10: 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
eb20: 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a  or ReadFile. */.
eb30: 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
eb40: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
eb50: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65  le*)id;  /* file
eb60: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f   handle */.  DWO
eb70: 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  RD nRead;       
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb90: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
eba0: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
ebb0: 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  om file */.  int
ebc0: 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ebe0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73  Number of retrys
ebf0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
ec00: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
ec10: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
ec20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
ec30: 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
ec40: 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64  "READ %d lock=%d
ec50: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
ec60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
ec70: 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
ec80: 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65 65  _WINCE.  if( see
ec90: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
eca0: 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72  offset) ){.    r
ecb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
ecc0: 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
ecd0: 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
ece0: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
ecf0: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23   &nRead, 0) ){.#
ed00: 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f  else.  memset(&o
ed10: 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
ed20: 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
ed30: 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
ed40: 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
ed50: 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
ed60: 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  fff);.  overlapp
ed70: 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
ed80: 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
ed90: 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
eda0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52  );.  while( !osR
edb0: 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
edc0: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
edd0: 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ead, &overlapped
ede0: 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73  ) &&.         os
edf0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
ee00: 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46  ERROR_HANDLE_EOF
ee10: 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44   ){.#endif.    D
ee20: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
ee30: 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
ee40: 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
ee50: 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
ee60: 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
ee70: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
ee80: 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
ee90: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
eea0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
eeb0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
eec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
eed0: 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
eee0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c  >zPath);.  }.  l
eef0: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
ef00: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57  .  if( nRead<(DW
ef10: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f  ORD)amt ){.    /
ef20: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
ef30: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
ef40: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
ef50: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
ef60: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52  ((char*)pBuf)[nR
ef70: 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65  ead], 0, amt-nRe
ef80: 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ad);.    return 
ef90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
efa0: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
efb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
efc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
efd0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
efe0: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
eff0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
f000: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
f010: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
f020: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
f030: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
f040: 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
f050: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f070: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
f080: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
f090: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
f0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f0b0: 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
f0c0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
f0d0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
f0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f0f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
f100: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
f110: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
f120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f130: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
f140: 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
f150: 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
f160: 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
f190: 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c   has occured, el
f1a0: 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
f1b0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
f1c0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
f1d0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
f1e0: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
f1f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f200: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
f210: 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
f220: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
f230: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
f240: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
f250: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
f260: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
f270: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
f280: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
f290: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
f2a0: 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25  STRACE(("WRITE %
f2b0: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
f2c0: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
f2d0: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
f2e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
f2f0: 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69    rc = seekWinFi
f300: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
f310: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
f320: 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64  {.#else.  {.#end
f330: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
f340: 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52  S_WINCE.    OVER
f350: 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
f360: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d;        /* The
f370: 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74   offset for Writ
f380: 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66  eFile. */.#endif
f390: 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20  .    u8 *aRem = 
f3a0: 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20  (u8 *)pBuf;     
f3b0: 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74     /* Data yet t
f3c0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
f3d0: 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61      int nRem = a
f3e0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
f3f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
f400: 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77  ytes yet to be w
f410: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57  ritten */.    DW
f420: 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ORD nWrite;     
f430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
f440: 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
f450: 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29  each WriteFile()
f460: 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f   call */.    DWO
f470: 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
f480: 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61  O_ERROR;   /* Va
f490: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f4a0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
f4b0: 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  /..#if !SQLITE_O
f4c0: 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73  S_WINCE.    mems
f4d0: 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
f4e0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
f4f0: 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72  PPED));.    over
f500: 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
f510: 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
f520: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0xffffffff);.   
f530: 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
f540: 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
f550: 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
f560: 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
f570: 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  if..    while( n
f580: 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c  Rem>0 ){.#if SQL
f590: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
f5a0: 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
f5b0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
f5c0: 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
f5d0: 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20  e, 0) ){.#else. 
f5e0: 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
f5f0: 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
f600: 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
f610: 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ite, &overlapped
f620: 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) ){.#endif.    
f630: 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
f640: 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
f650: 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
f660: 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
f670: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
f680: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
f690: 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
f6a0: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
f6b0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
f6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
f6d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
f6e0: 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74  NCE.      offset
f6f0: 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
f700: 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
f710: 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
f720: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
f730: 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  );.      overlap
f740: 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
f750: 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
f760: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
f770: 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  f);.#endif.     
f780: 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
f790: 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
f7a0: 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
f7b0: 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
f7c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f7d0: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
f7e0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
f7f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
f800: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
f810: 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
f820: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
f830: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
f840: 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
f850: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
f860: 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
f870: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f880: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
f890: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
f8a0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
f8b0: 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c  OERR_WRITE, pFil
f8c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
f8d0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
f8e0: 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  rite", pFile->zP
f8f0: 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
f900: 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74     logIoerr(nRet
f910: 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ry);.  }.  retur
f920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f930: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
f940: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
f950: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
f960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
f970: 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
f980: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
f990: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
f9a0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
f9b0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
f9c0: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
f9d0: 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
f9e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f9f0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
fa00: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
fa10: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
fa20: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
fa30: 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ile );..  OSTRAC
fa40: 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E(("TRUNCATE %d 
fa50: 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
fa60: 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69  h, nByte));.  Si
fa70: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
fa80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
fa90: 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20  R_TRUNCATE);..  
faa0: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
fab0: 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
fac0: 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
fad0: 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
fae0: 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
faf0: 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
fb00: 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
fb10: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
fb20: 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
fb30: 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
fb40: 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
fb50: 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
fb60: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
fb70: 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
fb80: 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
fb90: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
fba0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
fbb0: 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
fbc0: 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
fbd0: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
fbe0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
fbf0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
fc00: 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
fc10: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
fc20: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
fc30: 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
fc40: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57  . */.  if( seekW
fc50: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  inFile(pFile, nB
fc60: 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
fc70: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fc80: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
fc90: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
fca0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
fcb0: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
fcc0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
fcd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
fce0: 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
fcf0: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
fd00: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
fd10: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
fd20: 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  or();.    rc = w
fd30: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
fd40: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
fd50: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
fd60: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
fd70: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
fd80: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
fd90: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
fda0: 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c  "TRUNCATE %d %ll
fdb0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
fdc0: 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22  h, nByte, rc ? "
fdd0: 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
fde0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fdf0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fe00: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
fe10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
fe20: 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
fe30: 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
fe40: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
fe50: 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
fe60: 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
fe70: 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
fe80: 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
fe90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
fea0: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
feb0: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
fec0: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
fed0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
fee0: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
fef0: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
ff00: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
ff10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
ff20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
ff30: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
ff40: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
ff50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
ff60: 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
ff70: 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
ff80: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
ff90: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
ffa0: 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
ffb0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
ffc0: 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
ffd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
ffe0: 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
fff0: 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
10000 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
10010 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
10020 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
10030 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
10040 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
10050 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
10060 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
10070 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
10080 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
10090 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
100a0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
100b0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
100c0 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
100d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
100e0 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
100f0 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
10100 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
10110 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
10120 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
10130 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
10140 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
10150 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
10160 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
10170 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
10180 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
10190 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
101a0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
101b0 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
101c0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
101d0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
101e0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
101f0 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
10200 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
10210 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
10220 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
10230 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
10240 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
10250 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
10260 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
10270 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
10280 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
10290 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
102a0 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
102b0 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
102c0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
102d0 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
102e0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
102f0 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
10300 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
10310 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
10320 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
10330 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
10340 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
10350 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
10360 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
10370 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
10380 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
10390 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
103a0 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
103b0 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
103c0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
103d0 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
103e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
103f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10400 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
10410 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10420 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10430 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
10440 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10450 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
10460 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
10480 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d  winSync", pFile-
10490 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
104a0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
104b0 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
104c0 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
104d0 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
104e0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
104f0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
10500 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
10510 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
10520 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10530 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
10540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10550 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
10560 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
10570 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
10580 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
10590 53 54 41 54 29 3b 0a 23 69 66 20 53 51 4c 49 54  STAT);.#if SQLIT
105a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
105b0 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
105c0 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
105d0 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
105e0 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
105f0 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
10600 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
10640 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
10650 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
10660 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
10670 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
10680 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10690 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
106a0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
106b0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
106c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
106d0 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
106e0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10700 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
10710 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
10720 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
10730 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
10740 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
10750 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
10760 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
10770 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
10780 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
10790 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
107a0 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
107b0 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
107c0 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
107d0 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
107e0 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
107f0 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
10800 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
10810 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
10820 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10830 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
10840 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10850 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
10860 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
10870 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
10880 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
10890 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
108a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
108b0 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
108c0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
108d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
108e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
108f0 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46  /*.** LOCKFILE_F
10900 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
10910 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20  is undefined on 
10920 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73  some Windows sys
10930 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
10940 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
10950 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66  MMEDIATELY.# def
10960 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  ine LOCKFILE_FAI
10970 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a  L_IMMEDIATELY 1.
10980 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
10990 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
109a0 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  VE_LOCK.# define
109b0 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
109c0 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69  IVE_LOCK 2.#endi
109d0 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69  f../*.** Histori
109e0 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61  cally, SQLite ha
109f0 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20  s used both the 
10a00 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63  LockFile and Loc
10a10 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
10a20 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c  s..** When the L
10a30 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e  ockFile function
10a40 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61   was used, it wa
10a50 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  s always expecte
10a60 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d  d to fail.** imm
10a70 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
10a80 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
10a90 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73  e obtained.  Als
10aa0 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70  o, it always exp
10ab0 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61  ected to.** obta
10ac0 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  in an exclusive 
10ad0 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61  lock.  These fla
10ae0 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  gs are used with
10af0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
10b00 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  function.** and 
10b10 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78  reflect those ex
10b20 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72  pectations; ther
10b30 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75  efore, they shou
10b40 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ld not be change
10b50 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
10b60 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
10b70 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  AGS.# define SQL
10b80 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
10b90 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46  GS   (LOCKFILE_F
10ba0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
10bb0 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45        LOCKFILE_E
10be0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23  XCLUSIVE_LOCK).#
10bf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72  endif../*.** Cur
10c00 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e  rently, SQLite n
10c10 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c  ever calls the L
10c20 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
10c30 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69  on without wanti
10c40 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  ng the.** call t
10c50 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65  o fail immediate
10c60 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
10c70 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
10c80 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
10c90 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
10ca0 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
10cb0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
10cc0 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45  _FLAGS (LOCKFILE
10cd0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
10ce0 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Y).#endif../*.**
10cf0 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65   Acquire a reade
10d00 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65  r lock..** Diffe
10d10 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65  rent API routine
10d20 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70  s are called dep
10d30 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
10d40 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a  r or not this.**
10d50 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e   is Win9x or Win
10d60 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NT..*/.static in
10d70 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  t getReadLock(wi
10d80 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
10d90 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20   int res;.  if( 
10da0 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
10db0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
10dc0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
10dd0 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
10de0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
10df0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
10e00 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
10e10 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
10e20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
10e30 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
10e40 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
10e50 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
10e60 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
10e70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
10e80 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
10e90 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
10ea0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
10eb0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
10ec0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
10ed0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
10ee0 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
10ef0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
10f00 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
10f10 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
10f20 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
10f30 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
10f40 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
10f50 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10f60 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
10f70 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
10f80 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
10f90 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
10fa0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
10fb0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
10fc0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
10fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10fe0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
10ff0 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
11000 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
11010 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
11020 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
11030 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
11040 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11050 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
11060 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
11070 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
11080 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ck */.  }.  retu
11090 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
110a0 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
110b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
110c0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
110d0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
110e0 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52   int res;.  DWOR
110f0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69  D lastErrno;.  i
11100 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
11110 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
11120 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
11130 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
11140 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
11150 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
11160 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
11170 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
11180 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
11190 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
111a0 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
111b0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
111c0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
111d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
111e0 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
111f0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11200 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
11210 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
11220 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11230 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
11240 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
11250 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11260 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
11270 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11280 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f     "unlockReadLo
11290 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
112a0 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
112b0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   res;.}../*.** L
112c0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
112d0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
112e0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
112f0 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
11300 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
11310 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
11320 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
11330 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
11340 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
11350 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
11360 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
11370 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
11380 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
11390 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
113a0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
113b0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
113c0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
113d0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
113e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
113f0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
11400 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
11410 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
11420 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
11430 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
11440 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
11450 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
11460 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
11470 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
11480 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
11490 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
114a0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
114b0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
114c0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
114d0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
114e0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
114f0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
11500 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
11510 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11520 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
11530 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
11540 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
11550 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
11560 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
11570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
11580 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
11590 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
115a0 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
115b0 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
115c0 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
115d0 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
115e0 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
115f0 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
11600 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
11610 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
11620 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
11630 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
11640 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
11650 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
11660 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
11670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11680 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11690 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
116a0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
116b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
116c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
116d0 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
116e0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
116f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11700 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77  sult of a Window
11710 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  s lock call */. 
11720 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
11730 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
11740 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
11750 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
11760 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
11770 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
11780 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
11790 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
117a0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
117b0 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e  is time */.  win
117c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
117d0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57  inFile*)id;.  DW
117e0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
117f0 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
11800 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
11810 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  OSTRACE(("LOCK %
11820 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
11830 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
11840 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
11850 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
11860 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
11870 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20  dLockByte));..  
11880 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
11890 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
118a0 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
118b0 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
118c0 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
118d0 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
118e0 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
118f0 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
11900 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
11910 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
11920 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
11930 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
11940 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
11950 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
11960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11970 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
11980 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
11990 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
119a0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
119b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
119c0 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
119d0 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
119e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
119f0 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
11a00 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
11a10 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
11a20 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
11a30 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
11a40 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
11a50 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
11a60 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
11a70 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
11a80 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
11a90 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
11aa0 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
11ab0 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
11ac0 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
11ad0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
11ae0 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
11af0 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
11b00 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
11b10 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
11b20 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
11b30 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
11b40 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79    (pFile->lockty
11b50 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20  pe==NO_LOCK).   
11b60 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79    || (   (lockty
11b70 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
11b80 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  CK).         && 
11b90 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
11ba0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
11bb0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
11bc0 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
11bd0 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
11be0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
11bf0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
11c00 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
11c10 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44              PEND
11c40 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
11c50 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
11c60 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74  /* Try 3 times t
11c70 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e  o get the pendin
11c80 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73  g lock.  This is
11c90 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a   needed to work.
11ca0 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20        ** around 
11cb0 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
11cc0 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f  by indexing and/
11cd0 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f  or anti-virus so
11ce0 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20  ftware on.      
11cf0 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  ** Windows syste
11d00 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ms..      ** If 
11d10 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68  you are using th
11d20 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64  is code as a mod
11d30 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69  el for alternati
11d40 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74  ve VFSes, do not
11d50 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74  .      ** copy t
11d60 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e  his retry logic.
11d70 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69    It is a hack i
11d80 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64  ntended for Wind
11d90 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ows only..      
11da0 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
11db0 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74  (("could not get
11dc0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
11dd0 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29   cnt=%d\n", cnt)
11de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
11df0 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
11e00 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
11e10 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
11e20 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
11e30 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
11e40 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
11e50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
11e60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
11e70 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
11e80 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
11e90 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
11ea0 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
11eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
11ec0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
11ed0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
11ee0 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
11ef0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
11f00 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
11f10 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
11f20 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
11f30 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
11f40 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
11f50 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
11f60 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
11f70 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
11f80 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
11f90 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
11fa0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
11fb0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
11fc0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
11fd0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
11fe0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
11ff0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
12000 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
12010 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
12020 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
12030 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
12040 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
12050 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
12060 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
12070 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
12080 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
12090 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
120a0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
120b0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
120c0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
120d0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
120e0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
120f0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
12100 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
12110 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
12120 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
12130 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
12140 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
12150 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
12160 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
12170 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
12180 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
12190 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c  );.    res = unl
121a0 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
121b0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
121c0 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25  ("unreadlock = %
121d0 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20  d\n", res));.   
121e0 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
121f0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
12200 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
12210 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
12220 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
12230 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
12240 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
12250 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
12260 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
12270 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
12280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12290 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
122a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
122b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65       OSTRACE(("e
122c0 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e  rror-code = %d\n
122d0 22 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a  ", lastErrno));.
122e0 20 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63        getReadLoc
122f0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  k(pFile);.    }.
12300 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
12310 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45  are holding a PE
12320 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20  NDING lock that 
12330 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65  ought to be rele
12340 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ased, then.  ** 
12350 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  release it now..
12360 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65    */.  if( gotPe
12370 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63  ndingLock && loc
12380 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
12390 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
123a0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
123b0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
123c0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
123d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
123e0 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
123f0 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
12400 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
12410 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
12420 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
12430 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
12440 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
12450 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12460 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
12470 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
12480 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69  K FAILED %d tryi
12490 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f  ng for %d but go
124a0 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t %d\n", pFile->
124b0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
124c0 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
124d0 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65  ype));.    pFile
124e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
124f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
12500 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
12510 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
12520 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f  type = (u8)newLo
12530 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
12540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
12550 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12560 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
12570 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
12580 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
12590 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
125a0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
125b0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
125c0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
125d0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
125e0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
125f0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
12600 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65  int winCheckRese
12610 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
12620 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
12630 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
12640 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  rc;.  winFile *p
12650 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
12660 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
12670 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12690 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
126a0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
126b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
126c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
126d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
126e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f     rc = 1;.    O
126f0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
12700 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63  -LOCK %d %d (loc
12710 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  al)\n", pFile->h
12720 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  , rc));.  }else{
12730 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
12740 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
12750 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
12760 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
12770 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
12780 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12790 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69       winUnlockFi
127a0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
127b0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
127c0 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
127d0 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f   rc = !rc;.    O
127e0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
127f0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d  -LOCK %d %d (rem
12800 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ote)\n", pFile->
12810 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a  h, rc));.  }.  *
12820 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
12830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
12850 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12860 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
12870 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b  iptor id to lock
12880 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
12890 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
128a0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
128b0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
128c0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
128d0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
128e0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
128f0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
12900 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
12910 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
12920 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
12930 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
12940 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
12950 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
12960 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66  utine to fail if
12970 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12980 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f  ment.** is NO_LO
12990 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  CK.  If the seco
129a0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
129b0 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20  HARED_LOCK then 
129c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
129d0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
129e0 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74  ITE_IOERR;.*/.st
129f0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
12a00 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12a10 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
12a20 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a  e){.  int type;.
12a30 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12a40 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
12a50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12a60 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
12a70 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
12a80 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
12a90 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12aa0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
12ab0 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20  CK %d to %d was 
12ac0 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  %d(%d)\n", pFile
12ad0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
12ae0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12af0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
12b00 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
12b10 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c  );.  type = pFil
12b20 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
12b30 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
12b40 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  VE_LOCK ){.    w
12b50 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
12b60 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
12b70 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
12b80 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
12b90 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
12ba0 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
12bb0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
12bc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
12bd0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
12be0 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
12bf0 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
12c00 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
12c10 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
12c20 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
12c30 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12c40 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12c50 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
12c60 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
12c70 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
12c80 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12c90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
12ca0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
12cb0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
12cc0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
12cd0 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
12ce0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
12cf0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
12d00 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
12d10 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
12d20 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f      unlockReadLo
12d30 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
12d40 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
12d50 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  NG_LOCK ){.    w
12d60 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
12d70 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
12d80 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
12d90 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
12da0 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
12db0 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
12dc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
12dd0 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61  pArg is inititia
12de0 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
12df0 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
12e00 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
12e10 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
12e20 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
12e30 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
12e40 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
12e50 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
12e60 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
12e70 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
12e80 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
12e90 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
12ea0 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
12eb0 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65  tic void winMode
12ec0 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  Bit(winFile *pFi
12ed0 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
12ee0 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
12ef0 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
12f00 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
12f10 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
12f20 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
12f30 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
12f40 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
12f50 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
12f60 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
12f70 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
12f80 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
12f90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
12fa0 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
12fb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
12fc0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
12fd0 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
12fe0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
12ff0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
13000 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
13010 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13020 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  inFile*)id;.  sw
13030 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
13040 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
13050 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
13060 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
13070 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
13080 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
13090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
130a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
130b0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
130c0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
130d0 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
130e0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
130f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13100 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
13110 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
13120 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
13130 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
13140 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
13150 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
13160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
13170 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13180 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
13190 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   {.      if( pFi
131a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
131b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
131c0 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20  _int64 oldSz;.  
131d0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
131e0 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26  inFileSize(id, &
131f0 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  oldSz);.        
13200 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13210 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
13220 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77  qlite3_int64 new
13230 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69  Sz = *(sqlite3_i
13240 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  nt64*)pArg;.    
13250 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e        if( newSz>
13260 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20  oldSz ){.       
13270 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
13280 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
13290 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
132a0 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20  winTruncate(id, 
132b0 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  newSz);.        
132c0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
132d0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
132e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
132f0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
13300 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
13310 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13320 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
13330 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
13340 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
13350 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
13360 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
13370 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
13380 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
13390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
133a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
133b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
133c0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
133d0 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
133e0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
133f0 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
13400 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
13410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13430 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
13440 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
13450 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
13460 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13470 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72  win32");.      r
13480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13490 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
134a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
134b0 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
134c0 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
134d0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
134e0 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
134f0 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
13500 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
13510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13520 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49     a[0] = win32I
13530 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
13540 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
13550 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
13560 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
13570 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
13580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13590 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[1] = win32Ioe
135a0 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
135b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
135c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
135d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
135e0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
135f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13600 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
13610 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
13620 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
13630 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
13640 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
13650 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
13660 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
13670 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
13680 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
13690 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
136a0 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
136b0 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
136c0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
136d0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
136e0 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
136f0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
13700 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
13710 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
13720 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
13730 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
13740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
13750 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
13760 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
13770 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
13780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13790 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71  winSectorSize(sq
137a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
137b0 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72  .  (void)id;.  r
137c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
137d0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
137e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
137f0 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65  n a vector of de
13800 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
13810 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tics..*/.static 
13820 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61  int winDeviceCha
13830 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
13840 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
13850 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28    winFile *p = (
13860 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72  winFile*)id;.  r
13870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
13880 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
13890 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20  HEN_OPEN |.     
138a0 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61      ((p->ctrlFla
138b0 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f  gs & WINFILE_PSO
138c0 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  W)?SQLITE_IOCAP_
138d0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
138e0 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE:0);.}..#ifnd
138f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
13900 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f  AL../* .** Windo
13910 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
13920 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
13930 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
13940 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
13950 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
13960 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
13970 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
13980 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
13990 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
139a0 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
139b0 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
139c0 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20  .*/.SYSTEM_INFO 
139d0 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a  winSysInfo;../*.
139e0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
139f0 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
13a00 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
13a10 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
13a20 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
13a30 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
13a40 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
13a50 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
13a60 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66  ed by .** this f
13a70 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
13a80 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  h may be shared 
13a90 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
13aa0 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
13ab0 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  ion winShmMutexH
13ac0 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
13ad0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
13ae0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
13af0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
13b00 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
13b10 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
13b20 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
13b30 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
13b40 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
13b50 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
13b60 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
13b70 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
13b80 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
13b90 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
13ba0 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
13bb0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
13bc0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
13bd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13be0 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
13bf0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13c00 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
13c10 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
13c20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
13c30 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
13c40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
13c50 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13c60 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13c70 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
13c80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
13c90 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
13ca0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
13cb0 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
13cc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13cd0 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
13ce0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
13cf0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
13d00 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
13d10 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
13d20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
13d30 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
13d40 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
13d50 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
13d60 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
13d70 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
13d80 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
13d90 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
13da0 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
13db0 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
13dc0 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
13dd0 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
13de0 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
13df0 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
13e00 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
13e10 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
13e20 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
13e30 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
13e40 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
13e50 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
13e60 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
13e70 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
13e80 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
13e90 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
13ea0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
13eb0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
13ec0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
13ed0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
13ee0 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
13ef0 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
13f00 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
13f10 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
13f20 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
13f30 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
13f40 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
13f50 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
13f60 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
13f70 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
13f80 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
13f90 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
13fa0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
13fb0 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
13fc0 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
13fd0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
13fe0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
13ff0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
14000 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
14010 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
14020 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
14030 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
14040 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
14050 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
14060 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
14070 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14080 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
14090 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
140a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
140b0 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
140c0 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
140d0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
140e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
140f0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
14100 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
14110 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
14120 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
14130 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
14140 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
14150 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
14160 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
14170 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
14180 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
14190 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
141a0 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
141b0 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
141c0 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
141d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
141e0 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
141f0 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
14200 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
14210 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
14220 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14230 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
14240 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
14250 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
14260 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
14270 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
14280 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
14290 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
142a0 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
142b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
142c0 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
142d0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
142e0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
142f0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
14300 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
14310 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
14320 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
14330 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
14340 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
14350 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
14360 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
14370 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
14380 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
14390 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
143a0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
143b0 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
143c0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
143d0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
143e0 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
143f0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
14400 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
14410 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
14420 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
14430 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
14440 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
14450 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
14460 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
14470 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
14480 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
14490 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
144a0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
144b0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
144c0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
144d0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
144e0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
144f0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
14500 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
14510 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
14520 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
14530 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
14540 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
14550 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
14560 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
14570 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
14580 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
14590 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
145a0 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
145b0 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
145c0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
145d0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
145e0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
145f0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
14600 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14620 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
14630 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
14640 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
14650 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
14660 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
14670 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
14680 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
14690 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
146a0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
146b0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
146c0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
146d0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
146e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
146f0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
14700 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
14710 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
14720 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
14730 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
14740 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
14750 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
14760 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
14770 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
14780 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
14790 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
147a0 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
147b0 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
147c0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
147d0 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
147e0 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
147f0 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
14800 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
14810 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
14820 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
14830 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
14840 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
14850 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
14860 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
14870 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
14880 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
14890 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
148a0 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
148b0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
148c0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
148d0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
148e0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
148f0 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
14900 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
14910 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
14920 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
14930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
14940 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
14950 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
14960 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
14970 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
14980 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14990 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
149a0 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
149b0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
149c0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
149d0 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
149e0 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
149f0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
14a00 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
14a10 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
14a20 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
14a30 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
14a40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14a50 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
14a60 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
14a70 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  =0 );..  /* Rele
14a80 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
14a90 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
14aa0 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
14ab0 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
14ac0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
14ad0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
14ae0 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
14af0 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
14b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
14b10 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
14b20 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
14b30 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
14b40 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
14b50 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
14b60 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
14b70 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
14b80 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
14b90 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
14ba0 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  E_LOCK;.    rc =
14bb0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
14bc0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
14bd0 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20  Flags, ofst, 0, 
14be0 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  nByte, 0);.  }. 
14bf0 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29   .  if( rc!= 0 )
14c00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14c10 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
14c20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14c30 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
14c40 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
14c50 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
14c60 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
14c70 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25  SHM-LOCK %d %s %
14c80 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20  s 0x%08lx\n", . 
14c90 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14ca0 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
14cb0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
14cc0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
14cd0 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  led",.          
14ce0 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f   lockType==_SHM_
14cf0 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46  UNLCK ? "UnlockF
14d00 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69  ileEx" : "LockFi
14d10 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20  leEx",.         
14d20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14d30 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  no));..  return 
14d40 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
14d50 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
14d60 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73  VFS methods */.s
14d70 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
14d80 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63  n(sqlite3_vfs*,c
14d90 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
14da0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
14db0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
14dc0 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  inDelete(sqlite3
14dd0 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61  _vfs *,const cha
14de0 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r*,int);../*.** 
14df0 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d  Purge the winShm
14e00 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
14e10 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
14e20 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  h winShmNode.nRe
14e30 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
14e40 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
14e50 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
14e60 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
14e70 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
14e80 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
14e90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
14ea0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
14eb0 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28  oid winShmPurge(
14ec0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
14ed0 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  s, int deleteFla
14ee0 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  g){.  winShmNode
14ef0 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e   **pp;.  winShmN
14f00 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62  ode *p;.  BOOL b
14f10 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69  Rc;.  assert( wi
14f20 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
14f30 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68  );.  pp = &winSh
14f40 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  mNodeList;.  whi
14f50 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30  le( (p = *pp)!=0
14f60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
14f70 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
14f80 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
14f90 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69   p->mutex ) sqli
14fa0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
14fb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
14fc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
14fd0 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
14fe0 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d       bRc = osUnm
14ff0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e  apViewOfFile(p->
15000 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29  aRegion[i].pMap)
15010 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
15020 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69  E(("SHM-PURGE pi
15030 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f  d-%d unmap regio
15040 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  n=%d %s\n",.    
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
15060 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
15070 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20  ocessId(), i,.  
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
15090 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
150a0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
150b0 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e  bRc = osCloseHan
150c0 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  dle(p->aRegion[i
150d0 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].hMap);.       
150e0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
150f0 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73  URGE pid-%d clos
15100 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e  e region=%d %s\n
15110 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15120 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
15130 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
15140 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
15150 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22        bRc ? "ok"
15160 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
15170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15180 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49   p->hFile.h != I
15190 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
151a0 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
151b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
151c0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
151d0 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
151e0 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
151f0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
15200 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15210 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
15220 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
15230 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
15240 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
15250 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
15260 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15270 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15280 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28        winDelete(
15290 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
152a0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
152b0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
152c0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
152d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
152e0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
152f0 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
15300 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
15310 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
15320 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
15330 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
15340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15350 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
15360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15370 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
15380 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
15390 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
153a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
153b0 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
153c0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
153d0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
153e0 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
153f0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
15400 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
15410 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
15420 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
15430 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
15440 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
15450 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
15460 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
15470 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
15480 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
15490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
154a0 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
154b0 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
154c0 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
154d0 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
154e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
154f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
15500 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
15510 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
15520 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
15530 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
15540 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
15550 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
15580 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
15590 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
155a0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
155b0 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
155c0 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
155d0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15600 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
15610 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
15620 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
15630 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
15640 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
15650 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
15660 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
15670 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
15680 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
15690 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
156a0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
156b0 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
156c0 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
156d0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
156e0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
156f0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
15700 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
15710 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
15720 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
15730 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61  zeof(*p));.  nNa
15740 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
15750 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
15760 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
15770 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
15780 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
15790 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20   nName + 17 );. 
157a0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
157b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
157c0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
157d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
157e0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
157f0 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
15800 28 2a 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20  (*pNew) + nName 
15810 2b 20 31 37 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a  + 17);.  pNew->z
15820 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
15830 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71  *)&pNew[1];.  sq
15840 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
15850 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a  Name+15, pNew->z
15860 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
15870 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
15880 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65  );.  sqlite3File
15890 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
158a0 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  Path, pNew->zFil
158b0 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c  ename); ..  /* L
158c0 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
158d0 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
158e0 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
158f0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
15900 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
15910 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
15920 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
15930 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
15940 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
15950 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
15960 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
15970 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
15980 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
15990 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
159a0 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
159b0 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
159c0 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
159d0 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
159e0 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
159f0 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
15a00 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
15a10 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
15a20 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
15a30 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
15a40 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
15a50 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
15a60 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
15a70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
15a80 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
15a90 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
15aa0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
15ab0 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
15ac0 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
15ad0 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
15ae0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
15af0 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
15b00 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
15b10 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
15b20 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
15b30 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
15b40 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
15b50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
15b60 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15b70 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
15b80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
15b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
15ba0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
15bb0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
15bc0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
15bd0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69    }..    rc = wi
15be0 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
15bf0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
15c00 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
15c10 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
15c20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15c30 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
15c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
15c50 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
15c60 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
15c70 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
15c80 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
15ca0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
15cb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15cc0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
15cd0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20  OPEN_CREATE, /* 
15ce0 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  Mode flags */.  
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
15d00 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
15d10 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
15d20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
15d30 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
15d40 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
15d50 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
15d60 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
15d70 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
15d80 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
15d90 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
15da0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
15db0 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  th. .    */.    
15dc0 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  if( winShmSystem
15dd0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
15de0 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_WRLCK, WIN_S
15df0 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
15e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15e10 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
15e20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
15e30 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
15e40 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15e60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
15e70 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15e80 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
15e90 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
15ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15eb0 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
15ec0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
15ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15ee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
15f00 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
15f10 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
15f20 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
15f30 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
15f40 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
15f50 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
15f60 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
15f70 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
15f80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
15f90 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
15fa0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
15fb0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
15fc0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
15fd0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
15fe0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
15ff0 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
16000 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
16010 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
16020 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
16030 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
16040 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
16050 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
16060 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
16070 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
16080 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
16090 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
160a0 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
160b0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
160c0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
160d0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
160e0 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
160f0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
16100 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
16110 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
16120 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
16130 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
16140 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
16150 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
16160 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
16170 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
16180 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
16190 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
161a0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
161b0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
161c0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
161d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
161e0 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
161f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
16200 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
16210 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
16220 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
16230 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
16240 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
16250 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
16260 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
16270 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
16280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
16290 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
162a0 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
162b0 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
162c0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
162d0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
162e0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
162f0 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
16300 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
16310 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
16320 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
16330 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
16340 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
16350 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
16360 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
16370 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
16380 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
16390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
163a0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
163b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
163c0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
163d0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
163e0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
163f0 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
16400 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
16410 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
16420 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
16430 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
16440 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
16450 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
16460 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
16470 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
16480 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
16490 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
164a0 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
164b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
164c0 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
164d0 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
164e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
164f0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
16500 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
16510 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
16520 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
16530 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
16540 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
16550 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
16560 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16570 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
16580 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
16590 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
165a0 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
165b0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
165c0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
165d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
165e0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
165f0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
16600 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
16610 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
16620 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
16630 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
16640 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
16650 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16660 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
16670 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
16680 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
16690 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
166a0 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
166b0 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
166c0 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
166d0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
166e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
166f0 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
16700 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
16710 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16720 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
16730 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
16740 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
16750 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
16760 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
16770 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
16780 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
16790 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
167a0 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
167b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
167c0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
167d0 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
167e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
167f0 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
16800 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
16810 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
16820 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
16830 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
16840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16850 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16860 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
16870 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
16880 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
16890 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
168a0 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
168b0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
168c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
168d0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
168e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
168f0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16910 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
16920 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
16930 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
16960 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
16970 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
16980 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
16990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
169a0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
169b0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
169c0 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
169d0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
169e0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
169f0 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
16a00 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
16a10 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
16a20 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
16a30 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
16a40 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
16a50 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
16a60 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
16a90 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
16aa0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
16ab0 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
16ac0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
16ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
16b00 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
16b30 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
16b40 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
16b50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
16b60 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
16b70 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
16b80 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
16b90 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
16ba0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
16bb0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
16bc0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
16bd0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
16be0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
16bf0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
16c00 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
16c10 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
16c20 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
16c30 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
16c40 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
16c50 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
16c60 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
16c70 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
16c80 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
16c90 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
16ca0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
16cb0 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
16cc0 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
16cd0 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
16ce0 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
16cf0 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
16d00 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
16d10 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
16d20 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
16d30 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
16d40 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
16d50 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
16d60 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
16d70 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
16d80 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
16d90 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
16da0 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
16db0 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
16dc0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
16dd0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
16de0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
16df0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
16e00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16e10 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
16e20 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
16e30 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
16e40 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
16e50 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
16e60 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
16e70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
16e80 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
16e90 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
16ea0 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
16eb0 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
16ec0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
16ed0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
16ee0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
16ef0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
16f00 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
16f10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16f20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
16f30 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
16f40 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
16f50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
16f70 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
16f80 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
16f90 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
16fa0 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
16fb0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
16fc0 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
16fd0 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
16fe0 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
16ff0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
17000 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
17010 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
17020 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
17030 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
17040 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
17050 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
17060 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
17070 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
17080 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
17090 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
170a0 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
170b0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
170c0 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
170d0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
170e0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
170f0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
17100 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
17110 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
17120 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
17130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17140 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
17150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17160 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
17170 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
17180 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
17190 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
171a0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
171b0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
171c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
171d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
171e0 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
171f0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
17200 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
17210 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
17220 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
17230 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
17240 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
17250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
17260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17270 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17280 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
17290 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
172a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
172b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
172c0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
172d0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
172e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
172f0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
17300 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
17310 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
17320 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
17330 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
17340 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
17350 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
17360 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
17370 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
17380 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
17390 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
173a0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
173b0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
173c0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
173d0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
173e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
173f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
17400 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17410 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
17420 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
17430 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
17440 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
17450 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
17460 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
17470 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
17480 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
17490 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
174a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
174b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
174c0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
174d0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
174e0 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
174f0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
17500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
17510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
17530 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
17540 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
17550 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
17560 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
17570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
17580 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17590 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
175a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
175b0 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
175c0 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
175d0 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20  ,%03x %s\n",.   
175e0 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28          p->id, (
175f0 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
17600 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e  ProcessId(), p->
17610 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
17620 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20  xclMask,.       
17630 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64      rc ? "failed
17640 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65  " : "ok"));.  re
17650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17660 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
17670 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
17680 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
17690 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
176a0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
176b0 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
176c0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
176d0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
176e0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
176f0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
17700 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
17710 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
17720 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72  c void winShmBar
17730 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
17740 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
17750 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
17760 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
17770 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
17780 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17790 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72  (fd);.  /* Memor
177a0 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64  yBarrier(); // d
177b0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20  oes not work -- 
177c0 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20  do not know why 
177d0 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  not */.  winShmE
177e0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77  nterMutex();.  w
177f0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
17800 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
17810 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
17820 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
17830 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
17840 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
17850 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f   .** shared-memo
17860 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
17870 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
17880 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
17890 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a  memory regions .
178a0 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
178b0 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
178c0 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
178d0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
178e0 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79   szRegion .** by
178f0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
17900 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
17910 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
17920 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
17930 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
17940 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
17950 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
17960 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74   isWrite paramet
17970 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
17980 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
17990 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
179a0 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
179b0 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
179c0 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
179d0 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
179e0 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
179f0 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
17a00 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
17a10 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
17a20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a  returned. If .**
17a30 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
17a40 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
17a50 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
17a60 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
17a70 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e  not yet .** been
17a80 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
17a90 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
17aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
17ab0 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
17ac0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
17ad0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17ae0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
17af0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
17b00 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
17b10 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
17b20 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
17b30 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
17b40 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73  sses .** address
17b50 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
17b60 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
17b70 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
17b80 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
17b90 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
17ba0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
17bb0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
17bc0 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73  t winShmMap(.  s
17bd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17bf0 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
17c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
17c10 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c30 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
17c40 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
17c50 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c70 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
17c80 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69  s */.  int isWri
17c90 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17ca0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
17cb0 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
17cc0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
17cd0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
17ce0 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
17cf0 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
17d00 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69  emory */.){.  wi
17d10 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
17d20 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77  winFile*)fd;.  w
17d30 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
17d40 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d  ->pShm;.  winShm
17d50 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
17d60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17d70 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20  E_OK;..  if( !p 
17d80 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  ){.    rc = winO
17d90 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
17da0 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
17db0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17dc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
17dd0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
17de0 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d    }.  pShmNode =
17df0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
17e00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17e10 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
17e20 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
17e30 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
17e40 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
17e50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
17e60 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  on==0 );..  if( 
17e70 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
17e80 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
17e90 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
17ea0 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  on *apNew;      
17eb0 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67       /* New aReg
17ec0 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
17ed0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
17ee0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
17ef0 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
17f00 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
17f10 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ize */.    sqlit
17f20 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20  e3_int64 sz;    
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f40 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
17f50 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
17f60 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
17f70 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
17f80 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54  egion;..    /* T
17f90 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
17fa0 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
17fb0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
17fc0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
17fd0 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63  ace..    ** Chec
17fe0 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
17ff0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
18000 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
18010 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
18020 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e  .    ** large en
18030 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
18040 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
18050 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gion)..    */.  
18060 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69    rc = winFileSi
18070 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ze((sqlite3_file
18080 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
18090 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69  ile, &sz);.    i
180a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
180b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
180c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
180d0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
180e0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
180f0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
18100 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20    "winShmMap1", 
18110 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
18120 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
18130 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
18140 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29    if( sz<nByte )
18150 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
18160 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
18170 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
18180 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74  exist. If isWrit
18190 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  e is set to.    
181a0 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20    ** zero, exit 
181b0 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
181c0 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
181d0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
181e0 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  urned..      **.
181f0 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61        ** Alterna
18200 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69  tively, if isWri
18210 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  te is non-zero, 
18220 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20  use ftruncate() 
18230 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
18240 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
18250 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
18260 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18270 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20   if( !isWrite ) 
18280 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
18290 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
182a0 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
182b0 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
182c0 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65  de->hFile, nByte
182d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
182e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
182f0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
18300 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
18310 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
18320 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18340 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44  "winShmMap2", pD
18350 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
18360 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
18370 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
18380 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
18390 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
183a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
183b0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
183c0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
183d0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
183e0 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
183f0 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
18400 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
18410 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
18420 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
18430 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
18440 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
18450 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
18460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
18470 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
18480 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
18490 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
184a0 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  aRegion = apNew;
184b0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ..    while( pSh
184c0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
184d0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  iRegion ){.     
184e0 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18500 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e  file-mapping han
18510 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  dle */.      voi
18520 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20  d *pMap = 0;    
18530 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
18540 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
18550 20 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51   */.     .#if SQ
18560 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
18570 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
18580 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
18590 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  omApp(pShmNode->
185a0 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
185b0 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
185c0 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20  ADWRITE, nByte, 
185d0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
185e0 6c 73 65 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  lse.      hMap =
185f0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
18600 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingW(pShmNode->
18610 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
18620 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
18630 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
18640 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
18650 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
18660 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
18670 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20 72   pid-%d create r
18680 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25  egion=%d nbyte=%
18690 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
186a0 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
186b0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
186c0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
186d0 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
186f0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
18700 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
18710 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
18720 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
18730 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
18740 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
18750 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
18760 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
18770 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
18780 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
18790 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
187a0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
187b0 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
187c0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
187d0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
187e0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
187f0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
18800 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66    iOffset - iOff
18810 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
18820 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
18830 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  t.        );.#el
18840 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
18850 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
18860 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
18870 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
18880 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
18890 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
188a0 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
188b0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
188c0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
188d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
188e0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
188f0 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65  AP pid-%d map re
18900 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25  gion=%d offset=%
18910 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c  d size=%d %s\n",
18920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18930 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
18940 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
18950 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
18960 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20  n, iOffset,.    
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52               szR
18980 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f  egion, pMap ? "o
18990 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
189a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
189b0 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20  f( !pMap ){.    
189c0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61      pShmNode->la
189d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
189e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
189f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
18a00 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
18a10 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f  R_SHMMAP, pShmNo
18a20 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  de->lastErrno,. 
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44  "winShmMap3", pD
18a50 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
18a60 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20       if( hMap ) 
18a70 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d  osCloseHandle(hM
18a80 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ap);.        got
18a90 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
18aa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53       }..      pS
18ab0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
18ac0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
18ad0 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a  n].pMap = pMap;.
18ae0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
18af0 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
18b00 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20  ->nRegion].hMap 
18b10 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = hMap;.      pS
18b20 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
18b30 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
18b40 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
18b50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
18b60 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
18b70 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
18b80 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  iRegion*szRegion
18b90 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  ;.    int iOffse
18ba0 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
18bb0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
18bc0 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
18bd0 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20  arity;.    char 
18be0 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68  *p = (char *)pSh
18bf0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69  mNode->aRegion[i
18c00 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20  Region].pMap;.  
18c10 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29    *pp = (void *)
18c20 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d  &p[iOffsetShift]
18c30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
18c40 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  pp = 0;.  }.  sq
18c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18c60 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
18c70 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
18c80 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  .}..#else.# defi
18c90 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20  ne winShmMap    
18ca0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
18cb0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
18cc0 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69  fine winShmBarri
18cd0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69  er 0.# define wi
18ce0 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  nShmUnmap   0.#e
18cf0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
18d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
18d10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  */../*.** Here e
18d20 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
18d30 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
18d40 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
18d50 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
18d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
18d70 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
18d80 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
18d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18da0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18df0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
18e00 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
18e10 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
18e20 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
18e30 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69  te on an.** sqli
18e40 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e  te3_file for win
18e50 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  32..*/.static co
18e60 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
18e70 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68  ethods winIoMeth
18e80 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20  od = {.  2,     
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
18eb0 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f  sion */.  winClo
18ec0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
18ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
18ee0 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64  ose */.  winRead
18ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18f00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
18f10 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c  d */.  winWrite,
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
18f40 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74   */.  winTruncat
18f50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18f60 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
18f70 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c  te */.  winSync,
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f90 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
18fa0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a   */.  winFileSiz
18fb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18fc0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
18fd0 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c  ze */.  winLock,
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
19000 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c   */.  winUnlock,
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
19030 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65   */.  winCheckRe
19040 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
19050 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
19060 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
19070 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c   winFileControl,
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
190a0 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53   */.  winSectorS
190b0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
190c0 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
190d0 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76  Size */.  winDev
190e0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
190f0 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65  cs,       /* xDe
19100 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
19110 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d  ics */.  winShmM
19120 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
19130 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
19140 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c  Map */.  winShmL
19150 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
19160 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
19170 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  Lock */.  winShm
19180 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
19190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
191a0 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69  mBarrier */.  wi
191b0 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20  nShmUnmap       
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191d0 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b   xShmUnmap */.};
191e0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
19250 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
19260 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19280 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
19290 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
192a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
192b0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
192c0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
192d0 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
192e0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
192f0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
19300 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
19310 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
19320 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
19330 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
19340 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
19350 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
19360 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
19370 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
19380 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
19390 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
193a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
193b0 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74   void *convertUt
193c0 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
193d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
193e0 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  ){.  void *zConv
193f0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
19400 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a   isNT() ){.    z
19410 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38  Converted = utf8
19420 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
19430 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
19440 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
19450 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
19460 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
19470 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
19480 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
19490 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
194a0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
194b0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
194c0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
194d0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
194e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
194f0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
19500 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
19510 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
19520 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
19530 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61  ld at pVfs->mxPa
19540 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72  thname character
19550 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
19560 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
19570 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
19580 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
19590 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
195a0 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
195b0 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
195c0 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
195d0 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
195e0 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
195f0 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a  .  size_t i, j;.
19600 20 20 69 6e 74 20 6e 54 65 6d 70 50 61 74 68 3b    int nTempPath;
19610 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74  .  char zTempPat
19620 68 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a  h[MAX_PATH+2];..
19630 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
19640 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
19650 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
19660 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
19670 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
19680 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
19690 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
196a0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
196b0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
196c0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
196d0 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
196e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
196f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
19700 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65  );..  memset(zTe
19710 6d 70 50 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50  mpPath, 0, MAX_P
19720 41 54 48 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73  ATH+2);..  if( s
19730 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
19740 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
19750 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
19760 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
19770 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69  Path, "%s", sqli
19780 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
19790 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  ry);.  }.#if !SQ
197a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
197b0 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20  else if( isNT() 
197c0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
197d0 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a  lti;.    WCHAR z
197e0 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54  WidePath[MAX_PAT
197f0 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d  H];.    osGetTem
19800 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d  pPathW(MAX_PATH-
19810 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a  30, zWidePath);.
19820 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69      zMulti = uni
19830 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
19840 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
19850 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
19860 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19870 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
19880 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d  mpPath, "%s", zM
19890 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
198a0 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69  ite3_free(zMulti
198b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
198c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
198d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
198e0 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
198f0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
19900 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
19910 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
19920 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74     char zMbcsPat
19930 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  h[MAX_PATH];.   
19940 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28   osGetTempPathA(
19950 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62  MAX_PATH-30, zMb
19960 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74  csPath);.    zUt
19970 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
19980 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
19990 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
199a0 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
199b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
199c0 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
199d0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
199e0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
199f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
19a00 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
19a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a20 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
19a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19a40 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  f.#endif..  /* C
19a50 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75  heck that the ou
19a60 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c  tput buffer is l
19a70 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
19a80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
19a90 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49  le .  ** name. I
19aa0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
19ab0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
19ac0 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50 61  ..  */.  nTempPa
19ad0 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  th = sqlite3Strl
19ae0 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
19af0 0a 0a 20 20 69 66 28 20 28 6e 54 65 6d 70 50 61  ..  if( (nTempPa
19b00 74 68 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  th + sqlite3Strl
19b10 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
19b20 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
19b30 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  18) >= nBuf ){. 
19b40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19b50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
19b60 6f 72 28 69 3d 6e 54 65 6d 70 50 61 74 68 3b 20  or(i=nTempPath; 
19b70 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68  i>0 && zTempPath
19b80 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d  [i-1]=='\\'; i--
19b90 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b  ){}.  zTempPath[
19ba0 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  i] = 0;..  sqlit
19bb0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
19bc0 2d 31 38 2c 20 7a 42 75 66 2c 20 28 6e 54 65 6d  -18, zBuf, (nTem
19bd0 70 50 61 74 68 20 3e 20 30 29 20 3f 0a 20 20 20  pPath > 0) ?.   
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45      "%s\\"SQLITE
19c00 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
19c10 58 20 3a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  X : SQLITE_TEMP_
19c20 46 49 4c 45 5f 50 52 45 46 49 58 2c 0a 20 20 20  FILE_PREFIX,.   
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c40 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20  zTempPath);.  j 
19c50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
19c60 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  0(zBuf);.  sqlit
19c70 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
19c80 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66  , &zBuf[j]);.  f
19c90 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
19ca0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  +, j++){.    zBu
19cb0 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
19cc0 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
19cd0 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
19ce0 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
19cf0 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a   ];.  }.  zBuf[j
19d00 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b  ] = 0;.  zBuf[j+
19d10 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41  1] = 0;..  OSTRA
19d20 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41  CE(("TEMP FILENA
19d30 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  ME: %s\n", zBuf)
19d40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19d50 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
19d60 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19d70 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69  the named file i
19d80 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63  s really a direc
19d90 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61  tory.  Return fa
19da0 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20  lse if.** it is 
19db0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
19dc0 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79  than a directory
19dd0 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
19de0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d   any kind of mem
19df0 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
19e00 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
19e10 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
19e20 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43  r(const void *zC
19e30 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f  onverted){.  DWO
19e40 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
19e50 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
19e60 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28  astErrno;..  if(
19e70 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69   isNT() ){.    i
19e80 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
19e90 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
19ea0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
19eb0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
19ec0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
19ed0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
19ee0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
19ef0 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
19f00 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
19f10 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
19f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
19f40 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
19f50 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
19f80 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e  & retryIoerr(&cn
19f90 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
19fa0 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29  {}.    if( !rc )
19fb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
19fc0 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d  ; /* Invalid nam
19fd0 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  e? */.    }.    
19fe0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
19ff0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
1a000 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  s;.#if SQLITE_OS
1a010 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
1a020 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
1a030 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1a040 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
1a050 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1a060 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72  }.  return (attr
1a070 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
1a080 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61  TTRIBUTES) && (a
1a090 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
1a0a0 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d  TE_DIRECTORY);.}
1a0b0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
1a0c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1a0d0 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
1a0e0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1a0f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
1a100 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
1a110 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
1a120 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1a130 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
1a140 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
1a150 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
1a160 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
1a170 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
1a180 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
1a190 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1a1a0 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
1a1b0 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
1a1c0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
1a1d0 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
1a1e0 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
1a1f0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
1a200 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
1a210 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
1a220 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
1a230 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
1a240 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
1a250 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
1a260 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
1a270 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
1a280 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1a290 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
1a2a0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
1a2b0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
1a2c0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
1a2d0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a2f0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
1a300 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
1a310 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
1a320 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
1a330 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
1a340 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
1a350 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
1a360 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
1a370 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
1a380 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
1a390 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
1a3a0 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
1a3b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1a3c0 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
1a3d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1a3e0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
1a3f0 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
1a400 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20 20  [MAX_PATH+2];   
1a410 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
1a420 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20   to create temp 
1a430 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69  filename */..  i
1a440 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a450 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
1a460 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
1a470 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
1a480 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
1a490 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1a4a0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
1a4b0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
1a4c0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
1a4d0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
1a4e0 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
1a4f0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
1a500 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
1a510 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
1a520 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
1a530 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1a540 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1a550 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
1a560 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
1a570 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
1a580 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65 66 20  REATE);.#ifndef 
1a590 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 52  NDEBUG.  int isR
1a5a0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
1a5b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1a5c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64  _READONLY);.#end
1a5d0 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  if.  int isReadW
1a5e0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
1a5f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a600 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
1a610 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
1a620 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
1a630 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
1a640 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
1a650 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1a660 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
1a670 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1a680 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1a690 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
1a6a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
1a6b0 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
1a6c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
1a6d0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
1a6e0 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
1a6f0 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
1a700 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
1a710 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
1a720 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
1a730 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
1a740 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
1a750 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
1a760 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
1a770 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
1a780 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
1a790 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
1a7a0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
1a7b0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
1a7c0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
1a7d0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
1a7e0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
1a7f0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
1a800 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1a810 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
1a820 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
1a830 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
1a840 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
1a850 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
1a860 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
1a870 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
1a880 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
1a890 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
1a8a0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
1a8b0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
1a8c0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
1a8d0 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
1a8e0 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
1a8f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
1a900 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
1a910 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
1a920 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
1a930 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
1a940 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
1a950 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
1a960 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
1a970 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1a980 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
1a990 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
1a9a0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
1a9b0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1a9c0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
1a9d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
1a9e0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
1a9f0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
1aa00 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1aa10 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
1aa20 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1aa30 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1aa40 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
1aa50 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
1aa60 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
1aa70 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
1aa80 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
1aa90 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
1aaa0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
1aab0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1aac0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
1aad0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1aae0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
1aaf0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1ab00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1ab10 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
1ab20 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1ab30 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
1ab40 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1ab50 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
1ab60 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1ab70 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1ab80 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
1ab90 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1aba0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1abb0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1abc0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
1abd0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
1abe0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
1abf0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
1ac00 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41   pFile->h = INVA
1ac10 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1ac20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1ac30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1ac40 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1ac50 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
1ac60 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  e a .  ** tempor
1ac70 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ary file name to
1ac80 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28   use .  */.  if(
1ac90 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
1aca0 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
1acb0 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75  te && !isOpenJou
1acc0 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  rnal);.    rc = 
1acd0 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
1ace0 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65  PATH+2, zTmpname
1acf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ad00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ad10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ad20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65   }.    zUtf8Name
1ad30 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
1ad40 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ..  /* Database 
1ad50 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f  filenames are do
1ad60 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
1ad70 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65  ated if they are
1ad80 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77   not.  ** URIs w
1ad90 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ith parameters. 
1ada0 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e   Hence, they can
1adb0 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65   always be passe
1adc0 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
1add0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1ade0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
1adf0 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49  rt( (eType!=SQLI
1ae00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
1ae10 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
1ae20 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
1ae30 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61  .        zUtf8Na
1ae40 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38 4e  me[strlen(zUtf8N
1ae50 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
1ae60 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
1ae70 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20  filename to the 
1ae80 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e  system encoding.
1ae90 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   */.  zConverted
1aea0 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
1aeb0 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65  lename(zUtf8Name
1aec0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
1aed0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
1aee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1aef0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
1af00 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
1af10 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
1af20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1af30 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65  nverted);.    re
1af40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1af50 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a  OPEN_ISDIR;.  }.
1af60 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
1af70 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
1af80 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
1af90 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
1afa0 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
1afb0 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
1afc0 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
1afd0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
1afe0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1aff0 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
1b000 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1b010 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a   a new file is .
1b020 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
1b030 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
1b040 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
1b050 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
1b060 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  s" .  ** as it i
1b070 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
1b080 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tood..  */.  if(
1b090 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a   isExclusive ){.
1b0a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
1b0b0 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
1b0c0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1b0d0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
1b0e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
1b0f0 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
1b100 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
1b110 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
1b120 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
1b130 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43  .  }else if( isC
1b140 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  reate ){.    /* 
1b150 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
1b160 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
1b170 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
1b180 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
1b190 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
1b1a0 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
1b1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
1b1c0 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
1b1d0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
1b1e0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
1b1f0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
1b200 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
1b210 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20  ..  dwShareMode 
1b220 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  = FILE_SHARE_REA
1b230 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
1b240 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44  RITE;..  if( isD
1b250 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c  elete ){.#if SQL
1b260 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
1b270 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1b280 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
1b290 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20  RIBUTE_HIDDEN;. 
1b2a0 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23     isTemp = 1;.#
1b2b0 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73  else.    dwFlags
1b2c0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1b2d0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
1b2e0 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20  EMPORARY.       
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41          | FILE_A
1b310 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a  TTRIBUTE_HIDDEN.
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1b340 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
1b350 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64  E_ON_CLOSE;.#end
1b360 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1b370 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1b380 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
1b390 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  IBUTE_NORMAL;.  
1b3a0 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66  }.  /* Reports f
1b3b0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74  rom the internet
1b3c0 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72   are that perfor
1b3d0 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a  mance is always.
1b3e0 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46    ** better if F
1b3f0 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
1b400 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20  ACCESS is used. 
1b410 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a   Ticket #2699. *
1b420 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
1b430 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41  WINCE.  dwFlagsA
1b440 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20  ndAttributes |= 
1b450 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
1b460 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a  _ACCESS;.#endif.
1b470 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1b480 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1b490 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
1b4a0 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
1b4b0 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
1b4c0 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
1b4d0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1b4e0 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
1b4f0 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
1b500 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
1b510 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
1b520 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
1b530 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
1b540 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
1b550 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
1b560 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
1b570 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
1b580 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
1b590 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
1b5a0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1b5b0 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
1b5c0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
1b5d0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
1b5e0 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
1b5f0 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
1b600 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
1b610 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
1b620 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
1b630 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
1b640 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
1b650 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
1b660 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
1b670 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
1b680 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
1b690 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
1b6c0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
1b6f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1b720 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
1b750 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
1b760 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1b770 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e    retryIoerr(&cn
1b7a0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1b7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b7c0 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
1b7d0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c  }.#else.    whil
1b7e0 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
1b7f0 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a  FileW((LPCWSTR)z
1b800 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
1b830 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
1b860 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1b890 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1b8c0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1b8d0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
1b900 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1b910 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1b940 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b960 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
1b970 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
1b980 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1b990 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1b9a0 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
1b9b0 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c  osCreateFileA((L
1b9c0 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  PCSTR)zConverted
1b9d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
1ba00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1ba20 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
1ba30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1ba60 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
1ba90 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
1bac0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
1bad0 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72         retryIoer
1bb00 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1bb10 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
1bb20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
1bb30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1bb40 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74  f.  logIoerr(cnt
1bb50 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
1bb60 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25 6c 78  OPEN %d %s 0x%lx
1bb70 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20   %s\n", .       
1bb80 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77      h, zName, dw
1bb90 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 0a  DesiredAccess, .
1bba0 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d 49 4e             h==IN
1bbb0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1bbc0 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  UE ? "failed" : 
1bbd0 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68  "ok"));..  if( h
1bbe0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1bbf0 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46  _VALUE ){.    pF
1bc00 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1bc10 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
1bc20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1bc30 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69  TE_CANTOPEN, pFi
1bc40 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
1bc50 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
1bc60 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1bc70 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1bc80 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65  d);.    if( isRe
1bc90 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
1bca0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
1bcb0 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28   return winOpen(
1bcc0 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c  pVfs, zName, id,
1bcd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
1bce0 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50  (flags|SQLITE_OP
1bcf0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53  EN_READONLY)&~(S
1bd00 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1bd10 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  E|SQLITE_OPEN_RE
1bd20 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74 46  ADWRITE)), pOutF
1bd30 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
1bd40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1bd50 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1bd60 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
1bd70 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
1bd80 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  ){.    if( isRea
1bd90 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
1bda0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
1bdb0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1bdc0 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
1bdd0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
1bde0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1bdf0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
1be00 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  }..  memset(pFil
1be10 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46  e, 0, sizeof(*pF
1be20 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  ile));.  pFile->
1be30 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f  pMethod = &winIo
1be40 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
1be50 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d  >h = h;.  pFile-
1be60 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f  >lastErrno = NO_
1be70 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e  ERROR;.  pFile->
1be80 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1be90 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  File->pShm = 0;.
1bea0 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
1beb0 20 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71   zName;.  if( sq
1bec0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
1bed0 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
1bee0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
1bef0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
1bf00 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1bf10 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
1bf20 50 53 4f 57 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  PSOW;.  }..#if S
1bf30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1bf40 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1bf50 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
1bf60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
1bf70 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65 43        && !winceC
1bf80 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
1bf90 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20   pFile).  ){.   
1bfa0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1bfb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1bfc0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1bfd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bfe0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1bff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
1c000 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
1c010 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
1c020 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
1c030 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1c040 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1c050 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1c060 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65   }..  OpenCounte
1c070 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
1c080 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
1c090 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
1c0a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
1c0b0 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
1c0c0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
1c0d0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
1c0e0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
1c0f0 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
1c100 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
1c110 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
1c120 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
1c130 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
1c140 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
1c150 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
1c160 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
1c170 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
1c180 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
1c190 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
1c1a0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
1c1b0 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
1c1c0 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
1c1d0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
1c1e0 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
1c1f0 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
1c200 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
1c210 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
1c220 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
1c230 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
1c240 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
1c250 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
1c260 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
1c270 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
1c280 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
1c290 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
1c2a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1c2b0 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
1c2c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1c2d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
1c2e0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
1c2f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1c300 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
1c310 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
1c320 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
1c330 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
1c340 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
1c350 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
1c360 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
1c370 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
1c380 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
1c390 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
1c3a0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1c3b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1c3c0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
1c3d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73  USED_PARAMETER(s
1c3e0 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75  yncDir);..  Simu
1c3f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
1c400 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c410 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76  DELETE);.  zConv
1c420 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1c430 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
1c440 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
1c450 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1c460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c470 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1c480 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
1c490 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53  {.    do {.#if S
1c4a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1c4b0 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f       WIN32_FILE_
1c4c0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
1c4d0 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20  AttrData;.      
1c4e0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
1c4f0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
1c500 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  trData));.      
1c510 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74  if ( osGetFileAt
1c520 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e  tributesExW(zCon
1c530 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45  verted, GetFileE
1c540 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c570 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a   &sAttrData) ){.
1c580 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
1c590 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
1c5a0 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
1c5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c5c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1c5d0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
1c5e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1c5f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  k;.      }.#else
1c600 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
1c610 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1c620 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sW(zConverted);.
1c630 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
1c640 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
1c650 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1c660 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c670 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c  SQLITE_OK; /* Al
1c680 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
1c690 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1c6b0 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
1c6c0 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
1c6d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c6e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
1c6f0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
1c700 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c710 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1c720 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
1c730 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
1c740 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c750 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
1c760 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
1c770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c780 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72 79       if ( !retry
1c790 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1c7a0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
1c7b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1c7c0 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
1c7d0 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
1c7e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c7f0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
1c800 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
1c810 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1c820 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1c830 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
1c840 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1c850 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
1c860 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
1c870 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
1c880 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
1c890 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c8a0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65  LITE_OK; /* Alre
1c8b0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
1c8c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c8d0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
1c8e0 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
1c8f0 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
1c900 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c910 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
1c920 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
1c930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c940 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
1c950 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
1c960 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
1c970 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c980 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
1c990 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
1c9a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c9b0 20 20 20 69 66 20 28 20 21 72 65 74 72 79 49 6f     if ( !retryIo
1c9c0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1c9d0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1c9e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1c9f0 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
1ca00 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
1ca10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ca20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
1ca30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
1ca40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20  f( rc ){.    rc 
1ca50 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1ca60 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1ca70 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  E, lastErrno,.  
1ca80 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44             "winD
1ca90 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
1caa0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1cab0 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
1cac0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1cad0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1cae0 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
1caf0 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c  TE \"%s\" %s\n",
1cb00 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20   zFilename, (rc 
1cb10 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
1cb20 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  " )));.  return 
1cb30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
1cb40 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  ck the existance
1cb50 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
1cb60 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1cb70 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
1cb80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1cb90 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
1cba0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
1cbb0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
1cbc0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1cbd0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1cbe0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
1cbf0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1cc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
1cc10 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
1cc20 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
1cc30 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
1cc40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1cc50 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
1cc60 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
1cc70 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
1cc80 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1cc90 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
1cca0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
1ccb0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1ccc0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
1ccd0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1cce0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1ccf0 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ; );.  zConverte
1cd00 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1cd10 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
1cd20 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1cd30 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1cd40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1cd50 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1cd60 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1cd70 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1cd80 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1cd90 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1cda0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
1cdb0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
1cdc0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
1cdd0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
1cde0 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
1cdf0 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
1ce00 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1ce10 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
1ce40 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
1ce70 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
1ce80 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1ce90 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72  o) ){}.    if( r
1cea0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  c ){.      /* Fo
1ceb0 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45  r an SQLITE_ACCE
1cec0 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c  SS_EXISTS query,
1ced0 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65   treat a zero-le
1cee0 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20  ngth file.      
1cef0 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73  ** as if it does
1cf00 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
1cf10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20    */.      if(  
1cf20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f    flags==SQLITE_
1cf30 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20  ACCESS_EXISTS.  
1cf40 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
1cf50 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69  Data.nFileSizeHi
1cf60 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  gh==0 .         
1cf70 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
1cf80 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
1cf90 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
1cfa0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1cfb0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
1cfc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
1cfd0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
1cfe0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1cff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1d000 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65  se{.      logIoe
1d010 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69  rr(cnt);.      i
1d020 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  f( lastErrno!=ER
1d030 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
1d040 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  ND ){.        wi
1d050 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1d060 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c  _IOERR_ACCESS, l
1d070 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63  astErrno, "winAc
1d080 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  cess", zFilename
1d090 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d0a0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1d0b0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
1d0c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d0d0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d  _ACCESS;.      }
1d0e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
1d0f0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
1d100 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
1d110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d120 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1d130 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1d140 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
1d150 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1d160 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
1d170 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
1d180 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
1d190 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1d1a0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
1d1b0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1d1c0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
1d1d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d1e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
1d1f0 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
1d200 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1d210 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
1d220 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d230 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
1d240 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
1d250 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
1d260 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1d270 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1d280 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
1d290 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
1d2a0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
1d2b0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1d2c0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
1d2d0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
1d2e0 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
1d2f0 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
1d300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d310 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
1d320 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
1d330 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
1d340 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62  th name should b
1d350 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e  e used verbatim.
1d360 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f    If.** non-zero
1d370 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f   is returned fro
1d380 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  m this function,
1d390 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1d3a0 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c  ction must simpl
1d3b0 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f  y.** use the pro
1d3c0 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20  vided path name 
1d3d0 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65  verbatim -OR- re
1d3e0 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20  solve it into a 
1d3f0 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a  full path name.*
1d400 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46  * using the GetF
1d410 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33  ullPathName Win3
1d420 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28  2 API function (
1d430 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
1d440 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
1d450 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
1d460 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame(.  const cha
1d470 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
1d480 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
1d490 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
1d4a0 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64  s with a forward
1d4b0 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b   slash or a back
1d4c0 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74  slash, it is eit
1d4d0 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c  her.  ** a legal
1d4e0 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c   UNC name, a vol
1d4f0 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  ume relative pat
1d500 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  h, or an absolut
1d510 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74  e path name in t
1d520 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66  he.  ** "Unix" f
1d530 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73  ormat on Windows
1d540 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65  .  There is no e
1d550 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65  asy way to diffe
1d560 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
1d570 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
1d580 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65  two cases; there
1d590 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20  fore, we return 
1d5a0 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e  the safer return
1d5b0 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20   value of TRUE. 
1d5c0 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c   ** so that call
1d5d0 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
1d5e0 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79  tion will simply
1d5f0 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
1d600 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 7a 50  ..  */.  if ( zP
1d610 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  athname[0]=='/' 
1d620 7c 7c 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d  || zPathname[0]=
1d630 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 72 65 74  ='\\' ){.    ret
1d640 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
1d650 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
1d660 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
1d670 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61   with a letter a
1d680 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73  nd a colon it is
1d690 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65   either a volume
1d6a0 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70  .  ** relative p
1d6b0 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  ath or an absolu
1d6c0 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72  te path.  Caller
1d6d0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
1d6e0 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a  on must not.  **
1d6f0 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61   attempt to trea
1d700 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69  t it as a relati
1d710 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e  ve path name (i.
1d720 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73  e. they should s
1d730 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69  imply use.  ** i
1d740 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a  t verbatim)..  *
1d750 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  /.  if ( sqlite3
1d760 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d  Isalpha(zPathnam
1d770 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61  e[0]) && zPathna
1d780 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20  me[1]==':' ){.  
1d790 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
1d7a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
1d7b0 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
1d7c0 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
1d7d0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
1d7e0 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
1d7f0 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
1d800 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
1d810 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
1d820 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
1d830 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
1d840 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
1d850 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
1d860 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
1d870 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
1d880 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
1d890 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
1d8a0 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
1d8b0 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
1d8c0 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
1d8d0 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
1d8e0 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
1d8f0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
1d900 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
1d910 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
1d920 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1d930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1d940 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
1d950 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
1d960 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
1d970 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
1d980 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
1d990 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
1d9a0 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
1d9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1d9c0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
1d9d0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1d9e0 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da00 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
1da10 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69  /.){.  .#if defi
1da20 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
1da30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1da40 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1da50 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
1da60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
1da70 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ll);.  assert( p
1da80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3e  Vfs->mxPathname>
1da90 3d 4d 41 58 5f 50 41 54 48 20 29 3b 0a 20 20 61  =MAX_PATH );.  a
1daa0 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
1dab0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1dac0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
1dad0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
1dae0 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
1daf0 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
1db00 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
1db10 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
1db20 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
1db30 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
1db40 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1db50 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
1db60 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
1db70 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
1db80 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
1db90 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
1dba0 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
1dbb0 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
1dbc0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
1dbd0 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
1dbe0 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
1dbf0 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
1dc00 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
1dc10 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
1dc20 20 20 20 63 68 61 72 20 7a 4f 75 74 5b 4d 41 58     char zOut[MAX
1dc30 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20 6d 65  _PATH+1];.    me
1dc40 6d 73 65 74 28 7a 4f 75 74 2c 20 30 2c 20 4d 41  mset(zOut, 0, MA
1dc50 58 5f 50 41 54 48 2b 31 29 3b 0a 20 20 20 20 63  X_PATH+1);.    c
1dc60 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 77 69  ygwin_conv_to_wi
1dc70 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69  n32_path(zRelati
1dc80 76 65 2c 20 7a 4f 75 74 29 3b 20 2f 2a 20 50 4f  ve, zOut); /* PO
1dc90 53 49 58 20 74 6f 20 57 69 6e 33 32 20 2a 2f 0a  SIX to Win32 */.
1dca0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1dcb0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
1dcc0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1dcd0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25  ), zFull, "%s\\%
1dce0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1dcf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1dd00 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
1dd10 20 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b   zOut);.  }else{
1dd20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
1dd30 4f 54 45 3a 20 54 68 65 20 43 79 67 77 69 6e 20  OTE: The Cygwin 
1dd40 64 6f 63 73 20 73 74 61 74 65 20 74 68 61 74 20  docs state that 
1dd50 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67  the maximum leng
1dd60 74 68 20 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a  th needed.    **
1dd70 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 62         for the b
1dd80 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
1dd90 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
1dda0 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 0a 20  ull_win32_path. 
1ddb0 20 20 20 2a 2a 20 20 20 20 20 20 20 69 73 20 4d     **       is M
1ddc0 41 58 5f 50 41 54 48 2e 0a 20 20 20 20 2a 2f 0a  AX_PATH..    */.
1ddd0 20 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f      cygwin_conv_
1dde0 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
1ddf0 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  th(zRelative, zF
1de00 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ull);.  }.  retu
1de10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
1de20 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
1de30 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
1de40 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
1de50 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
1de60 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
1de70 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1de80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
1de90 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
1dea0 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
1deb0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
1dec0 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
1ded0 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
1dee0 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
1def0 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
1df00 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
1df10 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
1df20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
1df30 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
1df40 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
1df50 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
1df60 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
1df70 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
1df80 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
1df90 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1dfa0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
1dfb0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
1dfc0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
1dfd0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
1dfe0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
1dff0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
1e000 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
1e010 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
1e020 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
1e030 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
1e040 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
1e050 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
1e060 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
1e070 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
1e080 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e090 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
1e0a0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e0b0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25  ), zFull, "%s\\%
1e0c0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1e0d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e0e0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
1e0f0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
1e100 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1e110 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
1e120 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
1e130 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
1e140 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
1e150 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e160 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
1e170 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
1e180 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
1e190 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
1e1a0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
1e1b0 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  _).  int nByte;.
1e1c0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1e1d0 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
1e1e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1e1f0 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73  path name begins
1e200 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65   with "/X:", whe
1e210 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c  re "X" is any al
1e220 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68  phabetic.  ** ch
1e230 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64  aracter, discard
1e240 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22   the initial "/"
1e250 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61   from the pathna
1e260 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  me..  */.  if( z
1e270 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
1e280 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70   && sqlite3Isalp
1e290 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29  ha(zRelative[1])
1e2a0 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d   && zRelative[2]
1e2b0 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65  ==':' ){.    zRe
1e2c0 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  lative++;.  }.. 
1e2d0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
1e2e0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
1e2f0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
1e300 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
1e310 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
1e320 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
1e330 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
1e340 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
1e350 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
1e360 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
1e370 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1e380 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
1e390 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
1e3a0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
1e3b0 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
1e3c0 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
1e3d0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1e3e0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1e3f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
1e400 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
1e410 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
1e420 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
1e430 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
1e440 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
1e450 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
1e460 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
1e470 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
1e480 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1e490 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
1e4a0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
1e4b0 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
1e4c0 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
1e4d0 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
1e4e0 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
1e4f0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
1e500 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
1e510 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
1e520 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
1e530 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
1e540 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
1e550 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
1e560 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
1e570 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
1e580 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
1e590 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c  me), zFull, "%s\
1e5a0 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \%s",.          
1e5b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e5c0 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
1e5d0 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  y, zRelative);. 
1e5e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e5f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76  _OK;.  }.  zConv
1e600 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1e610 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
1e620 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43  ative);.  if( zC
1e630 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1e640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e650 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1e660 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
1e670 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
1e680 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
1e690 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
1e6a0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
1e6b0 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
1e6c0 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
1e6d0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1e6e0 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
1e6f0 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
1e700 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
1e710 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1e720 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1e730 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e740 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1e750 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74  .    }.    osGet
1e760 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
1e770 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1e780 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
1e790 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1e7a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1e7b0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e  );.    zOut = un
1e7c0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
1e7d0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
1e7e0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
1e7f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1e800 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1e810 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
1e820 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
1e830 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
1e840 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
1e850 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
1e860 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70  ) + 3;.    zTemp
1e870 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e880 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
1e890 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
1e8a0 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
1e8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1e8c0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1e8d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e8e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e8f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65  ;.    }.    osGe
1e900 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
1e910 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1e920 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
1e930 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1e940 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1e950 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c  ;.    zOut = sql
1e960 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
1e970 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
1e980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e990 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e  (zTemp);.  }.#en
1e9a0 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29  dif.  if( zOut )
1e9b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
1e9c0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
1e9d0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
1e9e0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
1e9f0 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
1ea00 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
1ea10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ea20 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1ea30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ea40 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1ea50 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66   }.#endif.}..#if
1ea60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ea70 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
1ea80 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
1ea90 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
1eaa0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
1eab0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
1eac0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
1ead0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1eae0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
1eaf0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1eb00 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ..*/./*.** Inter
1eb10 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
1eb20 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
1eb30 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
1eb40 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
1eb50 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
1eb60 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
1eb70 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
1eb80 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  brary..*/.static
1eb90 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e   void *winDlOpen
1eba0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1ebb0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
1ebc0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41  zFilename){.  HA
1ebd0 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a  NDLE h;.  void *
1ebe0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1ebf0 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1ec00 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55  (zFilename);.  U
1ec10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ec20 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f  pVfs);.  if( zCo
1ec30 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
1ec40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1ec50 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1ec60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1ec70 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  NRT.    h = osLo
1ec80 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
1ec90 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  y((LPCWSTR)zConv
1eca0 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65  erted, 0);.#else
1ecb0 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
1ecc0 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52  ibraryW((LPCWSTR
1ecd0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
1ece0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
1ecf0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1ed00 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1ed10 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
1ed20 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aryA((char*)zCon
1ed30 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
1ed40 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
1ed50 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1ed60 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
1ed70 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  h;.}.static void
1ed80 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69   winDlError(sqli
1ed90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1eda0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1edb0 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  BufOut){.  UNUSE
1edc0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1edd0 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f  );.  getLastErro
1ede0 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72  rMsg(osGetLastEr
1edf0 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75  ror(), nBuf, zBu
1ee00 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20  fOut);.}.static 
1ee10 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
1ee20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1ee30 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
1ee40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
1ee50 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20  ymbol))(void){. 
1ee60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ee70 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
1ee80 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
1ee90 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73  )osGetProcAddres
1eea0 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  sA((HANDLE)pHand
1eeb0 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a  le, zSymbol);.}.
1eec0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
1eed0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
1eee0 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
1eef0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
1ef00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1ef10 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72  s);.  osFreeLibr
1ef20 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
1ef30 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
1ef40 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
1ef50 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
1ef60 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
1ef70 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
1ef80 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
1ef90 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
1efa0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
1efb0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
1efc0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
1efd0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
1efe0 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
1eff0 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
1f000 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
1f010 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
1f020 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
1f030 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
1f040 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
1f050 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
1f060 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1f070 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
1f080 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
1f090 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
1f0a0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
1f0b0 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
1f0c0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
1f0d0 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
1f0e0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
1f0f0 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
1f100 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
1f110 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
1f120 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1f130 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
1f140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
1f150 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
1f160 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
1f170 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
1f180 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
1f190 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
1f1a0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
1f1b0 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
1f1c0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
1f1d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1f1e0 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f  INRT.  if( sizeo
1f1f0 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42  f(ULONGLONG)<=nB
1f200 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e  uf-n ){.    ULON
1f210 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
1f220 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
1f230 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
1f240 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
1f250 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
1f260 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
1f270 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73   }.#else.  if( s
1f280 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
1f290 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
1f2a0 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
1f2b0 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
1f2c0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1f2d0 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
1f2e0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
1f2f0 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  of(cnt);.  }.#en
1f300 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  dif.  if( sizeof
1f310 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
1f320 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
1f330 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
1f340 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
1f350 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
1f360 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
1f370 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
1f380 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
1f390 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
1f3a0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1f3b0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
1f3c0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
1f3d0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
1f3e0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
1f3f0 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
1f400 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
1f410 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1f420 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
1f430 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  {.  sqlite3_win3
1f440 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  2_sleep((microse
1f450 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
1f460 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f470 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1f480 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
1f490 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
1f4a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1f4b0 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
1f4c0 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
1f4d0 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
1f4e0 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
1f4f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
1f500 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
1f510 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
1f520 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
1f530 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
1f540 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
1f550 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
1f560 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1f570 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
1f580 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
1f590 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
1f5a0 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
1f5b0 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
1f5c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
1f5d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
1f5e0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
1f5f0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
1f600 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
1f610 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
1f620 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
1f630 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
1f640 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
1f650 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
1f660 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
1f670 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
1f680 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
1f690 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
1f6a0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
1f6b0 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
1f6c0 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
1f6d0 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
1f6e0 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
1f6f0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
1f700 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
1f710 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
1f720 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
1f730 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
1f740 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
1f750 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
1f760 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
1f770 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
1f780 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
1f790 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
1f7a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
1f7b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
1f7c0 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
1f7d0 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
1f7e0 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
1f7f0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
1f800 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
1f810 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
1f820 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
1f830 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
1f840 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
1f850 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49  . .  */.  FILETI
1f860 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20  ME ft;.  static 
1f870 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
1f880 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  t64 winFiletimeE
1f890 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a  poch = 23058135*
1f8a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
1f8b0 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  640000;.#ifdef S
1f8c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
1f8d0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1f8e0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
1f8f0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
1f900 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
1f910 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  000;.#endif.  /*
1f920 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64   2^32 - to avoid
1f930 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77   use of LL and w
1f940 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a  arnings in gcc *
1f950 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1f960 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1f970 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a  ax32BitValue = .
1f980 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
1f990 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
1f9a0 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
1f9b0 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
1f9c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
1f9d0 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
1f9e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
1f9f0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
1fa00 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
1fa10 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
1fa20 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
1fa30 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
1fa40 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
1fa50 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
1fa60 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
1fa70 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
1fa80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fa90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
1faa0 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
1fab0 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
1fac0 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
1fad0 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
1fae0 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
1faf0 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
1fb00 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
1fb10 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
1fb20 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20  32BitValue) + . 
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1fb40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
1fb50 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28  dwLowDateTime)/(
1fb60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30  sqlite3_int64)10
1fb70 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  000;..#ifdef SQL
1fb80 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
1fb90 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1fba0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
1fbb0 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
1fbc0 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
1fbd0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
1fbe0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
1fbf0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
1fc00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1fc10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fc20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  K;.}../*.** Find
1fc30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
1fc40 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
1fc50 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
1fc60 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
1fc70 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
1fc80 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
1fc90 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
1fca0 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
1fcb0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
1fcc0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
1fcd0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
1fce0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
1fcf0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
1fd00 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
1fd10 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
1fd20 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
1fd30 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
1fd40 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
1fd50 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
1fd60 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
1fd70 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
1fd80 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
1fd90 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
1fda0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fdb0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
1fdc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1fdd0 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
1fde0 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
1fdf0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
1fe00 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
1fe10 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20   on Windows (or 
1fe20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
1fe30 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69  error_r() on Uni
1fe40 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
1fe50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
1fe60 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
1fe70 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
1fe80 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1fe90 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
1fea0 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
1feb0 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
1fec0 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
1fed0 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
1fee0 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
1fef0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
1ff00 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
1ff10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
1ff20 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
1ff30 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
1ff40 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
1ff50 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
1ff60 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
1ff70 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
1ff80 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
1ff90 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
1ffa0 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
1ffb0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
1ffc0 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
1ffd0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
1ffe0 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
1fff0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
20000 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
20010 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
20020 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
20030 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
20040 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
20050 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
20060 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
20070 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
20080 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
20090 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
200a0 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
200b0 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
200c0 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
200d0 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
200e0 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
200f0 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
20100 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
20110 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
20120 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
20130 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
20140 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
20150 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
20160 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
20170 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
20180 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
20190 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
201a0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
201b0 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
201c0 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
201d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
201e0 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
201f0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
20200 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
20210 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
20220 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
20230 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
20240 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
20250 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
20260 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
20270 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
20280 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
20290 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
202a0 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
202b0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
202c0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
202d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
202e0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
202f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
20300 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
20310 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72  eturn getLastErr
20320 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
20330 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
20340 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  uf);.}../*.** In
20350 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
20360 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
20370 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
20380 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
20390 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
203a0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
203b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
203c0 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
203f0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
20400 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
20410 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f  File */.    MAX_
20420 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 20  PATH,           
20430 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
20440 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
20450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
20460 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
20470 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
20480 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
20490 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
204a0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
204b0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204d0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
204e0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
204f0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
20500 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
20510 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
20520 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
20530 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
20540 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
20550 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
20560 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
20570 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
20580 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
20590 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
205a0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
205b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
205c0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
205d0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
205e0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
205f0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
20600 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
20610 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
20620 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
20630 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
20640 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
20650 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
20660 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
20670 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
20680 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
20690 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
206a0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
206b0 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
206c0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
206d0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
206e0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
206f0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
20700 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
20710 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
20720 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
20730 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
20740 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
20750 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f  all */.  };..  /
20760 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  * Double-check t
20770 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c  hat the aSyscall
20780 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65  [] array has bee
20790 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  n constructed.  
207a0 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53  ** correctly.  S
207b0 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38  ee ticket [bb3a8
207c0 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f  6e890c8e96ab] */
207d0 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
207e0 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d  Size(aSyscall)==
207f0 37 33 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  73 );..#ifndef S
20800 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
20810 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d   /* get memory m
20820 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72  ap allocation gr
20830 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d  anularity */.  m
20840 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66  emset(&winSysInf
20850 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53  o, 0, sizeof(SYS
20860 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20  TEM_INFO));.#if 
20870 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
20880 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73    osGetNativeSys
20890 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
208a0 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  nfo);.#else.  os
208b0 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  GetSystemInfo(&w
208c0 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64  inSysInfo);.#end
208d0 69 66 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53  if.  assert(winS
208e0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
208f0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e  ionGranularity >
20900 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73   0);.#endif..  s
20910 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20920 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
20930 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20940 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c  _OK; .}..int sql
20950 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
20960 29 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ){ .#if SQLITE_O
20970 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c  S_WINRT.  if( sl
20980 65 65 70 4f 62 6a 20 21 3d 20 4e 55 4c 4c 20 29  eepObj != NULL )
20990 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
209a0 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20  dle(sleepObj);. 
209b0 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55     sleepObj = NU
209c0 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  LL;.  }.#endif. 
209d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
209e0 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
209f0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f  SQLITE_OS_WIN */
20a00 0a                                               .