/ Hex Artifact Content
Login

Artifact 30a479f366f206b663d4d5a6c647aa76d18055d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d  mmon.h"../*.** M
02a0: 61 63 72 6f 20 74 6f 20 66 69 6e 64 20 74 68 65  acro to find the
02b0: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74 77 6f 20   minimum of two 
02c0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e 0a  numeric values..
02d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23  */.#ifndef MIN.#
02e0: 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29   define MIN(x,y)
02f0: 20 28 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79   ((x)<(y)?(x):(y
0300: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0310: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
0320: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
0330: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
0340: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
0350: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
0360: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
0370: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
0380: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
0390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
03a0: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
03b0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
03c0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
03d0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
03e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
03f0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0400: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
0410: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
0420: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
0430: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
0440: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
0450: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0460: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0480: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
0490: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
04a0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
04b0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
04c0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
04d0: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
04e0: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43  y */../*.** WinC
04f0: 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73  E lacks native s
0500: 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20  upport for file 
0510: 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61  locking so we ha
0520: 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a  ve to fake it.**
0530: 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20   with some code 
0540: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23  of our own..*/.#
0550: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
0560: 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  CE.typedef struc
0570: 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20  t winceLock {.  
0580: 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20  int nReaders;   
0590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
05a0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62   reader locks ob
05b0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
05c0: 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   bPending;      
05d0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70  /* Indicates a p
05e0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
05f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0600: 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65  .  BOOL bReserve
0610: 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  d;     /* Indica
0620: 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  tes a reserved l
0630: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0640: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0650: 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f  bExclusive;    /
0660: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65  * Indicates an e
0670: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61  xclusive lock ha
0680: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0690: 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a  */.} winceLock;.
06a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
06b0: 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74  e winFile struct
06c0: 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73  ure is a subclas
06d0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
06e0: 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  e* specific to t
06f0: 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74  he win32.** port
0700: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
0710: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0720: 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65   winFile winFile
0730: 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  ;.struct winFile
0740: 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74   {.  const sqlit
0750: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
0760: 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73  Method; /*** Mus
0770: 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a  t be first ***/.
0780: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0790: 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Vfs;      /* The
07a0: 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65   VFS used to ope
07b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
07c0: 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
07d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
07e0: 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  le for accessing
07f0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
0800: 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  8 locktype;     
0810: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
0820: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
0830: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69   held on this fi
0840: 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68  le */.  short sh
0850: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20  aredLockByte;   
0860: 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73  /* Randomly chos
0870: 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20  en byte used as 
0880: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  a shared lock */
0890: 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b  .  u8 ctrlFlags;
08a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
08b0: 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c  ags.  See WINFIL
08c0: 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44  E_* below */.  D
08d0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
08e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
08f0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
0900: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0910: 72 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ror */.  winShm 
0920: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
0930: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
0940: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
0950: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
0960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
0970: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
0980: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
0990: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
09a0: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
09b0: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
09c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
09d0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
09e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
09f0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
0a00: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
0a10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
0a20: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
0a30: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
0a40: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
0a50: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
0a60: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
0a70: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
0a80: 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c  ock */  .  HANDL
0a90: 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20  E hShared;      
0aa0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
0ab0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64  ory segment used
0ac0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a   for locking */.
0ad0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61    winceLock loca
0ae0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63  l;        /* Loc
0af0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74  ks obtained by t
0b00: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
0b10: 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  winFile */.  win
0b20: 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20  ceLock *shared; 
0b30: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
0b40: 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72  hared lock memor
0b50: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20  y for the file  
0b60: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
0b70: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0b80: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
0b90: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
0ba0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
0bb0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
0bc0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
0bd0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
0be0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
0bf0: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
0c00: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
0c10: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
0c20: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
0c30: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
0c40: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
0c50: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
0c60: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
0c70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0c80: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
0c90: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
0cb0: 55 46 5f 53 49 5a 45 20 20 20 28 34 30 39 36 2d  UF_SIZE   (4096-
0cc0: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 0a 23  sizeof(DWORD)).#
0cd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
0ce0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
0cf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
0d00: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
0d10: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
0d20: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
0d30: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
0d40: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
0d50: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
0d60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d70: 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  LLOC./*. * The i
0d80: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
0d90: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
0da0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
0db0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
0dc0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0dd0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
0de0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
0df0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0e00: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28  HEAP_INIT_SIZE (
0e10: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
0e20: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44         (SQLITE_D
0e60: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
0e70: 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e  ) + 4194304).#en
0e80: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d  dif../*. * The m
0e90: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
0ea0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
0eb0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
0ec0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
0ed0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0ee0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
0ef0: 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  AX_SIZE.#  defin
0f00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
0f10: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30  EAP_MAX_SIZE  (0
0f20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
0f30: 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20  The extra flags 
0f40: 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20  to use in calls 
0f50: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61  to the Win32 hea
0f60: 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61  p APIs.  This va
0f70: 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65  lue may be. * ze
0f80: 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75  ro for the defau
0f90: 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f  lt behavior.. */
0fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0fb0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
0fc0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0fd0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
0fe0: 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69  GS     (0).#endi
0ff0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  f../*.** The win
1000: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
1010: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
1020: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1030: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1040: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
1050: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
1060: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
1070: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1080: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
1090: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
10a0: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
10b0: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
10c0: 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic;    /* Magic 
10d0: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
10e0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
10f0: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
1100: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
1110: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
1120: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
1130: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
1140: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
1150: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
1160: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
1170: 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64  n)? */.};..#ifnd
1180: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
1190: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20  e WINMEM_MAGIC  
11a0: 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 65     0x42b2830b.#e
11b0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72  ndif..static str
11c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77  uct winMemData w
11d0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a  in_mem_data = {.
11e0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11f0: 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23   WINMEM_MAGIC,.#
1200: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
1210: 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  LSE.};..#ifndef 
1220: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
1230: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
1240: 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d  () assert( win_m
1250: 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57  em_data.magic==W
1260: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65  INMEM_MAGIC ).#e
1270: 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  lse.#define winM
1280: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a  emAssertMagic().
1290: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
12a0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
12b0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65  win_mem_data.hHe
12c0: 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ap..static void 
12d0: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
12e0: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
12f0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
1300: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b  e(void *pPrior);
1310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
1320: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
1330: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
1340: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  ytes);.static in
1350: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
1360: 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  d *p);.static in
1370: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
1380: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69  int n);.static i
1390: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
13a0: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73  id *pAppData);.s
13b0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
13c0: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
13d0: 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73  pAppData);..cons
13e0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
13f0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
1400: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b  mGetWin32(void);
1410: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1420: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
1430: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1440: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
1450: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
1460: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
1470: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
1480: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
1490: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
14a0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
14b0: 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20   is Win9x.** or 
14c0: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
14d0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
14e0: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
14f0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
1500: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a  stem is Win9x..*
1510: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
1520: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
1530: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
1540: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1550: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
1560: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
1570: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
1580: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
1590: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
15a0: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
15b0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
15c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
15d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
15e0: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ype = 0;.#else.s
15f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1600: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
1610: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
1620: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
1630: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1640: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1650: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1660: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1670: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
1680: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c  QLITE_OS_WINNT |
1690: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
16a0: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
16b0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
16c0: 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  E.#endif..#ifnde
16d0: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
16e0: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
16f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
1700: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1710: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a 2a  TE_OS_WINCE./*.*
1720: 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 61  * These macros a
1730: 72 65 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  re necessary bec
1740: 61 75 73 65 20 57 69 6e 64 6f 77 73 20 43 45 20  ause Windows CE 
1750: 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76 65 6c  does not nativel
1760: 79 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  y support the.**
1770: 20 57 69 6e 33 32 20 41 50 49 73 20 4c 6f 63 6b   Win32 APIs Lock
1780: 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46 69 6c 65  File, UnlockFile
1790: 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  , and LockFileEx
17a0: 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65  .. */..#  define
17b0: 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c   LockFile(a,b,c,
17c0: 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63 65  d,e)       wince
17d0: 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20  LockFile(&a, b, 
17e0: 63 2c 20 64 2c 20 65 29 0a 23 20 20 64 65 66 69  c, d, e).#  defi
17f0: 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c  ne UnlockFile(a,
1800: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 6e  b,c,d,e)     win
1810: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 2c  ceUnlockFile(&a,
1820: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20   b, c, d, e).#  
1830: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45  define LockFileE
1840: 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20  x(a,b,c,d,e,f)  
1850: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
1860: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c  (&a, b, c, d, e,
1870: 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65   f)../*.** These
1880: 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61 6c   are the special
1890: 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20 66   syscall hacks f
18a0: 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 20  or Windows CE.  
18b0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 61  The locking rela
18c0: 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65 73 20 68  ted.** defines h
18d0: 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68 65  ere refer to the
18e0: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20   macros defined 
18f0: 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20 2a 2f 0a  just above.. */.
1900: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 4c 6f 63  .#  define osLoc
1910: 6b 46 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kFile           
1920: 20 20 20 20 20 4c 6f 63 6b 46 69 6c 65 0a 23 20       LockFile.# 
1930: 20 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b   define osUnlock
1940: 46 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  File            
1950: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 20 20    UnlockFile.#  
1960: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
1970: 65 45 78 20 20 20 20 20 20 20 20 20 20 20 20 20  eEx             
1980: 20 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 65 6e 64   LockFileEx.#end
1990: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
19a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
19b0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
19c0: 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e  ows CE or WinRT.
19d0: 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  . */..#if SQLITE
19e0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
19f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20  ITE_OS_WINRT.#  
1a00: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
1a10: 41 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20  ApisANSI()      
1a20: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
1a30: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
1a40: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
1a50: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
1a60: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
1a70: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
1a80: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
1a90: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
1aa0: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
1ab0: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
1ac0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
1ad0: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
1ae0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
1af0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
1b00: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
1b10: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
1b20: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
1b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
1b40: 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a  t win_syscall {.
1b50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1b60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1b70: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
1b80: 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  ytem call */.  s
1b90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
1ba0: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
1bb0: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
1bc0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
1bd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
1be0: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
1bf0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
1c00: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
1c10: 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51  ll[] = {.#if !SQ
1c20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1c30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1c40: 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  T.  { "AreFileAp
1c50: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
1c60: 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c   (SYSCALL)AreFil
1c70: 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20  eApisANSI,      
1c80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
1c90: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
1ca0: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
1cb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1cd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
1ce0: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1cf0: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1d00: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1d10: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1d20: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
1d30: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
1d40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1d50: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
1d60: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
1d70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1d80: 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20  )CharLowerW,    
1d90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1da0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f  else.  { "CharLo
1db0: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
1dc0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
1df0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
1e00: 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52  rLowerW ((LPWSTR
1e10: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
1e20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
1e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
1e40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
1e50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1e60: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1e70: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
1e90: 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72  YSCALL)CharUpper
1ea0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
1eb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
1ec0: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
1ed0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
1ee0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
1f00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
1f10: 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28   osCharUpperW ((
1f20: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
1f30: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
1f40: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
1f50: 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22   { "CloseHandle"
1f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
1f70: 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64  YSCALL)CloseHand
1f80: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1f90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
1fa0: 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f  CloseHandle ((BO
1fb0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
1fc0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  LE))aSyscall[3].
1fd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
1fe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1ff0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
2000: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2020: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2030: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
2040: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2050: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
2060: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2070: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2080: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2090: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
20a0: 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28  osCreateFileA ((
20b0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
20c0: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  LPCSTR,DWORD,DWO
20d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
20e0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
20f0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
2100: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
2110: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [4].pCurrent)..#
2120: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2130: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
2140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2150: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
2160: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2170: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2180: 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  eateFileW,      
2190: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
21a0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
21b0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
21c0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
21f0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2200: 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57  FileW ((HANDLE(W
2210: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
2220: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
2230: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
2240: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
2250: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
2260: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2270: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2280: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2290: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
22a0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
22b0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
22c0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
22d0: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
22e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
22f0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
2300: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2320: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2330: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2340: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2350: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
2360: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
2370: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
2380: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
2390: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
23a0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
23b0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
23c0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
23d0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
23e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
23f0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2400: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
2410: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2420: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
2430: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2440: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
2450: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
2460: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2490: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
24a0: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
24b0: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
24c0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
24d0: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
24e0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
24f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
2500: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2510: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
2520: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
2530: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
2540: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
2550: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
2560: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
2570: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
2580: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
25b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
25c0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
25d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
25e0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
25f0: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
2600: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2610: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2620: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
2630: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
2640: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
2650: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
2660: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2670: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
2680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
2690: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
26c0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
26d0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
26e0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
26f0: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
2700: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2710: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
2720: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2730: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46  ime", (SYSCALL)F
2740: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2750: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
2760: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
2770: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
2780: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
27b0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
27c0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
27d0: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
27e0: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
27f0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
2800: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
2810: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
2820: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2830: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
2840: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
2850: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69  ,    (SYSCALL)Fi
2860: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2870: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  me,    0 },.#els
2880: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
2890: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
28a0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
28d0: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
28e0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28  meToSystemTime (
28f0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
2900: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
2910: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
2920: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
2930: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
2940: 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75    { "FlushFileBu
2950: 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28  ffers",        (
2960: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c  SYSCALL)FlushFil
2970: 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20  eBuffers,       
2980: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2990: 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
29a0: 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  s ((BOOL(WINAPI*
29b0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
29c0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
29d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
29e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
29f0: 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  NSI).  { "Format
2a00: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
2a10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
2a20: 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20  matMessageA,    
2a30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2a40: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
2a50: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
2a60: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2a90: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
2aa0: 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28  essageA ((DWORD(
2ab0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2ac0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2ad0: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
2ae0: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
2af0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d  t*))aSyscall[13]
2b00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2b10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2b20: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2b30: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
2b40: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
2b50: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
2b60: 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20  sageW,          
2b70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2b80: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
2b90: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2ba0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2bc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2bd0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
2be0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
2bf0: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
2c00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57  ,DWORD,DWORD,LPW
2c10: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2c20: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2c30: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
2c40: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 72 65 65  rent)..  { "Free
2c50: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
2c60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2c70: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
2c80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2c90: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
2ca0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
2cb0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
2cc0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
2cd0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
2ce0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
2cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
2d00: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2d10: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
2d20: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
2d30: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
2d40: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
2d50: 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43  )aSyscall[16].pC
2d60: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2d70: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2d80: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d90: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2da0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
2db0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
2dc0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
2dd0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
2de0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2df0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2e00: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
2e10: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2e30: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2e40: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
2e50: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
2e60: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
2e70: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2e80: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2e90: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2ea0: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
2eb0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
2ec0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
2ed0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
2ee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2ef0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
2f00: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2f10: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
2f20: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
2f30: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
2f40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
2f50: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
2f60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2f70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2f80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2f90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2fa0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2fb0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
2fc0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
2fd0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
2fe0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
2ff0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
3000: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
3010: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3020: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3030: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3040: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
3050: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
3060: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
3070: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3080: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
3090: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
30a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
30c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
30d0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
30e0: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
30f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
3100: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3110: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3120: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3130: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3140: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3150: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
3160: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
3170: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
3180: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
3190: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
31a0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
31b0: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
31c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
31e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
31f0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
3200: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
3210: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
3220: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3240: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3250: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3260: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
3270: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
3280: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
3290: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
32a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
32b0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
32c0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
32d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
32e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
32f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3300: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3310: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
3320: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
3330: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
3340: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
3350: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
3360: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
3370: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3380: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
3390: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
33a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
33b0: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
33c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
33d0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
33e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
33f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3420: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
3430: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
3440: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
3450: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  ORD))aSyscall[22
3460: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3470: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
3480: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3490: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
34a0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
34b0: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
34c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
34d0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
34e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
34f0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
3500: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
3510: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3540: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
3550: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
3560: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
3570: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3580: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
3590: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
35a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
35b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
35c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
35d0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
35e0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
35f0: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
3600: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
3610: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
3620: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
3630: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3640: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3650: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
3660: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3690: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
36a0: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
36b0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
36c0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
36d0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
36e0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70  ))aSyscall[24].p
36f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
3700: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
3710: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3720: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
3730: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3740: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
3750: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
3760: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
3770: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
3780: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3790: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
37a0: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
37b0: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
37c0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
37d0: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
37e0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
37f0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
3800: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
3810: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
3820: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3830: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
3840: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
3850: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
3860: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
3870: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
3880: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
3890: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
38a0: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
38b0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
38c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
38d0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
38e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
38f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3900: 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
3910: 20 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50   ((FARPROC(WINAP
3920: 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20  I*)(HMODULE, \. 
3930: 20 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61         LPCSTR))a
3940: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
3950: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
3960: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
3970: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
3980: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3990: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66  ALL)GetSystemInf
39a0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  o,           0 }
39b0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
39c0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
39d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
39e0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
39f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3a00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3a10: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  GetSystemInfo ((
3a20: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
3a30: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
3a40: 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65  scall[27].pCurre
3a50: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73  nt)..  { "GetSys
3a60: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20  temTime",       
3a70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3a80: 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20  SystemTime,     
3a90: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3aa0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
3ab0: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
3ac0: 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  I*)(LPSYSTEMTIME
3ad0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
3ae0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3af0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
3b00: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
3b10: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
3b20: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
3b30: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20  TimeAsFileTime, 
3b40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3b50: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
3b60: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
3b70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3b90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3ba0: 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
3bb0: 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49  AsFileTime ((VOI
3bc0: 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  D(WINAPI*)( \.  
3bd0: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
3be0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70  ))aSyscall[29].p
3bf0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3c00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c10: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3c20: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3c40: 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68  CALL)GetTempPath
3c50: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  A,            0 
3c60: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
3c70: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
3c80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c90: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3ca0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3cb0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3cc0: 73 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28  sGetTempPathA ((
3cd0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
3ce0: 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73  WORD,LPSTR))aSys
3cf0: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
3d00: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3d10: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3d20: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d30: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3d40: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
3d50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3d60: 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c  LL)GetTempPathW,
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3d80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
3d90: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
3da0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3dc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3dd0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3de0: 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57  etTempPathW ((DW
3df0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3e00: 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63  RD,LPWSTR))aSysc
3e10: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
3e20: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3e30: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
3e40: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
3e50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3e60: 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20  GetTickCount,   
3e70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3e80: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
3e90: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
3ea0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3ed0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
3ee0: 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44  ickCount ((DWORD
3ef0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3f00: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
3f10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3f20: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3f30: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3f40: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
3f50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3f60: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41  LL)GetVersionExA
3f70: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3f80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56  .#else.  { "GetV
3f90: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
3fa0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3fc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3fd0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3fe0: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42  etVersionExA ((B
3ff0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
4000: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53          LPOSVERS
4010: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61  IONINFOA))aSysca
4020: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
4030: 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63  ..  { "HeapAlloc
4040: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4050: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c   (SYSCALL)HeapAl
4060: 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  loc,            
4070: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4080: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c   osHeapAlloc ((L
4090: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
40a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
40b0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
40c0: 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72  Syscall[34].pCur
40d0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
40e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
40f0: 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20  "HeapCreate",   
4100: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4110: 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20  ALL)HeapCreate, 
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4130: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
4140: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
4150: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4160: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4170: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4180: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4190: 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e  HeapCreate ((HAN
41a0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  DLE(WINAPI*)(DWO
41b0: 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20  RD,SIZE_T, \.   
41c0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
41d0: 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65  scall[35].pCurre
41e0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
41f0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
4200: 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20  eapDestroy",    
4210: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4220: 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20  L)HeapDestroy,  
4230: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4240: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44  #else.  { "HeapD
4250: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
4260: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4290: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
42a0: 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c  apDestroy ((BOOL
42b0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
42c0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
42d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
42e0: 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20 20  eapFree",       
42f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4300: 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20 20  L)HeapFree,     
4310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4320: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46  .#define osHeapF
4330: 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ree ((BOOL(WINAP
4340: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4350: 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c  ,LPVOID))aSyscal
4360: 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[37].pCurrent).
4370: 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f  .  { "HeapReAllo
4380: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
4390: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41  (SYSCALL)HeapReA
43a0: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
43b0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
43c0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28  osHeapReAlloc ((
43d0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
43e0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
43f0: 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  OID, \.        S
4400: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
4410: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
4420: 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20   { "HeapSize",  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4440: 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c  YSCALL)HeapSize,
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4470: 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f  HeapSize ((SIZE_
4480: 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  T(WINAPI*)(HANDL
4490: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
44a0: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
44b0: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
44c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
44d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
44e0: 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20  apValidate",    
44f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4500: 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20  )HeapValidate,  
4510: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4520: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61  else.  { "HeapVa
4530: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
4540: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4570: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
4580: 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c  pValidate ((BOOL
4590: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
45a0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
45b0: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
45c0: 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74  all[40].pCurrent
45d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
45e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
45f0: 41 4e 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  ANSI).  { "LoadL
4600: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
4610: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
4620: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
4630: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4640: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
4650: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
4660: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4690: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
46a0: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
46b0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
46c0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
46d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
46e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
46f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4700: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4710: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4720: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
4730: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
4740: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
4750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4760: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
4770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
47b0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
47c0: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
47d0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
47e0: 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72  yscall[42].pCurr
47f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4800: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4810: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
4820: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4830: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
4840: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4850: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
4860: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
4870: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4890: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
48a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
48b0: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
48c0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
48d0: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e  L))aSyscall[43].
48e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
48f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4900: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4910: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
4920: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4930: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4940: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4960: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4980: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
49b0: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
49c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
49d0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
49e0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
49f0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
4a00: 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e  call[44].pCurren
4a10: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4a20: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
4a30: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
4a40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a50: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
4a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a70: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
4a80: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
4a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  f..#define osLoc
4ad0: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
4ae0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
4af0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4b00: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4b10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
4b20: 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75  aSyscall[45].pCu
4b30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4b40: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b50: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
4b60: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
4b70: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
4b80: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  le,           0 
4b90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
4ba0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
4bb0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4bd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4be0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4bf0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  sMapViewOfFile (
4c00: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
4c10: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
4c20: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4c30: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
4c40: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
4c50: 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42  nt)..  { "MultiB
4c60: 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20  yteToWideChar", 
4c70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c      (SYSCALL)Mul
4c80: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
4c90: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4ca0: 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  ine osMultiByteT
4cb0: 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28  oWideChar ((int(
4cc0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
4cd0: 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c  ORD,LPCSTR,int,L
4ce0: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
4cf0: 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34   int))aSyscall[4
4d00: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
4d10: 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61  { "QueryPerforma
4d20: 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59  nceCounter", (SY
4d30: 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f  SCALL)QueryPerfo
4d40: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30  rmanceCounter, 0
4d50: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51   },..#define osQ
4d60: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
4d70: 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49  ounter ((BOOL(WI
4d80: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
4d90: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a    LARGE_INTEGER*
4da0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70  ))aSyscall[48].p
4db0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52  Current)..  { "R
4dc0: 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20  eadFile",       
4dd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4de0: 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20  L)ReadFile,     
4df0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4e00: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46  .#define osReadF
4e10: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4e20: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49  I*)(HANDLE,LPVOI
4e30: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
4e40: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
4e50: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
4e60: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
4e70: 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69  .  { "SetEndOfFi
4e80: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
4e90: 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f  (SYSCALL)SetEndO
4ea0: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
4eb0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4ec0: 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28  osSetEndOfFile (
4ed0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4ee0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4ef0: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  50].pCurrent)..#
4f00: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4f10: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
4f20: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
4f30: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
4f40: 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20  ilePointer,     
4f50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4f60: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
4f70: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
4f80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4fb0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
4fc0: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
4fd0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
4fe0: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
4ff0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
5000: 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e  call[51].pCurren
5010: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5020: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c  OS_WINRT.  { "Sl
5030: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
5040: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5050: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
5060: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5070: 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22  else.  { "Sleep"
5080: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5090: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
50c0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65  f..#define osSle
50d0: 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  ep ((VOID(WINAPI
50e0: 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61  *)(DWORD))aSysca
50f0: 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[52].pCurrent)
5100: 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d  ..  { "SystemTim
5110: 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20  eToFileTime",   
5120: 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d   (SYSCALL)System
5130: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20  TimeToFileTime, 
5140: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5150: 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46   osSystemTimeToF
5160: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
5170: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59  INAPI*)(CONST SY
5180: 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  STEMTIME*, \.   
5190: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
51a0: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
51b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
51d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
51e0: 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  T.  { "UnlockFil
51f0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5200: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
5210: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
5220: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5230: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5250: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5270: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5280: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
5290: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
52a0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
52b0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
52c0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
52d0: 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e  call[54].pCurren
52e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
52f0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
5300: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
5310: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5320: 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  )UnlockFileEx,  
5330: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5340: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
5350: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
5360: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5390: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  f..#define osUnl
53a0: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
53b0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
53c0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
53d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
53e0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
53f0: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
5400: 74 29 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  t)..  { "UnmapVi
5410: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
5420: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
5430: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
5440: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5450: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
5460: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
5470: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
5480: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
5490: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
54a0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
54b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
54c0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
54d0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
54e0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
54f0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
5500: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
5510: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
5520: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
5530: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
5540: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OOL))aSyscall[57
5550: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5560: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
5570: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5580: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
55a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
55b0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
55c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
55d0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
55e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
55f0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5600: 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72  yscall[58].pCurr
5610: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5620: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5630: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c  CreateEventExW",
5640: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5650: 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78  LL)CreateEventEx
5660: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
5670: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
5680: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
5690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
56a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
56b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
56c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
56d0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28  reateEventExW ((
56e0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
56f0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
5700: 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c  BUTES,LPCWSTR, \
5710: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
5720: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
5730: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
5740: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5750: 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  RT.  { "WaitForS
5760: 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20  ingleObject",   
5770: 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46    (SYSCALL)WaitF
5780: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20  orSingleObject, 
5790: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
57a0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
57b0: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
57c0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
57f0: 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69  fine osWaitForSi
5800: 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f  ngleObject ((DWO
5810: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
5820: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  LE, \.        DW
5830: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30  ORD))aSyscall[60
5840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5850: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5860: 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  E.  { "WaitForSi
5870: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20  ngleObjectEx",  
5880: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
5890: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c  rSingleObjectEx,
58a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
58b0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
58c0: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
58d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
58f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5900: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
5910: 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57  gleObjectEx ((DW
5920: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5930: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5940: 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63       BOOL))aSysc
5950: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
5960: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5970: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 53 65 74  S_WINCE.  { "Set
5980: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
5990: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
59a0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
59b0: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
59c0: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
59d0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
59e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5a10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
5a20: 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42  ilePointerEx ((B
5a30: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
5a40: 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45  DLE,LARGE_INTEGE
5a50: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41  R, \.        PLA
5a60: 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52  RGE_INTEGER,DWOR
5a70: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e  D))aSyscall[62].
5a80: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5a90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
5aa0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
5ab0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
5ac0: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
5ad0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
5ae0: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
5af0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5b00: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
5b10: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
5b20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5b30: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5b40: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5b50: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
5b60: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
5b70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5b80: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
5b90: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
5ba0: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
5bb0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33  ORD))aSyscall[63
5bc0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5bd0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 45   "MapViewOfFileE
5be0: 78 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  x",         (SYS
5bf0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
5c00: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 30 20  leEx,         0 
5c10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  },..#define osMa
5c20: 70 56 69 65 77 4f 66 46 69 6c 65 45 78 20 28 28  pViewOfFileEx ((
5c30: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
5c40: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
5c50: 52 44 2c 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  RD,DWORD,SIZE_T,
5c60: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49   \.        LPVOI
5c70: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e  D))aSyscall[64].
5c80: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
5c90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5ca0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
5cb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
5cc0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
5cd0: 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e2,             
5ce0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5cf0: 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20  CreateFile2",   
5d00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5d30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5d40: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20 28   osCreateFile2 (
5d50: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
5d60: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44  (LPCWSTR,DWORD,D
5d70: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
5d80: 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46 49        LPCREATEFI
5d90: 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
5da0: 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61 6c  AMETERS))aSyscal
5db0: 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[65].pCurrent).
5dc0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
5dd0: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 61 64 50 61  INRT.  { "LoadPa
5de0: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
5df0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
5e00: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
5e10: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
5e20: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
5e30: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
5e40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5e70: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
5e80: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
5e90: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
5ea0: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
5eb0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
5ec0: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
5ed0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
5ee0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
5ef0: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
5f00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5f10: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
5f20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5f30: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
5f40: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
5f50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5f80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
5f90: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
5fa0: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
5fb0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d  ID))aSyscall[67]
5fc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5fd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5fe0: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
5ff0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
6000: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
6010: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
6020: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6030: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
6040: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
6050: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6070: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6080: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
6090: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
60a0: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
60b0: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
60c0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
60d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
60e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
60f0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
6100: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
6110: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
6120: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
6130: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
6140: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
6150: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
6160: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
6170: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6180: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6190: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
61a0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
61b0: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
61c0: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
61d0: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
61e0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
61f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6200: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
6210: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
6220: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
6230: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
6240: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
6250: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
6260: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
6270: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
62a0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
62b0: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
62c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
62d0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
62e0: 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  70].pCurrent)..}
62f0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
6300: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
6310: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
6320: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
6330: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
6340: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
6350: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
6360: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
6370: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
6380: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
6390: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
63a0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
63b0: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
63c0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
63d0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
63e0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
63f0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6400: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
6410: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
6420: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
6430: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
6440: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
6450: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
6460: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
6470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6490: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
64a0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
64b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
64c0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
64d0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
64e0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
64f0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
6500: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
6510: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6520: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
6530: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
6540: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
6550: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
6560: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
6570: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
6580: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
6590: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
65a0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
65b0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
65c0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
65d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
65e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
65f0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
6600: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
6610: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
6620: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
6630: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
6640: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
6650: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
6660: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
6670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6680: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6690: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
66a0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
66b0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
66c0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
66d0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
66e0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
66f0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
6700: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
6710: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
6720: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
6730: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
6740: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6750: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
6760: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
6770: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
6780: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6790: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
67a0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
67b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
67c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
67d0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
67e0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
67f0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
6800: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
6810: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6820: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
6830: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6850: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6870: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
6880: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
6890: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
68a0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
68b0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
68c0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
68d0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
68e0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
68f0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
6900: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
6910: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
6920: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
6930: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
6940: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
6950: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
6960: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
6970: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6980: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6990: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
69a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
69b0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
69c0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
69d0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
69e0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
69f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
6a00: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
6a10: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6a20: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
6a30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6a40: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6a50: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6a60: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
6a70: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
6a80: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
6a90: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
6aa0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
6ab0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
6ac0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
6ad0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
6ae0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
6af0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
6b00: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
6b10: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
6b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6b30: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
6b40: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
6b50: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
6b60: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
6b70: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
6b80: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
6b90: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
6ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
6bb0: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
6bc0: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
6bd0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
6be0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
6bf0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
6c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
6c10: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
6c20: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
6c30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
6c40: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
6c50: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
6c60: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
6c70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6c90: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
6ca0: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
6cb0: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
6cc0: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
6cd0: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
6ce0: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
6cf0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
6d00: 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a 42 75  _debug(char *zBu
6d10: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
6d20: 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c  char zDbgBuf[SQL
6d30: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
6d40: 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e  F_SIZE];.  int n
6d50: 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 53  Min = MIN(nBuf,S
6d60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
6d70: 42 55 46 5f 53 49 5a 45 2d 31 29 3b 20 2f 2a 20  BUF_SIZE-1); /* 
6d80: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
6d90: 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d   */.  if( nMin<-
6da0: 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f  1 ) nMin = -1; /
6db0: 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76  * all negative v
6dc0: 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e  alues become -1.
6dd0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
6de0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6df0: 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69  _ANSI).  if( nMi
6e00: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
6e10: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
6e20: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
6e30: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
6e40: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
6e50: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 4f  uf, nMin);.    O
6e60: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
6e70: 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  A(zDbgBuf);.  }e
6e80: 6c 73 65 7b 0a 20 20 20 20 4f 75 74 70 75 74 44  lse{.    OutputD
6e90: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66  ebugStringA(zBuf
6ea0: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  );.  }.#elif def
6eb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
6ec0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65  2_HAS_WIDE).  me
6ed0: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
6ee0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
6ef0: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69  G_BUF_SIZE);.  i
6f00: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  f ( osMultiByteT
6f10: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20  oWideChar(.     
6f20: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70       osAreFileAp
6f30: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
6f40: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c  P : CP_OEMCP, 0,
6f50: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
6f60: 20 6e 4d 69 6e 2c 20 7a 44 62 67 42 75 66 2c 20   nMin, zDbgBuf, 
6f70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
6f80: 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66  _BUF_SIZE/sizeof
6f90: 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20  (WCHAR))<=0 ){. 
6fa0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6fb0: 20 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69   OutputDebugStri
6fc0: 6e 67 57 28 7a 44 62 67 42 75 66 29 3b 0a 23 65  ngW(zDbgBuf);.#e
6fd0: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
6fe0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
6ff0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
7000: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
7010: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
7020: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
7030: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
7040: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
7050: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
7060: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
7070: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
7080: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
7090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
70a0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
70b0: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
70c0: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
70d0: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
70e0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
70f0: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
7100: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
7110: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
7120: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
7130: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
7140: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
7150: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
7160: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
7170: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
7180: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
7190: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
71a0: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
71b0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
71c0: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
71d0: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
71e0: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
71f0: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
7200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
7230: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
7240: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
7250: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
7260: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
7270: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
7280: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
7290: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
72a0: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
72b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
72c0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
72d0: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
72e0: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
72f0: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
7300: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
7310: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
7320: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
7330: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
7340: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
7350: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
7360: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
7370: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
7380: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
7390: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
73a0: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
73b0: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
73c0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
73d0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
73e0: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
73f0: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
7400: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
7410: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
7420: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
7430: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
7440: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
7450: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
7460: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
7470: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
7480: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
7490: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
74a0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
74b0: 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  PI..*/.#if SQLIT
74c0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
74d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20  LITE_OS_WINRT.# 
74e0: 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28  define isNT()  (
74f0: 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69  1).#else.  stati
7500: 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29  c int isNT(void)
7510: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
7520: 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  3_os_type==0 ){.
7530: 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49        OSVERSIONI
7540: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
7550: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
7560: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
7570: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
7580: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
7590: 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xA(&sInfo);.    
75a0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70    sqlite3_os_typ
75b0: 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74  e = sInfo.dwPlat
75c0: 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54  formId==VER_PLAT
75d0: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20  FORM_WIN32_NT ? 
75e0: 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 : 1;.    }.   
75f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
7600: 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a  os_type==2;.  }.
7610: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7620: 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23 69  _OS_WINCE */..#i
7630: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
7640: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
7650: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
7660: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
7670: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
7680: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
7690: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
76a0: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
76b0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
76c0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
76d0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
76e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
76f0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
7700: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
7710: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
7720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
7730: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
7740: 44 41 54 45 0a 20 20 61 73 73 65 72 74 20 28 20  DATE.  assert ( 
7750: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
7760: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
7770: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
7780: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
7790: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
77a0: 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65  =0 );.  p = osHe
77b0: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
77c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
77d0: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
77e0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21  nBytes);.  if( !
77f0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
7800: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
7810: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
7820: 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73  apAlloc %u bytes
7830: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
7840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7850: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
7860: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
7870: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
7880: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7890: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
78a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
78b0: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
78c0: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
78d0: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
78e0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
78f0: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
7900: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
7910: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
7920: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
7930: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
7940: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65  E_VALUE );.#ifde
7950: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
7960: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20  ALLOC_VALIDATE. 
7970: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
7980: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
7990: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
79a0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
79b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
79c0: 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72   !pPrior ) retur
79d0: 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55  n; /* Passing NU
79e0: 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69  LL to HeapFree i
79f0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a  s undefined. */.
7a00: 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65    if( !osHeapFre
7a10: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
7a20: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
7a30: 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20  , pPrior) ){.   
7a40: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
7a50: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
7a60: 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62  ed to HeapFree b
7a70: 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65  lock %p (%d), he
7a80: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
7a90: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
7aa0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
7ab0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
7ac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
7ad0: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
7ae0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
7af0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
7b00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
7b10: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
7b20: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
7b30: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
7b40: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
7b50: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
7b60: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
7b70: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
7b80: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
7b90: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
7ba0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
7bb0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
7bc0: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
7bd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
7be0: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72  VALIDATE.  asser
7bf0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
7c00: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
7c10: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
7c20: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
7c30: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
7c40: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66  Bytes>=0 );.  if
7c50: 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  ( !pPrior ){.   
7c60: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
7c70: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
7c80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
7c90: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
7ca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7cb0: 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63   = osHeapReAlloc
7cc0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
7cd0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
7ce0: 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54   pPrior, (SIZE_T
7cf0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20  )nBytes);.  }.  
7d00: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
7d10: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
7d20: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
7d30: 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28  to %s %u bytes (
7d40: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7d60: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
7d70: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
7d80: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
7d90: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7db0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
7dc0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
7dd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7de0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
7df0: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
7e00: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
7e10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7e20: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
7e30: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
7e40: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
7e50: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
7e60: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
7e70: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
7e80: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
7e90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ea0: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
7eb0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
7ec0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
7ed0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
7ee0: 41 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f  ATE.  assert ( o
7ef0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
7f00: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
7f10: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
7f20: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
7f30: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
7f40: 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53  0;.  n = osHeapS
7f50: 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ize(hHeap, SQLIT
7f60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7f70: 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d  GS, p);.  if( n=
7f80: 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20  =(SIZE_T)-1 ){. 
7f90: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
7fa0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
7fb0: 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65  iled to HeapSize
7fc0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20   block %p (%d), 
7fd0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
7fe0: 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47            p, osG
7ff0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
8000: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
8010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8020: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b    return (int)n;
8030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20  .}../*.** Round 
8040: 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a  up a request siz
8050: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  e to the next va
8060: 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  lid allocation s
8070: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
8080: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
8090: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
80a0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n n;.}../*.** In
80b0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
80c0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
80d0: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
80e0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
80f0: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
8100: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
8110: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
8120: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
8130: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
8140: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8150: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
8160: 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e  Data->magic==WIN
8170: 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 20 20 69  MEM_MAGIC );.  i
8180: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
8190: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70 57  >hHeap ){.    pW
81a0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
81b0: 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 28   = osHeapCreate(
81c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
81d0: 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  P_FLAGS,.       
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
8200: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8210: 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20  _INIT_SIZE,.    
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
8250: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20  EAP_MAX_SIZE);. 
8260: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
8270: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
8280: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
82a0: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
82b0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
82c0: 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e  d), flags=%u, in
82d0: 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69  itSize=%u, maxSi
82e0: 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20 20 20  ze=%u",.        
82f0: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
8300: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
8310: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
8320: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
8330: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
8340: 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ZE, SQLITE_WIN32
8350: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b  _HEAP_MAX_SIZE);
8360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8370: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8380: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
8390: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45  a->bOwned = TRUE
83a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
83b0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
83c0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
83d0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
83e0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
83f0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
8410: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
8420: 54 45 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  TE.  assert( osH
8430: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
8440: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
8450: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8460: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
8470: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
8480: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8490: 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69  /*.** Deinitiali
84a0: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
84b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
84c0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
84d0: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
84e0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69   winMemData *pWi
84f0: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d  nMemData = (winM
8500: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74  emData *)pAppDat
8510: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  a;..  if( !pWinM
8520: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b  emData ) return;
8530: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61  .  if( pWinMemDa
8540: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
8550: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
8560: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
8570: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8580: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
8590: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
85a0: 56 41 4c 49 44 41 54 45 0a 20 20 20 20 61 73 73  VALIDATE.    ass
85b0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
85c0: 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  ate(pWinMemData-
85d0: 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  >hHeap, SQLITE_W
85e0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
85f0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
8600: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  .    if( pWinMem
8610: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a  Data->bOwned ){.
8620: 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61        if( !osHea
8630: 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d  pDestroy(pWinMem
8640: 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a  Data->hHeap) ){.
8650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8660: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
8670: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
8680: 70 44 65 73 74 72 6f 79 20 28 25 64 29 2c 20 68  pDestroy (%d), h
8690: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
86b0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
86c0: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
86d0: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
86e0: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
86f0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
8700: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
8710: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8720: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
8730: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
8740: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
8750: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8760: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
8770: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
8780: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
8790: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
87a0: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
87b0: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
87c0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
87d0: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
87e0: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
87f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8800: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
8810: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
8820: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
8830: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
8840: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
8850: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
8860: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
8870: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
8880: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
8890: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
88a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
88b0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
88c0: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
88d0: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
88e0: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
88f0: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
8900: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
8910: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
8920: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
8930: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
8940: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
8950: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
8960: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
8970: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
8980: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
8990: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
89a0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
89b0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
89c0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
89d0: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
89e0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
89f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
8a00: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
8a10: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
8a20: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
8a30: 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31  t Unicode (UTF-1
8a40: 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63  6?). .**.** Spac
8a50: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
8a60: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
8a70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
8a80: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
8a90: 20 4c 50 57 53 54 52 20 75 74 66 38 54 6f 55 6e   LPWSTR utf8ToUn
8aa0: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
8ab0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
8ac0: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
8ad0: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
8ae0: 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  e;..  nChar = os
8af0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
8b00: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
8b10: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
8b20: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
8b30: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
8b40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
8b50: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
8b60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
8b70: 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64  Char*sizeof(zWid
8b80: 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  eFilename[0]) );
8b90: 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65  .  if( zWideFile
8ba0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
8bb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
8bc0: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
8bd0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
8be0: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
8bf0: 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c  me, -1, zWideFil
8c00: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20         nChar);. 
8c30: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
8c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8c50: 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  e(zWideFilename)
8c60: 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e  ;.    zWideFilen
8c70: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
8c80: 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e  eturn zWideFilen
8c90: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
8ca0: 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20  nvert Microsoft 
8cb0: 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38  Unicode to UTF-8
8cc0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
8cd0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
8ce0: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
8cf0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
8d00: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
8d10: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
8d20: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
8d30: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
8d40: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
8d50: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
8d60: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
8d70: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
8d80: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
8d90: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
8da0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
8db0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
8dc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8dd0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
8de0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8df0: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
8e00: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
8e10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8e20: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
8e30: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
8e40: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
8e50: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
8e60: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
8e70: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
8ea0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
8eb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8ec0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
8ed0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
8ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
8ef0: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
8f00: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
8f10: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
8f20: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
8f30: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
8f40: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
8f50: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
8f60: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
8f70: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
8f80: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
8f90: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
8fa0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
8fb0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
8fc0: 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  STR mbcsToUnicod
8fd0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
8fe0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
8ff0: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
9000: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20  zMbcsFilename;. 
9010: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
9020: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
9030: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
9040: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
9050: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
9060: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
9070: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
9080: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  , -1, NULL,.    
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73              0)*s
90b0: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
90c0: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
90d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
90e0: 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  }.  zMbcsFilenam
90f0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
9100: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
9110: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30  (zMbcsFilename[0
9120: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63  ]) );.  if( zMbc
9130: 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  sFilename==0 ){.
9140: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9150: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  }.  nByte = osMu
9160: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
9170: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
9180: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d  Filename, -1, zM
9190: 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  bcsFilename,.   
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
91c0: 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  te);.  if( nByte
91d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
91e0: 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c  e3_free(zMbcsFil
91f0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63  ename);.    zMbc
9200: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  sFilename = 0;. 
9210: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63   }.  return zMbc
9220: 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  sFilename;.}../*
9230: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72  .** Convert Micr
9240: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f  osoft Unicode to
9250: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
9260: 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61  acter string, ba
9270: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73  sed on the.** us
9280: 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61  er's ANSI codepa
9290: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ge..**.** Space 
92a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
92b0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
92c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
92d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
92e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
92f0: 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28   *unicodeToMbcs(
9300: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
9310: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
9320: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
9330: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
9340: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
9350: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
9360: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
9370: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
9380: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
9390: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
93a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
93b0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
93c0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
93d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
93e0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
93f0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
9400: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  oc( nByte );.  i
9410: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
9420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9430: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
9440: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
9450: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
9460: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
9470: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a   -1, zFilename,.
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
94b0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
94c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
94d0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
94e0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
94f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9500: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
9510: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
9520: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
9530: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
9540: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
9550: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
9560: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
9570: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
9580: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
9590: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
95a0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
95b0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
95c0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
95d0: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50  lenameUtf8;.  LP
95e0: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
95f0: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63    zTmpWide = mbc
9600: 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  sToUnicode(zFile
9610: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
9620: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
9630: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9640: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20  zFilenameUtf8 = 
9650: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
9660: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
9670: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
9680: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
9690: 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a  enameUtf8;.}../*
96a0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d  .** Convert UTF-
96b0: 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63  8 to multibyte c
96c0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e  haracter string.
96d0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
96e0: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
96f0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
9700: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
9710: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
9720: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
9730: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
9740: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
9750: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
9760: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
9770: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
9780: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75  ..  zTmpWide = u
9790: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
97a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
97b0: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
97c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
97d0: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
97e0: 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  = unicodeToMbcs(
97f0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
9800: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
9810: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
9820: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
9830: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ./*.** The retur
9840: 6e 20 76 61 6c 75 65 20 6f 66 20 67 65 74 4c 61  n value of getLa
9850: 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73  stErrorMsg.** is
9860: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
9870: 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
9880: 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
9890: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
98a0: 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
98b0: 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
98c0: 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  cated)..*/.stati
98d0: 63 20 69 6e 74 20 67 65 74 4c 61 73 74 45 72 72  c int getLastErr
98e0: 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74  orMsg(DWORD last
98f0: 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c  Errno, int nBuf,
9900: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
9910: 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  /* FormatMessage
9920: 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61   returns 0 on fa
9930: 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73  ilure.  Otherwis
9940: 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  e it.  ** return
9950: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9960: 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74  TCHARs written t
9970: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a  o the output.  *
9980: 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64  * buffer, exclud
9990: 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ing the terminat
99a0: 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20  ing null char.. 
99b0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65   */.  DWORD dwLe
99c0: 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
99d0: 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Out = 0;..  if( 
99e0: 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
99f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
9a00: 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64    WCHAR zTempWid
9a10: 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 2f  e[MAX_PATH+1]; /
9a20: 2a 20 4e 4f 54 45 3a 20 53 6f 6d 65 77 68 61 74  * NOTE: Somewhat
9a30: 20 61 72 62 69 74 72 61 72 79 2e 20 2a 2f 0a 20   arbitrary. */. 
9a40: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
9a50: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
9a60: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
9a70: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
9aa0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
9ab0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
9b40: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 0a 20       MAX_PATH,. 
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
9b90: 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52  #else.    LPWSTR
9ba0: 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c   zTempWide = NUL
9bb0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
9bc0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
9bd0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
9be0: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
9bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
9c10: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
9c20: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
9c50: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
9c60: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
9cb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
9cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9cf0: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
9d00: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
9d50: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
9d60: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
9d70: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
9d80: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
9d90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
9da0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
9db0: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
9dc0: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
9dd0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
9de0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
9df0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
9e00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9e10: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
9e20: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
9e30: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
9e40: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
9e50: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
9e60: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
9e70: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
9e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
9e90: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
9ea0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
9eb0: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
9ec0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
9ed0: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
9ee0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
9ef0: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
9f20: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
9f30: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
9f60: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
9f90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
9fb0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
a000: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
a050: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
a060: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
a070: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
a080: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
a090: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
a0a0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
a0b0: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
a0c0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
a0d0: 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
a0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
a0f0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
a100: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
a110: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
a120: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
a130: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
a140: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
a150: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  (zTemp);.    }. 
a160: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
a170: 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20  0 == dwLen ){.  
a180: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a190: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
a1a0: 4f 73 45 72 72 6f 72 20 30 78 25 78 20 28 25 75  OsError 0x%x (%u
a1b0: 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c  )", lastErrno, l
a1c0: 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c  astErrno);.  }el
a1d0: 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20  se{.    /* copy 
a1e0: 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75  a maximum of nBu
a1f0: 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75  f chars to outpu
a200: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
a210: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a220: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73  (nBuf, zBuf, "%s
a230: 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a  ", zOut);.    /*
a240: 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62   free the UTF8 b
a250: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  uffer */.    sql
a260: 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
a270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
a280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  .}../*.**.** Thi
a290: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e  s function - win
a2a0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29  LogErrorAtLine()
a2b0: 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20   - is only ever 
a2c0: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
a2d0: 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72  acro.** winLogEr
a2e0: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ror()..**.** Thi
a2f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
a300: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
a310: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
a320: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OS function..**
a330: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
a340: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
a350: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
a360: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
a370: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20  lue of.** error 
a380: 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73  code and, if pos
a390: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
a3a0: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
a3b0: 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f  lent from .** Fo
a3c0: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a  rmatMessage..**.
a3d0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
a3e0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
a3f0: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
a400: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
a410: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
a420: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
a430: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
a440: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
a450: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
a460: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
a470: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
a480: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
a490: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
a4a0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
a4b0: 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65  * failed and the
a4c0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
a4d0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
a4e0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
a4f0: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
a500: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
a510: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
a520: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
a530: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
a540: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
a550: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
a580: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
a590: 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
a5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
a5b0: 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
a5c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a5d0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
a5e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
a5f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
a600: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
a610: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
a620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
a630: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
a640: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
a650: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
a680: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
a690: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
a6a0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
a6b0: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
a6c0: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
a6d0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
a6e0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a710: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
a720: 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74  sg[0] = 0;.  get
a730: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73  LastErrorMsg(las
a740: 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a  tErrno, sizeof(z
a750: 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61  Msg), zMsg);.  a
a760: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
a770: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
a780: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
a790: 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28  ath = "";.  for(
a7a0: 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20  i=0; zMsg[i] && 
a7b0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26  zMsg[i]!='\r' &&
a7c0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20   zMsg[i]!='\n'; 
a7d0: 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d  i++){}.  zMsg[i]
a7e0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
a7f0: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
a800: 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a     "os_win.c:%d:
a810: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
a820: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
a830: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e   lastErrno, zFun
a840: 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20  c, zPath, zMsg. 
a850: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
a860: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
a870: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  The number of ti
a880: 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46  mes that a ReadF
a890: 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65  ile(), WriteFile
a8a0: 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69  (), and DeleteFi
a8b0: 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  le().** will be 
a8c0: 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e  retried followin
a8d0: 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f  g a locking erro
a8e0: 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75  r - probably cau
a8f0: 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76  sed by .** antiv
a900: 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20  irus software.  
a910: 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c  Also the initial
a920: 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68   delay before th
a930: 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a  e first retry..*
a940: 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72  * The delay incr
a950: 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77  eases linearly w
a960: 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a  ith each retry..
a970: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
a980: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
a990: 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  TRY.# define SQL
a9a0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
a9b0: 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a  RETRY 10.#endif.
a9c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
a9d0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
a9e0: 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20  _DELAY.# define 
a9f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
aa00: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32  RR_RETRY_DELAY 2
aa10: 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  5.#endif.static 
aa20: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
aa30: 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  try = SQLITE_WIN
aa40: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a  32_IOERR_RETRY;.
aa50: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
aa60: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
aa70: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
aa80: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
aa90: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65  ;../*.** If a Re
aaa0: 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74  adFile() or Writ
aab0: 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63  eFile() error oc
aac0: 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69  curs, invoke thi
aad0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20  s routine.** to 
aae0: 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64  see if it should
aaf0: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65   be retried.  Re
ab00: 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74  turn TRUE to ret
ab10: 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ry.  Return FALS
ab20: 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20  E.** to give up 
ab30: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
ab40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74  /.static int ret
ab50: 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52  ryIoerr(int *pnR
ab60: 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72  etry, DWORD *pEr
ab70: 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20  ror){.  DWORD e 
ab80: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
ab90: 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74  ();.  if( *pnRet
aba0: 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65  ry>=win32IoerrRe
abb0: 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
abc0: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
abd0: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
abe0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
abf0: 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52    }.  if( e==ERR
ac00: 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
ac10: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
ac20: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
ac30: 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  N ||.      e==ER
ac40: 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  ROR_SHARING_VIOL
ac50: 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  ATION ){.    sql
ac60: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
ac70: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
ac80: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
ac90: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
aca0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
acb0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
acc0: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
acd0: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
ace0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
acf0: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
ad00: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
ad10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
ad20: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
ad30: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
ad40: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ad50: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
ad60: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
ad70: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
ad80: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
ad90: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
ada0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
adb0: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
adc0: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
add0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69  ./*.** Lock a fi
ade0: 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74  le region..*/.st
adf0: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63  atic BOOL winLoc
ae00: 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20  kFile(.  HANDLE 
ae10: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
ae20: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
ae30: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
ae40: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
ae50: 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
ae60: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
ae70: 65 73 48 69 67 68 0a 29 7b 0a 20 20 69 66 28 20  esHigh.){.  if( 
ae80: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  isNT() ){.    OV
ae90: 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
aea0: 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
aeb0: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
aec0: 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
aed0: 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
aee0: 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
aef0: 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
af00: 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
af10: 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28  rn osLockFileEx(
af20: 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c  hFile, flags, 0,
af30: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
af40: 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
af50: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
af60: 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
af70: 6c 65 28 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(hFile, offset
af80: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
af90: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
afa0: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
afb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
afc0: 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
afd0: 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20   */.static BOOL 
afe0: 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  winUnlockFile(. 
aff0: 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 2c 0a 20   HANDLE hFile,. 
b000: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
b010: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
b020: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
b030: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
b040: 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
b050: 29 7b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ){.  if( isNT() 
b060: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
b070: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
b080: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
b090: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
b0a0: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
b0b0: 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
b0c0: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
b0d0: 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
b0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
b0f0: 6c 6f 63 6b 46 69 6c 65 45 78 28 68 46 69 6c 65  lockFileEx(hFile
b100: 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
b110: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
b120: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
b130: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
b140: 6c 6f 63 6b 46 69 6c 65 28 68 46 69 6c 65 2c 20  lockFile(hFile, 
b150: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
b160: 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
b170: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
b180: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
b190: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a  LITE_OS_WINCE./*
b1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b1e0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73  ********.** This
b1f0: 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e   section contain
b200: 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45  s code for WinCE
b210: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   only..*/./*.** 
b220: 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65 73 20  Windows CE does 
b230: 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c  not have a local
b240: 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  time() function.
b250: 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a    So create a.**
b260: 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a   substitute..*/.
b270: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
b280: 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63  >.struct tm *__c
b290: 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63  decl localtime(c
b2a0: 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a  onst time_t *t).
b2b0: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
b2c0: 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49  t tm y;.  FILETI
b2d0: 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53  ME uTm, lTm;.  S
b2e0: 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20  YSTEMTIME pTm;. 
b2f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
b300: 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a  64;.  t64 = *t;.
b310: 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31    t64 = (t64 + 1
b320: 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30  1644473600)*1000
b330: 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f  0000;.  uTm.dwLo
b340: 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f  wDateTime = (DWO
b350: 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46  RD)(t64 & 0xFFFF
b360: 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48  FFFF);.  uTm.dwH
b370: 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57  ighDateTime= (DW
b380: 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b  ORD)(t64 >> 32);
b390: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c  .  osFileTimeToL
b3a0: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
b3b0: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c  m,&lTm);.  osFil
b3c0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
b3d0: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
b3e0: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
b3f0: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
b400: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
b410: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
b420: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
b430: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
b440: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
b450: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
b460: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
b470: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
b480: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
b490: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
b4a0: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 23 64  return &y;.}..#d
b4b0: 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
b4c0: 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
b4d0: 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
b4e0: 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
b4f0: 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
b500: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
b510: 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
b520: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
b530: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
b540: 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
b550: 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
b560: 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
b570: 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
b580: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
b590: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
b5a0: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
b5b0: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
b5c0: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
b5d0: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
b5e0: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
b5f0: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
b600: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
b610: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
b620: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
b630: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
b640: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
b650: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
b660: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
b670: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
b680: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
b690: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
b6a0: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65  ic BOOL winceCre
b6b0: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
b6c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
b6d0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
b6e0: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20    LPWSTR zTok;. 
b6f0: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20   LPWSTR zName;. 
b700: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
b710: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75  UE;..  zName = u
b720: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
b730: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
b740: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
b750: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
b760: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  */.    return FA
b770: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  LSE;.  }..  /* I
b780: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
b790: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
b7a0: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d    memset(&pFile-
b7b0: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  >local, 0, sizeo
b7c0: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
b7d0: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
b7e0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
b7f0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
b800: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
b810: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
b820: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
b830: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68  */.  zTok = osCh
b840: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b  arLowerW(zName);
b850: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a  .  for (;*zTok;z
b860: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28  Tok++){.    if (
b870: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a  *zTok == '\\') *
b880: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a  zTok = '_';.  }.
b890: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65  .  /* Create/ope
b8a0: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65  n the named mute
b8b0: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  x */.  pFile->hM
b8c0: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d  utex = osCreateM
b8d0: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
b8e0: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
b8f0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
b900: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
b910: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
b920: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
b930: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
b940: 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e  E_ERROR, pFile->
b950: 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63  lastErrno, "winc
b960: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
b970: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
b980: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
b990: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
b9a0: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
b9b0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
b9c0: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
b9d0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
b9e0: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
b9f0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
ba00: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
ba10: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
ba20: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
ba30: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
ba40: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
ba50: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
ba60: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
ba70: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
ba80: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
ba90: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
baa0: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
bab0: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
bac0: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
bad0: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
bae0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
baf0: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
bb00: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
bb10: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
bb20: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
bb50: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
bb60: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
bb70: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bba0: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
bbb0: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
bbc0: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
bbd0: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
bbe0: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
bbf0: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
bc00: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
bc10: 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61  */.  if (osGetLa
bc20: 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52  stError() == ERR
bc30: 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54  OR_ALREADY_EXIST
bc40: 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20  S){.    bInit = 
bc50: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  FALSE;.  }..  sq
bc60: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
bc70: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
bc80: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
bc90: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
bca0: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
bcb0: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
bcc0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
bcd0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
bce0: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
bcf0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
bd00: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
bd20: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
bd30: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
bd40: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
bd50: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
bd60: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
bd70: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
bd80: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
bd90: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
bda0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68    if (!pFile->sh
bdb0: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  ared){.      pFi
bdc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
bdd0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
bde0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
bdf0: 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
be00: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
be10: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
be20: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
be30: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
be40: 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  );.      osClose
be50: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
be60: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
be70: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
be80: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
be90: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
bea0: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
beb0: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
bec0: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
bed0: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
bee0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
bef0: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20  d == NULL){.    
bf00: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
bf10: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
bf20: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
bf30: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
bf40: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
bf50: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
bf60: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
bf70: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
bf80: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
bf90: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
bfa0: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
bfb0: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
bfc0: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
bfd0: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
bfe0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
bff0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
c000: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
c010: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
c020: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
c030: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
c040: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
c050: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
c060: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
c070: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
c080: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
c090: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
c0a0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
c0b0: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
c0c0: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
c0d0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
c0e0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
c0f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
c100: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
c110: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
c120: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
c130: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
c140: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
c150: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
c160: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
c170: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
c180: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
c190: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
c1a0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
c1b0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
c1c0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
c1d0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
c1e0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
c1f0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
c200: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
c210: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
c220: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
c230: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
c240: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
c250: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
c260: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
c270: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
c280: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
c290: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
c2a0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
c2b0: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
c2c0: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
c2d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
c2e0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
c2f0: 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56   */.    osUnmapV
c300: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
c310: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73  >shared);.    os
c320: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
c330: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20  e->hShared);..  
c340: 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74    /* Done with t
c350: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
c360: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
c370: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
c380: 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73  ;    .    osClos
c390: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
c3a0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
c3b0: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
c3c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
c3d0: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
c3e0: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
c3f0: 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  e() API of Windo
c400: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
c410: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
c420: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45  ckFile(.  HANDLE
c430: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
c440: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
c450: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
c460: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
c470: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
c480: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
c490: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
c4a0: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
c4b0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
c4c0: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
c4d0: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
c4e0: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
c4f0: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
c500: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
c510: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
c520: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c530: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
c540: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
c550: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
c560: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
c570: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
c580: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
c590: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
c5a0: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
c5b0: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
c5c0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
c5d0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
c5e0: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
c5f0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
c600: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
c610: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
c620: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
c630: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
c640: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
c650: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
c660: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
c670: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
c680: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
c690: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
c6a0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
c6b0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
c6c0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
c6d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c6e0: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
c6f0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
c700: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
c710: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
c720: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
c730: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
c740: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
c750: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
c760: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
c770: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
c780: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
c790: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
c7a0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
c7b0: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
c7c0: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
c7d0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
c7e0: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
c7f0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
c800: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
c810: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
c820: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
c830: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
c840: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
c850: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
c860: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
c870: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
c880: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
c890: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
c8a0: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
c8b0: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
c8c0: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
c8d0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
c8e0: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
c8f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
c900: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
c910: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
c920: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
c930: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
c940: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
c950: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
c960: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
c970: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
c980: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
c990: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
c9a0: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
c9b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
c9c0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
c9d0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
c9e0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
c9f0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
ca00: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
ca10: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
ca20: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
ca30: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
ca40: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
ca50: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ca60: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
ca70: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
ca80: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ca90: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
caa0: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
cab0: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
cac0: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
cad0: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
cae0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
caf0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  UnlockFile(.  HA
cb00: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
cb10: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
cb20: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
cb30: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
cb40: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
cb50: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
cb60: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
cb70: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
cb80: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
cb90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
cba0: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
cbb0: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
cbc0: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
cbd0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cbe0: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
cbf0: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
cc00: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
cc10: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
cc20: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
cc30: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
cc40: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
cc50: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
cc60: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
cc70: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
cc80: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
cc90: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
cca0: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
ccb0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
ccc0: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
ccd0: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
cce0: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
ccf0: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
cd00: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
cd10: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
cd20: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
cd30: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
cd40: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
cd50: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
cd60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
cd70: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
cd80: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
cd90: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
cda0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
cdb0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
cdc0: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
cdd0: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
cde0: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
cdf0: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
ce00: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
ce10: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
ce20: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
ce30: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
ce40: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
ce50: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
ce60: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ce70: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
ce80: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
ce90: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
cea0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
ceb0: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
cec0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
ced0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
cee0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
cef0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
cf00: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
cf10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
cf20: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
cf30: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
cf40: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
cf50: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
cf60: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
cf70: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
cf80: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
cf90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
cfa0: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
cfb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
cfc0: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
cfd0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
cfe0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
cff0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
d000: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
d010: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
d020: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
d030: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
d040: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
d050: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
d060: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
d070: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
d080: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
d090: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
d0a0: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
d0b0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
d0c0: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
d0d0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
d0e0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
d0f0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
d100: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
d110: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
d120: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
d130: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
d140: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d150: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
d160: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
d170: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
d180: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 57  ileEx() API of W
d190: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
d1a0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
d1b0: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
d1c0: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
d1d0: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
d1e0: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
d1f0: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
d200: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
d210: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
d220: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
d230: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
d240: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
d250: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
d260: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
d270: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
d280: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
d290: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
d2a0: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
d2b0: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
d2c0: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
d2d0: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
d2e0: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
d2f0: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
d300: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
d310: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
d320: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
d330: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
d340: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
d350: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
d360: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
d370: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
d380: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
d390: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
d3a0: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
d3b0: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
d3c0: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
d3d0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
d3e0: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
d3f0: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
d400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d440: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
d450: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
d460: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
d470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4b0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
d4c0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
d4d0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
d4e0: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
d4f0: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
d500: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
d510: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
d520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d560: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
d570: 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
d580: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
d590: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
d5a0: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
d5b0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
d5c0: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
d5d0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
d5e0: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
d5f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
d600: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
d610: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
d620: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
d630: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
d640: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
d650: 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
d660: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
d670: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
d680: 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68  eturn 0. .** Oth
d690: 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
d6a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
d6b0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
d6c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d6d0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46  seekWinFile(winF
d6e0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
d6f0: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
d700: 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t){.#if !SQLITE_
d710: 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20  OS_WINRT.  LONG 
d720: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
d740: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
d750: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
d760: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
d770: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
d780: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
d790: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
d7a0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
d7b0: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d7d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
d7e0: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
d7f0: 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
d800: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
d810: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
d820: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
d830: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
d840: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
d850: 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
d860: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
d870: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
d880: 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
d890: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
d8a0: 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
d8b0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
d8c0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
d8d0: 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a  eturns a dword .
d8e0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d8f0: 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
d900: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
d910: 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
d920: 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
d930: 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
d940: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
d950: 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
d960: 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20  ording to MSDN, 
d970: 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
d980: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
d990: 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
d9a0: 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
d9b0: 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  o to determine .
d9c0: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20    ** whether an 
d9d0: 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c  error has actual
d9e0: 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69  ly occured, it i
d9f0: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
da00: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
da10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
da20: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
da30: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
da40: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
da50: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
da60: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
da70: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
da80: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
da90: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
daa0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
dab0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
dac0: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
dad0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
dae0: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
daf0: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
db00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
db10: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
db20: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
db30: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
db40: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
db50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
db60: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ..  return 0;.#e
db70: 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
db80: 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
db90: 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
dba0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
dbb0: 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
dbc0: 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
dbd0: 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
dbe0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
dbf0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
dc00: 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc20: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
dc30: 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
dc40: 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
dc50: 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
dc60: 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
dc70: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
dc80: 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
dc90: 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
dca0: 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
dcb0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
dcc0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
dcd0: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
dce0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
dcf0: 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
dd00: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
dd10: 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22     "seekWinFile"
dd20: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
dd30: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
dd40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
dd50: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
dd60: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
dd70: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
dd80: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
dd90: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
dda0: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
ddb0: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
ddc0: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
ddd0: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
dde0: 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69  t, but Windows i
ddf0: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
de00: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
de10: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
de20: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
de30: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
de40: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
de50: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
de60: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
de70: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
de80: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
de90: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
dea0: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
deb0: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
dec0: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
ded0: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
dee0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
def0: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
df00: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
df10: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
df20: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
df30: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
df40: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
df50: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
df60: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
df70: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
df80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
df90: 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  e->pShm==0 );.  
dfa0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
dfb0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
dfc0: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  );.  do{.    rc 
dfd0: 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
dfe0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
dff0: 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
e000: 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
e010: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
e020: 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
e030: 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
e040: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
e050: 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
e060: 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
e070: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
e080: 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
e090: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
e0a0: 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
e0b0: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
e0c0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
e0d0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
e0e0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
e0f0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
e100: 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
e110: 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
e120: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
e130: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
e140: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
e150: 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
e160: 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
e170: 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20  ffffff .        
e180: 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
e190: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
e1a0: 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
e1b0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
e1c0: 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
e1d0: 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
e1e0: 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
e1f0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
e200: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
e210: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
e220: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
e230: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
e240: 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
e250: 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
e260: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 4f 70  "failed"));.  Op
e270: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
e280: 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
e290: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
e2a0: 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
e2b0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
e2c0: 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
e2d0: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
e300: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
e310: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
e320: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
e330: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
e340: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
e350: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
e360: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
e370: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
e380: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
e390: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
e3a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
e3b0: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
e3c0: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
e3d0: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
e3e0: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
e3f0: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
e400: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
e410: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
e420: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
e430: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
e440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e450: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
e460: 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
e470: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
e480: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
e490: 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
e4a0: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  fset */.){.  win
e4b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
e4c0: 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
e4d0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
e4e0: 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20   DWORD nRead;   
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
e510: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
e520: 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
e530: 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
e560: 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  trys */..  asser
e570: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
e580: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
e590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e5a0: 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
e5b0: 43 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63  CE(("READ %d loc
e5c0: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
e5d0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
e5e0: 70 65 29 29 3b 0a 0a 20 20 69 66 28 20 73 65 65  pe));..  if( see
e5f0: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
e600: 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72  offset) ){.    r
e610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
e620: 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
e630: 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
e640: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
e650: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20   &nRead, 0) ){. 
e660: 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
e670: 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74 72  no;.    if( retr
e680: 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
e690: 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
e6a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c  ntinue;.    pFil
e6b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
e6c0: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65  astErrno;.    re
e6d0: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
e6e0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  (SQLITE_IOERR_RE
e6f0: 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AD, pFile->lastE
e700: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
e710: 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
e720: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
e730: 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74  .  logIoerr(nRet
e740: 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  ry);.  if( nRead
e750: 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20  <(DWORD)amt ){. 
e760: 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
e770: 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
e780: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
e790: 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
e7a0: 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
e7b0: 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74  )[nRead], 0, amt
e7c0: 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65 74  -nRead);.    ret
e7d0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
e7e0: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
e7f0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
e800: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E_OK;.}../*.** W
e810: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
e820: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
e830: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
e840: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e850: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
e860: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
e870: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
e880: 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
e890: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
e8a0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
e8b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
e8c0: 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
e8d0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8f0: 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
e900: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
e910: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e930: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
e940: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
e950: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
e960: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
e970: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
e980: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
e990: 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
e9a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
e9d0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
e9e0: 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
e9f0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
ea00: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
ea10: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
ea20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
ea30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ea40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ea50: 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
ea60: 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
ea70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
ea80: 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
ea90: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
eaa0: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
eab0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
eac0: 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
ead0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
eae0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
eaf0: 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  TE %d lock=%d\n"
eb00: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
eb10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
eb20: 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69    rc = seekWinFi
eb30: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
eb40: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
eb50: 7b 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  {.    u8 *aRem =
eb60: 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
eb70: 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
eb80: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
eb90: 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
eba0: 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
ebb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ebc0: 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
ebd0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
ebe0: 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec00: 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
ec10: 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
ec20: 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
ec30: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
ec40: 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
ec50: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ec60: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
ec70: 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  */..    while( n
ec80: 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Rem>0 ){.      i
ec90: 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
eca0: 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
ecb0: 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30  nRem, &nWrite, 0
ecc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
ecd0: 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65   retryIoerr(&nRe
ece0: 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
ecf0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ed00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ed10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57    }.      if( nW
ed20: 72 69 74 65 3c 3d 30 20 29 20 62 72 65 61 6b 3b  rite<=0 ) break;
ed30: 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
ed40: 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
ed50: 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
ed60: 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
ed70: 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
ed80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
ed90: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
eda0: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
edb0: 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
edc0: 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
edd0: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
ede0: 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
edf0: 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
ee00: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ee10: 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
ee20: 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 72 65 74  LL )){.      ret
ee30: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
ee50: 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
ee60: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
ee70: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
ee80: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
ee90: 20 22 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69   "winWrite", pFi
eea0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
eeb0: 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72  lse{.    logIoer
eec0: 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20  r(nRetry);.  }. 
eed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eee0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
eef0: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
ef00: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
ef10: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
ef20: 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28  int winTruncate(
ef30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ef40: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
ef50: 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c  nByte){.  winFil
ef60: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
ef70: 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
ef80: 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20  e handle object 
ef90: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
efa0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
efb0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
efc0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ode for this fun
efd0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
efe0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
eff0: 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
f000: 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70  TE %d %lld\n", p
f010: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29  File->h, nByte))
f020: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
f030: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
f040: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
f050: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
f060: 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
f070: 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
f080: 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
f090: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
f0a0: 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
f0b0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
f0c0: 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
f0d0: 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
f0e0: 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
f0f0: 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
f100: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
f110: 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
f120: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
f130: 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
f140: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
f150: 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
f160: 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
f170: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
f180: 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
f190: 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
f1a0: 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hunk;.  }..  /* 
f1b0: 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72  SetEndOfFile() r
f1c0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
f1d0: 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c  when successful,
f1e0: 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74   or zero when it
f1f0: 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28   fails. */.  if(
f200: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
f210: 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  le, nByte) ){.  
f220: 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
f230: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
f240: 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
f250: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
f260: 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
f270: 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  ncate1", pFile->
f280: 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20  zPath);.  }else 
f290: 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f  if( 0==osSetEndO
f2a0: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
f2b0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
f2c0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f2d0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
f2e0: 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
f2f0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
f300: 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
f310: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f320: 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
f330: 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
f340: 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  ath);.  }..  OST
f350: 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
f360: 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70  %d %lld %s\n", p
f370: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
f380: 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
f390: 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
f3a0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
f3b0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
f3c0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
f3d0: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
f3e0: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
f3f0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
f400: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
f410: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
f420: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
f430: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
f440: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
f450: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
f460: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
f470: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
f480: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
f490: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
f4a0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
f4b0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
f4c0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
f4d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f4e0: 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
f4f0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
f500: 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
f510: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
f520: 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
f530: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
f540: 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
f550: 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
f560: 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
f570: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
f580: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
f590: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
f5a0: 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28   \.    (defined(
f5b0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
f5c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
f5d0: 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a  EBUG)).  /*.  **
f5e0: 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54   Used when SQLIT
f5f0: 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
f600: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20   defined and by 
f610: 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64  the assert() and
f620: 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45  /or.  ** OSTRACE
f630: 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f  () macros..   */
f640: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
f650: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
f660: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
f670: 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
f680: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
f690: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20  ( pFile );.  /* 
f6a0: 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
f6b0: 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
f6c0: 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
f6d0: 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
f6e0: 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
f6f0: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
f700: 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
f710: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
f720: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
f730: 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
f740: 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  YNC %d lock=%d\n
f750: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
f760: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
f770: 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
f780: 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
f790: 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
f7a0: 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
f7b0: 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
f7c0: 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
f7d0: 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
f7e0: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
f7f0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
f800: 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
f810: 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
f820: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
f830: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
f840: 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
f850: 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
f860: 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
f870: 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
f880: 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
f890: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
f8a0: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
f8b0: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
f8c0: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
f8d0: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
f8e0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
f8f0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
f900: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
f910: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
f920: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
f930: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72  _NO_SYNC.  retur
f940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
f950: 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73  se.  rc = osFlus
f960: 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69  hFileBuffers(pFi
f970: 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61  le->h);.  Simula
f980: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41  teIOError( rc=FA
f990: 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20  LSE );.  if( rc 
f9a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f9b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
f9c0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
f9d0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f9e0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
f9f0: 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
fa00: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
fa10: 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SYNC, pFile->las
fa20: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
fa30: 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
fa40: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
fa50: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
fa60: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
fa70: 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
fa80: 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
fa90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
faa0: 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
fab0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
fac0: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
fad0: 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
fae0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
faf0: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
fb00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
fb10: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
fb20: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fb30: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
fb40: 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23 69 66  OERR_FSTAT);.#if
fb50: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
fb60: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54  .  {.    FILE_ST
fb70: 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f  ANDARD_INFO info
fb80: 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46  ;.    if( osGetF
fb90: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
fba0: 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e  HandleEx(pFile->
fbb0: 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49  h, FileStandardI
fbc0: 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c            &info,
fbf0: 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29   sizeof(info)) )
fc00: 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
fc10: 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e   info.EndOfFile.
fc20: 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65  QuadPart;.    }e
fc30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
fc40: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
fc50: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
fc60: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
fc70: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
fc80: 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
fc90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
fcc0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
fcd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
fce0: 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
fcf0: 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44  upperBits;.    D
fd00: 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
fd10: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
fd20: 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42  rno;..    lowerB
fd30: 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53  its = osGetFileS
fd40: 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
fd50: 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a  pperBits);.    *
fd60: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
fd70: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
fd80: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
fd90: 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20  Bits;.    if(   
fda0: 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e  (lowerBits == IN
fdb0: 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29  VALID_FILE_SIZE)
fdc0: 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  .       && ((las
fdd0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
fde0: 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
fdf0: 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70  RROR) ){.      p
fe00: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fe10: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
fe20: 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
fe30: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
fe40: 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
fe50: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
fe60: 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
fe70: 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
fe80: 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
fe90: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
fea0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
feb0: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
fec0: 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
fed0: 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
fee0: 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
fef0: 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
ff00: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
ff10: 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
ff20: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
ff30: 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
ff40: 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
ff50: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
ff60: 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
ff70: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
ff80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
ff90: 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
ffa0: 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
ffb0: 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
ffc0: 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
ffd0: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
ffe0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
fff0: 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
10000 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
10010 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
10020 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
10030 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
10040 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
10050 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
10060 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
10070 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
10080 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
10090 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
100a0 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
100b0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
100c0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
100d0 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
100e0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
100f0 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
10100 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
10110 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
10120 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
10130 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
10140 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
10150 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
10160 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
10190 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
101a0 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
101b0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
101c0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
101d0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
101e0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
101f0 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
10200 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
10210 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
10220 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
10230 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
10240 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
10250 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
10260 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
10270 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
10280 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
10290 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
102a0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
102b0 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
102c0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
102d0 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
102e0 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
102f0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10300 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
10310 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
10320 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c  tic int getReadL
10330 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
10340 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
10350 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
10360 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
10370 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
10380 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
10390 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
103a0 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
103d0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
103e0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
103f0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
10400 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
10410 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
10420 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
10430 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10440 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
10450 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
10460 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
10470 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
10480 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70   = winLockFile(p
10490 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
104a0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
104d0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
104e0 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
104f0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
10500 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
10510 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
10520 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
10530 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
10540 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
10550 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
10560 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  k */.  }.  retur
10570 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
10580 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a  Undo a readlock.
10590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
105a0 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e  lockReadLock(win
105b0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
105c0 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44  int res;.  DWORD
105d0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
105e0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
105f0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
10600 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
10610 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
10620 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
10630 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
10640 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
10650 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
10660 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
10670 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
10680 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
10690 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
106a0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
106b0 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
106c0 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
106d0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
106e0 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
106f0 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
10700 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10710 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
10720 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10730 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
10740 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10750 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
10760 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  "unlockReadLock"
10770 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
10780 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
10790 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
107a0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
107b0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
107c0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
107d0 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
107e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
107f0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
10800 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
10810 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
10820 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
10830 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
10840 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
10850 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
10860 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
10870 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
10880 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
10890 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
108a0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
108b0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
108c0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
108d0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
108e0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
108f0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
10900 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
10910 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
10920 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
10930 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
10940 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
10950 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
10960 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
10970 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
10980 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
10990 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
109a0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
109b0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
109c0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
109d0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
109e0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
109f0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10a00 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
10a10 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10a20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10a30 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
10a40 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
10a50 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
10a60 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
10a70 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
10a80 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
10a90 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
10aa0 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
10ab0 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
10ac0 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
10ad0 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
10ae0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
10af0 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
10b00 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
10b10 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
10b20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
10b30 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
10b40 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
10b50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
10b60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10b70 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
10b80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10b90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
10ba0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
10bb0 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
10bc0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
10bd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
10be0 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
10bf0 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
10c00 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
10c10 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
10c20 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
10c30 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
10c40 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
10c50 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
10c60 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
10c70 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
10c80 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
10c90 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
10ca0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
10cb0 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
10cc0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
10cd0 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
10ce0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
10cf0 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25  RACE(("LOCK %d %
10d00 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c  d was %d(%d)\n",
10d10 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
10d20 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  e->h, locktype, 
10d30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
10d40 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
10d50 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20  ckByte));..  /* 
10d60 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
10d70 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
10d80 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
10d90 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
10da0 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
10db0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
10dc0 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
10dd0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
10de0 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
10df0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
10e00 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
10e10 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
10e20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
10e30 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
10e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10e50 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
10e60 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
10e70 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
10e80 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
10e90 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
10ea0 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
10eb0 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
10ec0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
10ed0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
10ee0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
10ef0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
10f00 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
10f10 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
10f20 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
10f30 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74   );..  /* Lock t
10f40 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
10f50 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20  byte if we need 
10f60 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e  to acquire a PEN
10f70 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a  DING lock or.  *
10f80 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  * a SHARED lock.
10f90 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75    If we are acqu
10fa0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
10fb0 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69  ock, the acquisi
10fc0 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65  tion of.  ** the
10fd0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
10fe0 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e  te is temporary.
10ff0 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74  .  */.  newLockt
11000 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
11010 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28  ktype;.  if(   (
11020 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
11030 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c  =NO_LOCK).     |
11040 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d  | (   (locktype=
11050 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
11060 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46  .         && (pF
11070 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ile->locktype==R
11080 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20  ESERVED_LOCK)). 
11090 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
110a0 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
110b0 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
110c0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46  = winLockFile(pF
110d0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
110e0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
11120 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
11130 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
11140 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
11150 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
11160 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
11170 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
11180 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
11190 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
111a0 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
111b0 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
111c0 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
111d0 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
111e0 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
111f0 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
11200 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
11210 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
11220 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
11230 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
11240 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
11250 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
11260 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
11270 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
11280 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63       OSTRACE(("c
11290 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
112a0 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
112b0 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20  =%d\n", cnt));. 
112c0 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
112d0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
112e0 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
112f0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
11300 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
11310 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
11320 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11330 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
11340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
11350 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
11360 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
11370 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
11380 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
11390 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
113a0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
113b0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65   );.    res = ge
113c0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
113d0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
113e0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
113f0 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
11400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11410 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
11420 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
11430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11440 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
11450 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
11460 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
11470 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
11480 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
11490 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
114a0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
114b0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
114c0 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
114d0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
114e0 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
114f0 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
11500 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
11510 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
11520 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
11530 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
11540 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
11550 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
11560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11570 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
11580 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
11590 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
115a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
115b0 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
115c0 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
115d0 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
115e0 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
115f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
11600 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
11610 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
11620 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
11630 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
11640 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
11650 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
11660 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
11670 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
11680 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
11690 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72     OSTRACE(("unr
116a0 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
116b0 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20   res));.    res 
116c0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46  = winLockFile(pF
116d0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
116e0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53  OCKFILE_FLAGS, S
116f0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11710 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
11720 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
11730 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
11740 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
11750 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
11760 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
11770 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11780 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
11790 53 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63  STRACE(("error-c
117a0 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c 61 73  ode = %d\n", las
117b0 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20  tErrno));.      
117c0 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
117d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
117e0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f   /* If we are ho
117f0 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20  lding a PENDING 
11800 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20  lock that ought 
11810 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20  to be released, 
11820 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73  then.  ** releas
11830 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
11840 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c   if( gotPendingL
11850 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  ock && locktype=
11860 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
11870 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
11880 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
11890 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
118a0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
118b0 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
118c0 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
118d0 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
118e0 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
118f0 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
11900 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
11910 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
11920 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
11930 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52   }else{.    OSTR
11950 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45  ACE(("LOCK FAILE
11960 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20  D %d trying for 
11970 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22  %d but got %d\n"
11980 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
11990 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c         locktype,
119a0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a   newLocktype));.
119b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
119c0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
119d0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
119e0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46  E_BUSY;.  }.  pF
119f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
11a00 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
11a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11a20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11a30 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
11a40 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
11a50 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
11a60 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
11a70 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
11a80 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
11a90 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
11aa0 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
11ab0 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
11ac0 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
11ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11ae0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11af0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11b00 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11b10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77  ){.  int rc;.  w
11b20 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
11b30 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
11b40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11b50 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11b60 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11b70 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
11b80 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
11b90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
11ba0 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
11bb0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
11bc0 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
11bd0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
11be0 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
11bf0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
11c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
11c10 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70   = winLockFile(p
11c20 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
11c30 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
11c40 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
11c50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
11c60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e   rc ){.      win
11c70 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
11c80 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
11c90 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
11ca0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
11cb0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
11cc0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11cd0 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
11ce0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
11cf0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
11d00 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
11d10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11d20 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
11d30 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
11d40 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
11d50 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
11d60 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
11d70 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
11d80 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
11d90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
11da0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
11db0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
11dc0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
11dd0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
11de0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
11df0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
11e00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11e10 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
11e20 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
11e30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
11e40 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
11e50 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
11e60 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
11e70 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11e80 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
11e90 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
11ea0 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
11eb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11ec0 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
11ed0 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
11ee0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11ef0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
11f00 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
11f10 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
11f20 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
11f30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11f40 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
11f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
11f60 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
11f70 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
11f80 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
11f90 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
11fa0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
11fb0 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
11fc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
11fd0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
11fe0 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
11ff0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
12000 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
12010 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
12020 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
12030 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
12040 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
12050 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
12060 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
12070 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
12080 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46   !getReadLock(pF
12090 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
120a0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
120b0 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
120c0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
120d0 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
120e0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
120f0 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
12100 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
12110 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12120 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73  UNLOCK, osGetLas
12130 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
12140 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
12150 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ock", pFile->zPa
12160 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  th);.    }.  }. 
12170 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52   if( type>=RESER
12180 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
12190 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46  winUnlockFile(pF
121a0 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
121b0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
121c0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
121d0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ype==NO_LOCK && 
121e0 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
121f0 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52  K ){.    unlockR
12200 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
12210 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
12220 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
12230 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
12240 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
12250 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
12260 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
12270 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
12280 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
12290 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
122a0 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
122b0 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
122c0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
122d0 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
122e0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
122f0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
12300 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
12310 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
12320 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
12330 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
12340 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
12350 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
12360 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
12370 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
12380 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
12390 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
123a0 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
123b0 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
123c0 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
123d0 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
123e0 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
123f0 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
12400 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
12410 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
12420 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
12430 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
12440 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
12450 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
12460 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
12470 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
12480 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
12490 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
124a0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
124b0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
124c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
124d0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
124e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
124f0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
12500 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
12510 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12520 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
12530 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
12540 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
12550 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
12560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12570 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
12580 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
12590 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
125a0 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
125b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
125c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
125d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
125e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
125f0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
12600 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
12610 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
12620 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
12630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12640 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
12650 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
12660 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  INT: {.      if(
12670 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
12680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
12690 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a  ite3_int64 oldSz
126a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
126b0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69   = winFileSize(i
126c0 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20  d, &oldSz);.    
126d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
126e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
126f0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
12700 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74   newSz = *(sqlit
12710 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
12720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65            if( ne
12730 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20  wSz>oldSz ){.   
12740 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
12750 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
12760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
12770 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
12780 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20  id, newSz);.    
12790 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
127a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
127b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
127c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
127d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
127e0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
127f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12800 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12810 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
12820 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  AL: {.      winM
12830 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
12840 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
12850 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
12860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12870 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12880 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
12890 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
128a0 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
128b0 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
128c0 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
128d0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
128e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
128f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
12900 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
12910 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
12920 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
12930 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
12940 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20 20  tf("win32");.   
12950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12960 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
12970 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
12980 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
12990 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
129a0 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
129b0 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
129c0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
129d0 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
129e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
129f0 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
12a00 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a 20  n32IoerrRetry;. 
12a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12a20 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[1]>0 ){.     
12a30 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
12a40 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
12a50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12a60 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33       a[1] = win3
12a70 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
12a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
12ac0 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
12ad0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
12ae0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
12af0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
12b00 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
12b10 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
12b20 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
12b30 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
12b40 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
12b50 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
12b60 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
12b70 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
12b80 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
12b90 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
12ba0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
12bb0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
12bc0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
12bd0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
12be0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
12bf0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
12c00 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
12c10 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
12c20 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
12c30 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
12c40 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
12c50 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
12c60 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
12c70 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
12c80 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
12c90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12ca0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
12cb0 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
12cc0 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
12cd0 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
12ce0 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
12cf0 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
12d00 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12d10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12d20 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
12d30 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
12d40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12d50 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
12d60 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
12d70 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
12d80 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
12d90 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
12da0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
12db0 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23  ERWRITE:0);.}..#
12dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12dd0 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57  IT_WAL../* .** W
12de0 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
12df0 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
12e00 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
12e10 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
12e20 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
12e30 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
12e40 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
12e50 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
12e60 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
12e70 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
12e80 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
12e90 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49  ize..*/.SYSTEM_I
12ea0 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a  NFO winSysInfo;.
12eb0 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
12ec0 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
12ed0 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
12ee0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
12ef0 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
12f00 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
12f10 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
12f20 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
12f30 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  s used by .** th
12f40 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
12f50 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
12f60 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
12f70 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
12f80 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
12f90 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
12fa0 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
12fb0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
12fc0 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
12fd0 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
12fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12ff0 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
13000 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
13010 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
13020 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
13030 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
13040 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
13050 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
13060 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
13070 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
13080 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
13090 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
130a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
130b0 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
130c0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
130d0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
130e0 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
130f0 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
13100 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
13110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13120 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
13130 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13140 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
13150 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
13160 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
13170 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
13180 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
13190 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
131a0 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
131b0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
131c0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
131d0 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
131e0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
131f0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
13200 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
13210 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
13220 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
13230 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
13240 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
13250 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
13260 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
13270 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
13280 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
13290 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
132a0 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
132b0 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
132c0 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
132d0 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
132e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
132f0 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
13300 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
13310 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
13320 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
13330 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
13340 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
13350 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
13360 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
13370 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
13380 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
13390 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
133a0 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
133b0 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
133c0 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pNext .**.** The
133d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
133e0 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
133f0 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
13400 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
13410 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
13420 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
13430 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53  *.** Either winS
13440 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
13450 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e  t be held or win
13460 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
13470 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  and.** winShmMut
13480 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
13490 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
134a0 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
134b0 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
134c0 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
134d0 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  *.*/.struct winS
134e0 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74  hmNode {.  sqlit
134f0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
13500 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
13510 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
13520 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
13530 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
13540 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13550 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  the file */.  wi
13560 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20  nFile hFile;    
13570 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
13580 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e   handle from win
13590 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73  Open */..  int s
135a0 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
135b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
135c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
135d0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
135e0 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
135f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13600 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
13610 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d   */.  struct Shm
13620 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e  Region {.    HAN
13630 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
13640 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
13650 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65  ndle from Create
13660 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20  FileMapping */. 
13670 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20     void *pMap;. 
13680 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44   } *aRegion;.  D
13690 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
136a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
136b0 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
136c0 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
136d0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74   error */..  int
136e0 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
136f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13700 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65  r of winShm obje
13710 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
13720 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
13730 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
13740 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53       /* All winS
13750 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
13760 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
13770 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
13780 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  xt;         /* N
13790 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  ext in list of a
137a0 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
137b0 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  jects */.#ifdef 
137c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
137d0 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
137e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
137f0 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53  t available winS
13800 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
13810 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
13820 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f  A global array o
13830 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
13840 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
13850 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  The winShmMutexH
13860 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
13870 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ue while reading
13880 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73   or writing this
13890 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
138a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e   winShmNode *win
138b0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b  ShmNodeList = 0;
138c0 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
138d0 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
138e0 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
138f0 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
13900 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
13910 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
13920 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
13930 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
13940 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
13950 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
13960 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
13970 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
13980 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
13990 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68  :.**.**    winSh
139a0 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20  m.pShmNode.**   
139b0 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a   winShm.id.**.**
139c0 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
139d0 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
139e0 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53  .  The winShm.pS
139f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75  hmNode->mutex mu
13a00 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
13a10 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
13a20 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
13a30 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  lds..*/.struct w
13a40 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d  inShm {.  winShm
13a50 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
13a60 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
13a70 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  rlying winShmNod
13a80 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69  e object */.  wi
13a90 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  nShm *pNext;    
13aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
13ab0 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65   winShm with the
13ac0 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65   same winShmNode
13ad0 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
13ae0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
13af0 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
13b00 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  ing the winShmNo
13b10 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
13b20 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
13b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
13b40 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
13b50 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
13b60 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
13b70 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
13b80 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
13b90 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
13ba0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
13bb0 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
13bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
13bd0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
13be0 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
13bf0 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
13c00 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
13c10 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
13c20 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
13c30 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
13c40 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
13c50 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
13c60 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
13c70 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
13c80 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
13c90 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
13ca0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
13cb0 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
13cc0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
13cd0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
13ce0 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
13cf0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
13d00 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
13d10 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
13d20 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
13d30 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
13d40 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
13d50 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
13d60 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
13d70 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
13d80 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
13d90 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
13da0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
13db0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
13dc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
13dd0 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
13de0 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
13df0 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
13e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13e10 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
13e20 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
13e30 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
13e40 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
13e50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13e60 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
13e70 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
13e80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
13e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13ea0 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
13eb0 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
13ec0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
13ed0 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
13ee0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
13ef0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
13f00 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
13f10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13f20 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
13f30 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
13f40 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
13f50 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
13f60 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
13f70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
13f80 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
13f90 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
13fa0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46  winUnlockFile(pF
13fb0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66  ile->hFile.h, of
13fc0 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
13fd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
13fe0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
13ff0 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
14000 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ers */.    DWORD
14010 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
14020 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
14030 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f  TELY;.    if( lo
14040 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
14050 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
14060 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
14070 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
14080 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
14090 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
140a0 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30  dwFlags, ofst, 0
140b0 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
140c0 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30  .  .  if( rc!= 0
140d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
140e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
140f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
14100 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
14110 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
14120 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14130 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
14140 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73  ("SHM-LOCK %d %s
14150 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20   %s 0x%08lx\n", 
14160 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
14170 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
14180 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
14190 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
141a0 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20  ailed",.        
141b0 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48     lockType==_SH
141c0 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63  M_UNLCK ? "Unloc
141d0 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b  kFileEx" : "Lock
141e0 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20  FileEx",.       
141f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14200 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72  rrno));..  retur
14210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
14220 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
14230 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
14240 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
14250 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
14260 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
14270 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
14280 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
14290 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
142a0 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
142b0 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
142c0 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
142d0 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
142e0 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
142f0 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
14300 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
14310 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
14320 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
14330 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
14340 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
14350 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
14360 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
14370 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
14380 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
14390 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
143a0 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
143b0 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
143c0 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
143d0 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c  mNode *p;.  BOOL
143e0 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20   bRc;.  assert( 
143f0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
14400 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  ) );.  pp = &win
14410 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
14420 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
14430 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
14440 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
14450 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
14460 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71  f( p->mutex ) sq
14470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
14480 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
14490 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
144a0 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
144b0 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55         bRc = osU
144c0 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
144d0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
144e0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
144f0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
14500 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67  pid-%d unmap reg
14510 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14530 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
14540 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a  ProcessId(), i,.
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
14570 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
14580 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
14590 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
145a0 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
145b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
145c0 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c  -PURGE pid-%d cl
145d0 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73  ose region=%d %s
145e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
145f0 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74        (int)osGet
14600 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14610 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  (), i,.         
14620 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f          bRc ? "o
14630 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
14640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14650 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
14660 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
14670 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20  VALUE ){.       
14680 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14690 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
146a0 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
146b0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
146c0 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  hFile);.        
146d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
146e0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
146f0 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65  }.      if( dele
14700 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  teFlag ){.      
14710 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14720 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
14730 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
14740 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14750 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74          winDelet
14760 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65  e(pVfs, p->zFile
14770 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
14780 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
14790 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
147a0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
147b0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
147c0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
147d0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
147e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
147f0 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  ->aRegion);.    
14800 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14810 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14820 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65      pp = &p->pNe
14830 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
14840 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
14850 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
14860 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
14870 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  th database file
14880 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   pDbFd..**.** Wh
14890 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
148a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
148b0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
148c0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
148d0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
148e0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
148f0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
14900 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
14910 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
14920 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
14930 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
14940 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
14950 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
14960 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14970 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  t winOpenSharedM
14980 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70  emory(winFile *p
14990 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
149a0 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
149b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
149c0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
149d0 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
149e0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
149f0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e *pShmNode = 0;
14a00 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
14a10 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
14a20 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14a50 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74  ult code */.  st
14a60 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
14a70 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
14a80 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
14a90 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ted winShmNode *
14aa0 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14ad0 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73  f zName in bytes
14ae0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
14af0 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
14b00 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69      /* Not previ
14b10 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a  ously opened */.
14b20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
14b30 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
14b40 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a   sqlite3_shm obj
14b50 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75  ect.  Also specu
14b60 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c  latively.  ** al
14b70 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
14b80 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64   a new winShmNod
14b90 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a  e and filename..
14ba0 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
14bb0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
14bc0 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
14bd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14be0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
14bf0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
14c00 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e  sizeof(*p));.  n
14c10 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
14c20 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
14c30 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
14c40 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
14c50 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
14c60 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b   + nName + 17 );
14c70 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
14c80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
14c90 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
14ca0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
14cb0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
14cc0 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
14cd0 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4e 61 6d  of(*pNew) + nNam
14ce0 65 20 2b 20 31 37 29 3b 0a 20 20 70 4e 65 77 2d  e + 17);.  pNew-
14cf0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
14d00 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
14d10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
14d20 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
14d30 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
14d40 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
14d50 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
14d60 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
14d70 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
14d80 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a  ilename); ..  /*
14d90 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
14da0 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
14db0 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ting winShmNode 
14dc0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
14dd0 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  ** If no mat
14de0 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  ching winShmNode
14df0 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
14e00 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  s, create a new 
14e10 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53  one..  */.  winS
14e20 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
14e30 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d    for(pShmNode =
14e40 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
14e50 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e   pShmNode; pShmN
14e60 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e  ode=pShmNode->pN
14e70 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44  ext){.    /* TBD
14e80 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70   need to come up
14e90 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74   with better mat
14ea0 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70  ch here.  Perhap
14eb0 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c  s.    ** use FIL
14ec0 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e  E_ID_BOTH_DIR_IN
14ed0 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20  FO Structure..  
14ee0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
14ef0 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d  ite3StrICmp(pShm
14f00 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
14f10 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
14f20 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
14f30 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
14f40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14f50 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
14f60 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  lse{.    pShmNod
14f70 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e  e = pNew;.    pN
14f80 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69  ew = 0;.    ((wi
14f90 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64  nFile*)(&pShmNod
14fa0 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20  e->hFile))->h = 
14fb0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
14fc0 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  ALUE;.    pShmNo
14fd0 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53  de->pNext = winS
14fe0 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20  hmNodeList;.    
14ff0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
15000 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20   pShmNode;..    
15010 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
15020 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
15030 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
15040 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
15050 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
15060 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
15070 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
15080 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
15090 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
150a0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
150b0 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
150c0 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
150d0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
150e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
150f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
15100 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
15110 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
15120 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
15130 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
15140 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
15150 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
15180 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
15190 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
151a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f  E_OPEN_CREATE, /
151b0 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  * Mode flags */.
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
151e0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
151f0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
15200 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
15210 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
15220 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
15230 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
15240 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
15250 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
15260 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
15270 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
15280 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
15290 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
152a0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
152b0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
152c0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
152d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
152e0 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
152f0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
15300 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
15310 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
15320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15330 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15340 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15350 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
15360 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
15370 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
15380 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d       "winOpenShm
15390 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
153a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
153b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
153c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
153d0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
153e0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
153f0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
15400 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  S, 1);.      rc 
15410 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
15420 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
15430 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
15440 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
15450 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
15460 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
15470 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
15480 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
15490 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
154a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
154b0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
154c0 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
154d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
154e0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
154f0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
15500 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
15510 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
15520 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
15530 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
15540 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
15550 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
15560 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
15570 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
15580 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
15590 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
155a0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
155b0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
155c0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
155d0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
155e0 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
155f0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
15600 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
15610 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
15620 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
15630 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
15640 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
15650 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
15660 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
15670 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
15680 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
15690 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
156a0 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
156b0 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
156c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
156d0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
156e0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
156f0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
15700 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
15710 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
15720 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
15730 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
15740 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
15750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15760 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
15770 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
15780 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
15790 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
157a0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
157b0 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
157c0 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d  MS, 1);.  winShm
157d0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
157e0 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54  s, 0);      /* T
157f0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
15800 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
15810 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
15820 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  _free(p);.  sqli
15830 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
15840 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
15850 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
15860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
15870 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
15880 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
15890 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
158a0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
158b0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
158c0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
158d0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
158e0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
158f0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
15900 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
15910 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
15920 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
15930 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
15940 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
15950 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
15960 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
15970 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
15980 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
15990 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
159a0 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
159b0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
159c0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
159d0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
159e0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
159f0 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
15a00 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
15a10 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
15a20 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
15a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
15a40 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
15a50 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
15a60 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
15a70 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
15a80 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
15a90 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
15aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15ab0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
15ac0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
15ad0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
15ae0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
15af0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
15b00 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
15b10 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
15b20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15b30 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
15b40 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
15b50 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
15b60 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
15b70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
15b80 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
15b90 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
15ba0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
15bb0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
15bc0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
15bd0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
15be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15bf0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
15c00 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
15c10 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
15c20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
15c30 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
15c40 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
15c50 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
15c60 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
15c70 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
15c80 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
15c90 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
15ca0 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
15cb0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
15cc0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
15cd0 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
15ce0 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
15cf0 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
15d00 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
15d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15d30 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
15d40 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
15d50 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
15d60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
15d70 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
15d80 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
15d90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
15da0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
15db0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
15dc0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15de0 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
15df0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
15e00 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15e30 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
15e40 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
15e50 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
15e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
15e70 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
15e80 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
15e90 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
15ea0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
15eb0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
15ec0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
15ed0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
15ee0 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
15ef0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
15f00 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
15f10 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
15f20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
15f30 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15f60 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
15f70 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
15f80 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
15f90 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
15fa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15fc0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
15fd0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
15fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16000 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
16010 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
16020 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
16030 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
16040 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
16050 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16060 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
16070 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
16080 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
16090 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
160a0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
160b0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
160c0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
160d0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
160e0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
160f0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
16100 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
16110 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
16120 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
16130 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
16140 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
16150 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
16160 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
16170 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
16180 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
16190 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
161a0 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
161b0 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
161c0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
161d0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
161e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
161f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
16200 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
16210 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
16220 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
16230 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
16240 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
16250 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
16260 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
16270 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
16280 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
16290 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
162a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
162b0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
162c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
162d0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
162e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
162f0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
16300 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
16310 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
16320 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
16330 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
16340 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
16350 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
16360 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
16370 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
16380 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
16390 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
163a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
163b0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
163c0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
163d0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
163e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
163f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
16400 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
16410 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
16420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
16440 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
16450 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
16460 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
16470 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
16480 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
16490 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
164a0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
164b0 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
164c0 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
164d0 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
164e0 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
164f0 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
16500 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
16510 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
16520 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
16530 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
16540 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
16550 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
16560 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
16570 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
16580 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
16590 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
165a0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
165b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
165c0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
165d0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
165e0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
165f0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
16600 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16610 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
16620 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16630 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
16640 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
16650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
16660 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
16670 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
16680 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
16690 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
166a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
166b0 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
166c0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
166d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
166e0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
166f0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
16700 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
16710 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
16720 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16730 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16740 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
16750 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
16760 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
16770 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
16780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16790 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
167a0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
167b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
167c0 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
167d0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
167e0 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
167f0 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
16800 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
16810 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
16820 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
16830 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
16840 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
16850 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
16860 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
16870 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
16880 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
16890 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
168a0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
168b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
168c0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
168d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
168e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
168f0 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
16900 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
16910 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
16920 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
16930 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
16940 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
16950 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
16960 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
16970 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
16980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16990 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
169a0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
169b0 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  , _SHM_WRLCK, of
169c0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
169d0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
169e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
169f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16a00 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
16a10 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
16a20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
16a30 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
16a40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
16a50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16a60 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
16a70 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
16a80 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
16a90 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
16aa0 33 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20  3x,%03x %s\n",. 
16ab0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
16ac0 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
16ad0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
16ae0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
16af0 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20  >exclMask,.     
16b00 20 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c        rc ? "fail
16b10 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
16b20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16b30 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
16b40 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
16b50 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
16b60 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
16b70 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
16b80 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
16b90 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
16ba0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
16bb0 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
16bc0 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
16bd0 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
16be0 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
16bf0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42  tic void winShmB
16c00 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
16c10 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
16c20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16c30 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
16c40 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
16c50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16c60 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d  ER(fd);.  /* Mem
16c70 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f  oryBarrier(); //
16c80 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d   does not work -
16c90 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68  - do not know wh
16ca0 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68  y not */.  winSh
16cb0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
16cc0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
16cd0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  x();.}../*.** Th
16ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
16cf0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
16d00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
16d10 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
16d20 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
16d30 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
16d40 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
16d50 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
16d60 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
16d70 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
16d80 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
16d90 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
16da0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
16db0 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
16dc0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
16dd0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
16de0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
16df0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16e00 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
16e10 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
16e20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
16e30 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d  he isWrite param
16e40 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
16e50 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
16e60 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
16e70 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
16e80 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
16e90 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
16ea0 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
16eb0 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
16ec0 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
16ed0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
16ee0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
16ef0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
16f00 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  ** isWrite is no
16f10 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
16f20 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
16f30 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
16f40 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
16f50 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
16f60 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
16f70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
16f80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
16f90 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
16fa0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
16fb0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
16fc0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
16fd0 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
16fe0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
16ff0 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
17000 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
17010 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
17020 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
17030 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
17040 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
17050 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
17060 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
17070 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
17080 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
17090 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
170a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
170b0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
170c0 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
170d0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
170e0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
170f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
17100 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
17110 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
17120 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
17150 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
17160 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
17170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
17180 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
17190 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
171a0 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
171b0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
171c0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
171d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
171e0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
171f0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
17200 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62   winShm *p = pDb
17210 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53  Fd->pShm;.  winS
17220 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
17230 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
17240 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
17250 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  p ){.    rc = wi
17260 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
17270 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
17280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17290 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
172a0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
172b0 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65  ;.  }.  pShmNode
172c0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
172d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
172e0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
172f0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
17300 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
17310 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
17320 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
17330 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
17340 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
17350 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
17360 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65      struct ShmRe
17370 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20  gion *apNew;    
17380 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52         /* New aR
17390 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
173a0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
173b0 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
173c0 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
173d0 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
173e0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
173f0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20  ite3_int64 sz;  
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
17420 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  of wal-index fil
17430 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  e */..    pShmNo
17440 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
17450 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a  zRegion;..    /*
17460 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
17470 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
17480 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
17490 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
174a0 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68  space..    ** Ch
174b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
174c0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
174d0 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
174e0 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
174f0 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  is.    ** large 
17500 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
17510 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
17520 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a  region)..    */.
17530 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
17540 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
17550 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
17560 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
17570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
17590 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
175a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
175b0 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
175c0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
175d0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
175e0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
175f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
17600 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
17610 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
17620 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
17630 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
17640 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
17650 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
17660 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
17670 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
17680 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
17690 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
176a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
176b0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
176c0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
176d0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
176e0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
176f0 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
17700 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
17710 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
17720 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
17730 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
17740 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
17750 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
17760 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
17770 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
17780 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
17790 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
177a0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
177b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
177c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
177d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
177e0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
177f0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
17800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17810 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20    "winShmMap2", 
17820 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
17830 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
17840 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
17850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
17860 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
17870 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
17880 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
17890 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
178a0 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
178b0 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69   (struct ShmRegi
178c0 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  on *)sqlite3_rea
178d0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
178e0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c  hmNode->aRegion,
178f0 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
17900 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20  eof(apNew[0]).  
17910 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
17920 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
17930 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
17940 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
17950 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
17960 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
17970 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  ->aRegion = apNe
17980 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  w;..    while( p
17990 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
179a0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
179b0 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
179d0 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68  * file-mapping h
179e0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76  andle */.      v
179f0 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20  oid *pMap = 0;  
17a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
17a10 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  pped memory regi
17a20 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20  on */.     .    
17a30 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
17a40 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53  eFileMappingW(pS
17a50 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
17a60 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c   .          NULL
17a70 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
17a80 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
17a90 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
17aa0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
17ab0 50 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20  P pid-%d create 
17ac0 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d  region=%d nbyte=
17ad0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
17ae0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
17af0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
17b00 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
17b10 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
17b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b30 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
17b40 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
17b50 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
17b60 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
17b70 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
17b80 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
17b90 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
17ba0 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
17bb0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
17bc0 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
17bd0 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
17be0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
17bf0 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
17c00 69 65 77 4f 66 46 69 6c 65 45 78 28 68 4d 61 70  iewOfFileEx(hMap
17c10 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
17c20 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
17c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
17c40 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
17c50 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
17c60 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
17c70 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 29  , NULL.        )
17c80 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
17c90 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
17ca0 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
17cb0 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
17cc0 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
17cd0 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
17ce0 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
17cf0 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
17d00 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
17d10 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
17d20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17d30 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d  SHM-MAP pid-%d m
17d40 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66  ap region=%d off
17d50 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25  set=%d size=%d %
17d60 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
17d70 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
17d80 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
17d90 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
17da0 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17dc0 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
17dd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
17de0 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
17df0 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
17e00 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
17e10 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
17e20 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
17e30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
17e40 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
17e50 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
17e60 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
17e70 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
17e80 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
17e90 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
17ea0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
17eb0 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
17ec0 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
17ed0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
17ee0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
17ef0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
17f00 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
17f10 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
17f20 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
17f30 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
17f40 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
17f50 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
17f60 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
17f70 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
17f80 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
17f90 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
17fa0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
17fb0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
17fc0 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
17fd0 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
17fe0 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
17ff0 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
18000 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
18010 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
18020 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
18030 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
18040 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
18050 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
18060 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
18070 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
18080 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
18090 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
180a0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
180b0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
180c0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
180d0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
180e0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
180f0 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
18100 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
18110 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
18120 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
18130 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
18140 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18150 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
18160 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
18170 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
18180 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
18190 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
181a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181b0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
181c0 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
181d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
181f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
18240 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
18250 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
18260 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
18270 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
18280 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
18290 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
182a0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
182b0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
182c0 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c  oMethod = {.  2,
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
182f0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
18300 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18320 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
18330 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
18340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18350 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
18360 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
18370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
18380 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
18390 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
183a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
183b0 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
183c0 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
183e0 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
183f0 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
18400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
18410 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
18420 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18440 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
18450 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
18460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
18470 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
18480 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
18490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
184a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
184b0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
184c0 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
184d0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
184e0 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
184f0 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
18500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
18510 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
18520 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
18530 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
18540 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
18550 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
18560 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18580 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
18590 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185b0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
185c0 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
185e0 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
185f0 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  .  winShmUnmap  
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
18620 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  */.};../********
18630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18670 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
186a0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
186b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186c0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
186d0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
186e0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
186f0 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
18700 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
18710 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
18720 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
18730 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
18740 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
18750 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
18760 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
18770 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
18780 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
18790 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
187a0 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
187b0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
187c0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
187d0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
187e0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
187f0 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76  tatic void *conv
18800 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
18810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
18820 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
18830 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
18840 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
18850 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
18860 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
18870 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
18880 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
18890 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
188a0 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
188b0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
188c0 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
188d0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
188e0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
188f0 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
18900 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
18910 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
18920 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ted;.}../*.** Cr
18930 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
18940 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
18950 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
18960 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
18970 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d  ** hold at pVfs-
18980 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72  >mxPathname char
18990 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
189a0 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
189b0 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
189c0 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
189d0 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
189e0 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
189f0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
18a00 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
18a10 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
18a20 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
18a30 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69  789";.  size_t i
18a40 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  , j;.  char zTem
18a50 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 32  pPath[MAX_PATH+2
18a60 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ];..  /* It's od
18a70 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
18a80 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
18a90 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
18aa0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
18ab0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
18ac0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
18ad0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
18ae0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
18af0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
18b00 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
18b10 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18b30 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  ERR );..  memset
18b40 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 4d  (zTempPath, 0, M
18b50 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20 69  AX_PATH+2);..  i
18b60 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
18b70 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
18b80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18b90 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
18ba0 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
18bb0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
18bc0 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69 66  ectory);.  }.#if
18bd0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
18be0 54 0a 20 20 65 6c 73 65 20 69 66 28 20 69 73 4e  T.  else if( isN
18bf0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
18c00 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48  *zMulti;.    WCH
18c10 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58  AR zWidePath[MAX
18c20 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65  _PATH];.    osGe
18c30 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50  tTempPathW(MAX_P
18c40 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74  ATH-30, zWidePat
18c50 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d  h);.    zMulti =
18c60 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
18c70 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
18c80 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
18c90 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
18ca0 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
18cb0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
18cc0 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
18cd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
18ce0 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ulti);.    }else
18cf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18d00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
18d10 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  M;.    }.  }.#if
18d20 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
18d30 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
18d40 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66  {.    char *zUtf
18d50 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63  8;.    char zMbc
18d60 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  sPath[MAX_PATH];
18d70 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61  .    osGetTempPa
18d80 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  thA(MAX_PATH-30,
18d90 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20   zMbcsPath);.   
18da0 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33   zUtf8 = sqlite3
18db0 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
18dc0 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a  tf8(zMbcsPath);.
18dd0 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
18de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
18df0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
18e00 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
18e10 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
18e20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18e30 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
18e40 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
18e50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
18e60 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
18e70 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
18e80 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
18e90 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
18ea0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
18eb0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
18ec0 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
18ed0 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
18ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
18ef0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
18f00 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
18f10 30 28 7a 54 65 6d 70 50 61 74 68 29 20 2b 20 73  0(zTempPath) + s
18f20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
18f30 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
18f40 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
18f50 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74   nBuf ){.    ret
18f60 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
18f70 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73  ;.  }..  for(i=s
18f80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18f90 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26  TempPath); i>0 &
18fa0 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d  & zTempPath[i-1]
18fb0 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20  =='\\'; i--){}. 
18fc0 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20   zTempPath[i] = 
18fd0 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0;..  sqlite3_sn
18fe0 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20  printf(nBuf-18, 
18ff0 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20  zBuf,.          
19000 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53           "%s\\"S
19010 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
19020 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74  PREFIX, zTempPat
19030 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65  h);.  j = sqlite
19040 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
19050 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
19060 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
19070 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  j]);.  for(i=0; 
19080 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
19090 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28  .    zBuf[j] = (
190a0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
190b0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
190c0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
190d0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a  hars)-1) ];.  }.
190e0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
190f0 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
19100 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
19110 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e  P FILENAME: %s\n
19120 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74  ", zBuf));.  ret
19130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
19140 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
19150 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
19160 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
19170 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19180 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ,        /* Not 
19190 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
191a0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
191b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
191c0 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
191d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
191e0 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
191f0 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69  * Write the SQLi
19200 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68  te file handle h
19210 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
19220 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
19230 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20     /* Open mode 
19240 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
19250 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
19260 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72       /* Status r
19270 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29  eturn flags */.)
19280 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
19290 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
192a0 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
192b0 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
192c0 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
192d0 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
192e0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
192f0 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
19300 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
19310 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
19320 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
19330 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
19340 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
19350 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
19360 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
19370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19380 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
19390 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
193a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
193b0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
193c0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
193d0 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
193e0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
193f0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
19400 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
19410 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
19420 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
19430 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
19440 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
19450 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
19460 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
19470 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
19480 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
19490 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20  e[MAX_PATH+2];  
194a0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
194b0 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70  d to create temp
194c0 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20   filename */..  
194d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
194e0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
194f0 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
19500 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
19510 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
19520 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
19530 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
19540 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
19550 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
19560 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
19570 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
19580 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
19590 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
195a0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
195b0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
195c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
195d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
195e0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
195f0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
19600 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
19610 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65 66  CREATE);.#ifndef
19620 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
19630 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
19640 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
19650 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e  N_READONLY);.#en
19660 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61 64  dif.  int isRead
19670 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
19680 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
19690 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
196a0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
196b0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
196c0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
196d0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
196e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
196f0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
19700 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
19710 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
19720 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
19730 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
19740 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
19750 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
19760 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
19770 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
19780 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
19790 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
197a0 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
197b0 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
197c0 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
197d0 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
197e0 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
197f0 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
19800 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
19810 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
19820 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
19830 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
19840 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
19850 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
19860 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
19870 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
19880 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
19890 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
198a0 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
198b0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
198c0 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
198d0 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
198e0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
198f0 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
19900 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
19910 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
19920 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
19930 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
19940 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
19950 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
19960 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
19970 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
19980 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19990 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
199a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
199b0 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
199c0 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
199d0 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
199e0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
199f0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
19a00 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
19a10 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
19a20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
19a30 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
19a40 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
19a50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
19a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
19a70 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
19a80 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
19a90 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
19aa0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
19ab0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
19ac0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
19ad0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
19ae0 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
19af0 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
19b00 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
19b10 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
19b20 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
19b30 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
19b40 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
19b50 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
19b60 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
19b70 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
19b80 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
19b90 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
19ba0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
19bb0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
19bc0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
19bd0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
19be0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
19bf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
19c00 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
19c10 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
19c20 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
19c30 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
19c40 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
19c50 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
19c60 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
19c70 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
19c80 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
19c90 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
19ca0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
19cb0 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E;..  /* If the 
19cc0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19cd0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
19ce0 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61   is NULL, genera
19cf0 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  te a .  ** tempo
19d00 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
19d10 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66  o use .  */.  if
19d20 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
19d30 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
19d40 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
19d50 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d  urnal);.    rc =
19d60 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58   getTempname(MAX
19d70 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d  _PATH+2, zTmpnam
19d80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
19d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19da0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19db0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
19dc0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
19dd0 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
19de0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
19df0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
19e00 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
19e10 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
19e20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
19e30 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
19e40 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
19e50 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
19e60 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
19e70 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
19e80 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
19e90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
19ea0 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
19eb0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
19ec0 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e  |.        zUtf8N
19ed0 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38  ame[strlen(zUtf8
19ee0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
19ef0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
19f00 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65   filename to the
19f10 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67   system encoding
19f20 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65  . */.  zConverte
19f30 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
19f40 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
19f50 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
19f60 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
19f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19f80 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
19f90 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
19fa0 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
19fb0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
19fc0 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
19fd0 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
19fe0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
19ff0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
1a000 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
1a010 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1a020 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
1a030 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
1a040 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
1a050 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
1a060 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
1a070 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
1a080 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
1a090 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
1a0a0 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
1a0b0 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
1a0c0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
1a0d0 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
1a0e0 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
1a0f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1a100 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
1a110 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1a120 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
1a130 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
1a140 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1a150 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
1a160 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
1a170 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
1a180 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
1a190 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
1a1a0 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
1a1b0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1a1c0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
1a1d0 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
1a1e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
1a1f0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
1a200 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
1a210 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
1a220 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
1a230 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
1a240 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
1a250 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
1a260 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
1a270 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
1a280 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
1a290 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
1a2a0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1a2b0 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
1a2c0 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
1a2d0 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
1a2e0 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
1a2f0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
1a300 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
1a310 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
1a340 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
1a370 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
1a380 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
1a390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
1a3a0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1a3b0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
1a3c0 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
1a3d0 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
1a3e0 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
1a3f0 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
1a400 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
1a410 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
1a420 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
1a430 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
1a440 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
1a450 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1a460 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
1a470 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
1a480 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1a490 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
1a4a0 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
1a4b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1a4c0 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c  RT.    CREATEFIL
1a4d0 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
1a4e0 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50  METERS extendedP
1a4f0 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65  arameters;.    e
1a500 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1a510 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f  s.dwSize = sizeo
1a520 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  f(CREATEFILE2_EX
1a530 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
1a540 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  S);.    extended
1a550 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
1a560 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20  eAttributes =.  
1a570 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
1a580 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
1a590 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1a5a0 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
1a5b0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
1a5c0 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61  ileFlags = dwFla
1a5d0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
1a5e0 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  & FILE_FLAG_MASK
1a5f0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1a600 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72  rameters.dwSecur
1a610 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45  ityQosFlags = SE
1a620 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53  CURITY_ANONYMOUS
1a630 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1a640 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72  rameters.lpSecur
1a650 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20  ityAttributes = 
1a660 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64  NULL;.    extend
1a670 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65  edParameters.hTe
1a680 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c  mplateFile = NUL
1a690 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  L;.    while( (h
1a6a0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
1a6b0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1a6c0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
1a6f0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1a740 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1a750 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a770 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
1a780 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49  meters))==INVALI
1a790 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1a7a0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1a7d0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
1a7e0 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
1a7f0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
1a800 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
1a810 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
1a840 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
1a870 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
1a8a0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
1a8d0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1a8e0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
1a910 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
1a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a940 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1a950 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
1a960 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
1a970 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1a980 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1a990 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
1a9a0 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c  osCreateFileA((L
1a9b0 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  PCSTR)zConverted
1a9c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
1a9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1aa10 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
1aa20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1aa50 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
1aa80 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
1aab0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
1aac0 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72         retryIoer
1aaf0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1ab00 6e 6f 29 20 29 7b 7d 0a 20 20 7d 0a 23 65 6e 64  no) ){}.  }.#end
1ab10 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  if.  logIoerr(cn
1ab20 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  t);..  OSTRACE((
1ab30 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25 6c  "OPEN %d %s 0x%l
1ab40 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  x %s\n", .      
1ab50 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64       h, zName, d
1ab60 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
1ab70 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d 49  .           h==I
1ab80 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1ab90 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  LUE ? "failed" :
1aba0 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20   "ok"));..  if( 
1abb0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
1abc0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70  E_VALUE ){.    p
1abd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1abe0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
1abf0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ac00 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46  ITE_CANTOPEN, pF
1ac10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
1ac20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38  "winOpen", zUtf8
1ac30 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1ac40 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1ac50 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  ed);.    if( isR
1ac60 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
1ac70 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
1ac80 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
1ac90 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
1aca0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1acb0 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
1acc0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28  PEN_READONLY)&~(
1acd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ace0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
1acf0 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74  EADWRITE)), pOut
1ad00 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
1ad10 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1ad20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1ad30 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
1ad40 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
1ad50 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
1ad60 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
1ad70 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
1ad80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1ad90 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
1ada0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
1adb0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
1adc0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
1add0 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   }..  memset(pFi
1ade0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
1adf0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
1ae00 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
1ae10 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
1ae20 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65  ->h = h;.  pFile
1ae30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
1ae40 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
1ae50 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
1ae60 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b  pFile->pShm = 0;
1ae70 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
1ae80 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73  = zName;.  if( s
1ae90 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
1aea0 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22  an(zName, "psow"
1aeb0 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
1aec0 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
1aed0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1aee0 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
1aef0 5f 50 53 4f 57 3b 0a 20 20 7d 0a 0a 23 69 66 20  _PSOW;.  }..#if 
1af00 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1af10 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
1af20 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
1af30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
1af40 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65         && !wince
1af50 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
1af60 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20  , pFile).  ){.  
1af70 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
1af80 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
1af90 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1afa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1afb0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1afc0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  T;.  }.  if( isT
1afd0 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
1afe0 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
1aff0 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
1b000 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b010 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1b020 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1b030 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74    }..  OpenCount
1b040 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
1b050 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
1b060 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
1b070 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
1b080 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65  that Windows doe
1b090 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
1b0a0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
1b0b0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
1b0c0 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
1b0d0 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
1b0e0 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
1b0f0 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
1b100 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
1b110 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
1b120 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
1b130 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
1b140 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
1b150 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73  whatever it does
1b160 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74  .  While this ot
1b170 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1b180 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  olding the.** fi
1b190 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c  le open, we will
1b1a0 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   be unable to de
1b1b0 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72  lete it.  To wor
1b1c0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a  k around this.**
1b1d0 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c   problem, we del
1b1e0 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  ay 100 milliseco
1b1f0 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64  nds and try to d
1b200 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70  elete again.  Up
1b210 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49  .** to MX_DELETI
1b220 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65  ON_ATTEMPTs dele
1b230 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72  tion attempts ar
1b240 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76  e run before giv
1b250 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65  ing.** up and re
1b260 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
1b270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b280 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
1b290 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1b2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
1b2b0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
1b2c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b2d0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
1b2e0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
1b2f0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
1b300 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
1b310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
1b320 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
1b330 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
1b340 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1b350 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1b360 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1b370 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
1b380 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1b390 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b3a0 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
1b3b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
1b3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b3d0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43  RR_DELETE);.  zC
1b3e0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1b3f0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1b400 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1b410 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1b420 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b430 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b440 0a 20 20 7d 0a 20 20 72 63 20 3d 20 31 3b 0a 20  .  }.  rc = 1;. 
1b450 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
1b460 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b470 52 54 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  RT.    WIN32_FIL
1b480 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
1b490 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
1b4a0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
1b4b0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
1b4c0 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
1b4d0 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74  ile( osGetFileAt
1b4e0 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e  tributesExW(zCon
1b4f0 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45  verted, GetFileE
1b500 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b530 20 26 73 41 74 74 72 44 61 74 61 29 20 26 26 0a   &sAttrData) &&.
1b540 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
1b550 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1b560 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64  utesW(zConverted
1b570 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  )!=INVALID_FILE_
1b580 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 23 65  ATTRIBUTES &&.#e
1b590 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 28 72  ndif.         (r
1b5a0 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  c = osDeleteFile
1b5b0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d  W(zConverted))==
1b5c0 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  0 && retryIoerr(
1b5d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1b5e0 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72  ) ){}.    rc = r
1b5f0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  c ? SQLITE_OK : 
1b600 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b610 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1b620 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1b630 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
1b640 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  ( osGetFileAttri
1b650 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65  butesA(zConverte
1b660 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  d)!=INVALID_FILE
1b670 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
1b680 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f 73          (rc = os
1b690 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e  DeleteFileA(zCon
1b6a0 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20 72  verted))==0 && r
1b6b0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1b6c0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
1b6d0 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51      rc = rc ? SQ
1b6e0 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
1b6f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64  _ERROR;.  }.#end
1b700 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  if.  if( rc ){. 
1b710 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1b720 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1b730 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72  _DELETE, lastErr
1b740 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1b750 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
1b760 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
1b770 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  e{.    logIoerr(
1b780 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  cnt);.  }.  sqli
1b790 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1b7a0 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
1b7b0 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20  ("DELETE \"%s\" 
1b7c0 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
1b7d0 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22  , (rc ? "failed"
1b7e0 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72   : "ok" )));.  r
1b7f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b800 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
1b810 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stance and statu
1b820 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
1b830 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
1b840 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
1b850 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1b860 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
1b870 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
1b880 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1b890 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
1b8a0 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
1b8b0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
1b8e0 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
1b8f0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
1b900 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
1b910 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
1b920 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
1b930 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
1b940 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
1b950 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64  astErrno;.  void
1b960 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
1b970 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b980 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c  (pVfs);..  Simul
1b990 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1b9a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1b9b0 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f  ACCESS; );.  zCo
1b9c0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
1b9d0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
1b9e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1b9f0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1ba00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ba10 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1ba20 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
1ba30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
1ba40 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
1ba50 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
1ba60 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
1ba70 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
1ba80 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
1ba90 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
1baa0 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
1bab0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1bac0 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
1bad0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
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 47 65 74 46 69 6c 65 45 78         GetFileEx
1bb00 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20  InfoStandard, . 
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
1bb30 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74 72  trData)) && retr
1bb40 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1bb50 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
1bb60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1bb70 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
1bb80 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
1bb90 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
1bba0 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
1bbb0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
1bbc0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
1bbd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1bbe0 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
1bbf0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1bc00 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
1bc10 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
1bc20 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20  SizeHigh==0 .   
1bc30 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
1bc40 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
1bc50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1bc60 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
1bc70 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
1bc80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bc90 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
1bca0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
1bcb0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
1bcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bcd0 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
1bce0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
1bcf0 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
1bd00 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
1bd10 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
1bd20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1bd30 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
1bd40 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69  "winAccess", zFi
1bd50 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
1bd60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1bd70 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
1bd80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bd90 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
1bda0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bdb0 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
1bdc0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1bdd0 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
1bde0 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
1bdf0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1be00 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
1be10 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
1be20 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
1be30 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
1be40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
1be50 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1be60 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
1be70 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
1be80 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1be90 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
1bea0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1beb0 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
1bec0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
1bed0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
1bee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bef0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1bf00 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
1bf10 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
1bf20 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1bf30 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
1bf40 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
1bf50 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
1bf60 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
1bf70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
1bf80 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
1bf90 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
1bfa0 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
1bfb0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
1bfc0 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rc;.  return SQL
1bfd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1bfe0 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
1bff0 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
1c000 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
1c010 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
1c020 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
1c030 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
1c040 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
1c050 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
1c060 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
1c070 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1c080 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
1c090 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
1c0a0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
1c0b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c0c0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
1c0d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c0e0 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
1c0f0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
1c100 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
1c110 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
1c140 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
1c150 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
1c160 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
1c170 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
1c180 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
1c190 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
1c1a0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
1c1b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1c1c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1c1d0 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
1c1e0 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
1c1f0 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f    cygwin_conv_to
1c200 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68  _full_win32_path
1c210 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c  (zRelative, zFul
1c220 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  l);.  return SQL
1c230 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
1c240 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1c250 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
1c260 5f 57 49 4e 52 54 0a 20 20 53 69 6d 75 6c 61 74  _WINRT.  Simulat
1c270 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1c280 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
1c290 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c2a0 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a  TER(nFull);.  /*
1c2b0 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
1c2c0 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
1c2d0 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
1c2e0 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
1c2f0 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
1c300 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
1c310 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
1c320 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
1c330 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  e one. */.  sqli
1c340 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66  te3_snprintf(pVf
1c350 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
1c360 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
1c370 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e  ative);.  return
1c380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
1c390 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
1c3a0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
1c3b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
1c3c0 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
1c3d0 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65  N__).  int nByte
1c3e0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1c3f0 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  rted;.  char *zO
1c400 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ut;..  /* If thi
1c410 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
1c420 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
1c430 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
1c440 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
1c450 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
1c460 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
1c470 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
1c480 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
1c490 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
1c4a0 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61  /' && sqlite3Isa
1c4b0 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31  lpha(zRelative[1
1c4c0 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b  ]) && zRelative[
1c4d0 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a  2]==':' ){.    z
1c4e0 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
1c4f0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
1c500 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
1c510 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
1c520 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
1c530 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
1c540 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
1c550 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
1c560 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
1c570 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
1c580 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
1c590 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
1c5a0 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
1c5b0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
1c5c0 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
1c5d0 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
1c5e0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
1c5f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
1c600 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1c610 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
1c620 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1c630 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
1c640 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1c650 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1c660 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
1c670 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1c680 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c6a0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  M;.  }.  if( isN
1c6b0 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54  T() ){.    LPWST
1c6c0 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79  R zTemp;.    nBy
1c6d0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
1c6e0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
1c6f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
1c700 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a  0, 0) + 3;.    z
1c710 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Temp = sqlite3_m
1c720 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
1c730 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
1c740 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
1c750 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1c760 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1c770 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
1c780 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1c790 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1c7a0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
1c7b0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
1c7c0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
1c7d0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  Temp, 0);.    sq
1c7e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1c7f0 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
1c800 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
1c810 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
1c820 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
1c830 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
1c840 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1c850 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
1c860 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
1c870 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
1c880 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
1c890 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
1c8a0 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
1c8b0 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f  zTemp = sqlite3_
1c8c0 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
1c8d0 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
1c8e0 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
1c8f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1c900 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1c910 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
1c920 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c930 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
1c940 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
1c950 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
1c960 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
1c970 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  emp, 0);.    sql
1c980 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1c990 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
1c9a0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
1c9b0 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
1c9c0 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
1c9d0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
1c9e0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
1c9f0 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
1ca00 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73  e3_snprintf(pVfs
1ca10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46  ->mxPathname, zF
1ca20 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  ull, "%s", zOut)
1ca30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1ca40 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
1ca50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ca60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1ca70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ca80 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
1ca90 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  if.}..#ifndef SQ
1caa0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1cab0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
1cac0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
1cad0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
1cae0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
1caf0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
1cb00 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
1cb10 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
1cb20 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
1cb30 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a  d library..*/./*
1cb40 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
1cb50 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
1cb60 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
1cb70 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
1cb80 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
1cb90 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1cba0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
1cbb0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
1cbc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
1cbd0 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  winDlOpen(sqlite
1cbe0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
1cbf0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1cc00 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  me){.  HANDLE h;
1cc10 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1cc20 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1cc30 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
1cc40 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
1cc50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1cc60 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1cc70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1cc80 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  n 0;.  }.  if( i
1cc90 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
1cca0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1ccb0 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
1ccc0 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
1ccd0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
1cce0 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
1ccf0 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
1cd00 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1cd10 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1cd20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1cd30 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1cd40 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
1cd50 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
1cd60 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
1cd70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
1cd80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1cd90 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
1cda0 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
1cdb0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
1cdc0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
1cdd0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
1cde0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
1cdf0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1ce00 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
1ce10 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
1ce20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
1ce30 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
1ce40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
1ce50 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
1ce60 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
1ce70 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
1ce80 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29   char *zSymbol))
1ce90 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44  (void){.  UNUSED
1cea0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1ceb0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
1cec0 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50  (*)(void))osGetP
1ced0 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
1cee0 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79  DLE)pHandle, zSy
1cef0 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  mbol);.}.static 
1cf00 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
1cf10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1cf20 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
1cf30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1cf40 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
1cf50 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
1cf60 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d  NDLE)pHandle);.}
1cf70 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
1cf80 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1cf90 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
1cfa0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
1cfb0 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20   winDlOpen  0.  
1cfc0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72  #define winDlErr
1cfd0 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  or 0.  #define w
1cfe0 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  inDlSym   0.  #d
1cff0 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65  efine winDlClose
1d000 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1d010 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42  * Write up to nB
1d020 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
1d030 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66  omness into zBuf
1d040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d050 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  winRandomness(sq
1d060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1d070 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1d080 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20  *zBuf){.  int n 
1d090 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
1d0a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
1d0b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d0c0 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42  E_TEST).  n = nB
1d0d0 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  uf;.  memset(zBu
1d0e0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c  f, 0, nBuf);.#el
1d0f0 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
1d100 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75  SYSTEMTIME)<=nBu
1d110 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45  f-n ){.    SYSTE
1d120 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47  MTIME x;.    osG
1d130 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
1d140 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1d150 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f  uf[n], &x, sizeo
1d160 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(x));.    n += 
1d170 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20  sizeof(x);.  }. 
1d180 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
1d190 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
1d1a0 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73    DWORD pid = os
1d1b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d1c0 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  sId();.    memcp
1d1d0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64  y(&zBuf[n], &pid
1d1e0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
1d1f0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
1d200 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pid);.  }.#if SQ
1d210 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1d220 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47  if( sizeof(ULONG
1d230 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  LONG)<=nBuf-n ){
1d240 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63  .    ULONGLONG c
1d250 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
1d260 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d  unt64();.    mem
1d270 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
1d280 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
1d290 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1d2a0 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73  f(cnt);.  }.#els
1d2b0 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  e.  if( sizeof(D
1d2c0 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
1d2d0 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
1d2e0 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   osGetTickCount(
1d2f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
1d300 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
1d310 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
1d320 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
1d330 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
1d340 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  f( sizeof(LARGE_
1d350 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e  INTEGER)<=nBuf-n
1d360 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e   ){.    LARGE_IN
1d370 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51  TEGER i;.    osQ
1d380 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
1d390 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
1d3a0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1d3b0 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
1d3c0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1d3d0 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
1d3e0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
1d3f0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1d400 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1d410 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1d420 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1d430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d440 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
1d450 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1d460 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c  microsec){.  sql
1d470 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
1d480 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
1d490 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f  1000);.  UNUSED_
1d4a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1d4b0 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72  .  return ((micr
1d4c0 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a  osec+999)/1000)*
1d4d0 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  1000;.}../*.** T
1d4e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1d4f0 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
1d500 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
1d510 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
1d520 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
1d530 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
1d540 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
1d550 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
1d560 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
1d570 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
1d580 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
1d590 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
1d5a0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
1d5b0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1d5c0 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
1d5d0 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
1d5e0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
1d5f0 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
1d600 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
1d610 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
1d620 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
1d630 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
1d640 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
1d650 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
1d660 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
1d670 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
1d680 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
1d690 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
1d6a0 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
1d6b0 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
1d6c0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
1d6d0 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
1d6e0 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
1d6f0 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
1d700 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
1d710 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
1d720 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
1d730 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
1d740 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
1d750 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
1d760 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1d770 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
1d780 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
1d790 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a  time and date .*
1d7a0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
1d7b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1d7c0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
1d7d0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
1d7e0 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
1d7f0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
1d800 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
1d810 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
1d820 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
1d830 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
1d840 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
1d850 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
1d860 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
1d870 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
1d880 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
1d890 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
1d8a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1d8b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e  qlite3_int64 win
1d8c0 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20  FiletimeEpoch = 
1d8d0 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65  23058135*(sqlite
1d8e0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
1d8f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1d900 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EST.  static con
1d910 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
1d920 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
1d930 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
1d940 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65  nt64)8640000;.#e
1d950 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d  ndif.  /* 2^32 -
1d960 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66   to avoid use of
1d970 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73   LL and warnings
1d980 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61   in gcc */.  sta
1d990 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1d9a0 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74  3_int64 max32Bit
1d9b0 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28  Value = .      (
1d9c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
1d9d0 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
1d9e0 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
1d9f0 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
1da00 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
1da10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1da20 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
1da30 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74  ME time;.  osGet
1da40 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65  SystemTime(&time
1da50 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65  );.  /* if Syste
1da60 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
1da70 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75  ) fails, it retu
1da80 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  rns zero. */.  i
1da90 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65  f (!osSystemTime
1daa0 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
1dab0 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75  ,&ft)){.    retu
1dac0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1dad0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47  .  }.#else.  osG
1dae0 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
1daf0 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23  leTime( &ft );.#
1db00 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20  endif..  *piNow 
1db10 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  = winFiletimeEpo
1db20 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ch +.           
1db30 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   ((((sqlite3_int
1db40 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65  64)ft.dwHighDate
1db50 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61  Time)*max32BitVa
1db60 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20  lue) + .        
1db70 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1db80 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
1db90 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
1dba0 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
1dbb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1dbc0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
1dbd0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
1dbe0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
1dbf0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
1dc00 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
1dc10 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
1dc20 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
1dc30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1dc40 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1dc50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1dc60 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
1dc70 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
1dc80 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
1dc90 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
1dca0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
1dcb0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
1dcc0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
1dcd0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
1dce0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
1dcf0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
1dd00 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
1dd10 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
1dd20 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
1dd30 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
1dd40 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1dd50 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
1dd60 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
1dd70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
1dd80 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
1dd90 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
1dda0 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
1ddb0 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
1ddc0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
1ddd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1dde0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
1ddf0 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
1de00 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
1de10 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
1de20 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
1de30 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
1de40 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
1de50 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
1de60 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
1de70 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
1de80 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
1de90 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
1dea0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
1deb0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
1dec0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
1ded0 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
1dee0 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
1def0 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
1df00 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
1df10 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
1df20 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
1df30 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
1df40 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
1df50 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
1df60 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
1df70 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
1df80 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
1df90 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
1dfa0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
1dfb0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1dfc0 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
1dfd0 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
1dfe0 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
1dff0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1e000 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
1e010 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
1e020 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
1e030 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
1e040 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
1e050 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
1e060 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1e070 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
1e080 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
1e090 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
1e0a0 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
1e0b0 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
1e0c0 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
1e0d0 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
1e0e0 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
1e0f0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
1e100 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
1e110 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
1e120 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
1e130 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
1e140 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
1e150 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
1e160 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
1e170 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
1e180 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
1e190 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1e1a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
1e1b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
1e1c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1e1d0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1e1e0 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
1e1f0 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
1e200 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
1e210 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
1e220 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
1e230 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1e240 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
1e250 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
1e260 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
1e270 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
1e280 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
1e290 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
1e2a0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
1e2b0 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
1e2c0 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
1e2d0 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
1e2e0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
1e2f0 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
1e300 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
1e310 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
1e320 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
1e330 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1e340 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
1e350 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
1e360 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1e370 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a   nBuf, zBuf);.}.
1e380 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1e390 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
1e3a0 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
1e3b0 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
1e3c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1e3d0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
1e3e0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
1e3f0 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
1e400 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
1e410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1e420 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
1e430 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
1e440 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
1e450 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
1e460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
1e470 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
1e480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e490 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
1e4a0 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
1e4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
1e4c0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4e0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
1e4f0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
1e500 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
1e510 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
1e520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1e530 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
1e540 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
1e550 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
1e560 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
1e570 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
1e580 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
1e590 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
1e5a0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
1e5b0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
1e5c0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
1e5d0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
1e5e0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
1e5f0 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
1e600 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
1e610 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
1e620 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
1e630 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
1e640 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
1e650 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
1e660 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1e670 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
1e680 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
1e690 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
1e6a0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
1e6b0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
1e6c0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
1e6d0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
1e6e0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
1e6f0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
1e700 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
1e710 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
1e720 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
1e730 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
1e740 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
1e750 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
1e760 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
1e770 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
1e780 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
1e790 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c    };..  /* Doubl
1e7a0 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
1e7b0 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
1e7c0 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
1e7d0 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
1e7e0 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
1e7f0 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
1e800 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
1e810 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
1e820 79 73 63 61 6c 6c 29 3d 3d 37 31 20 29 3b 0a 0a  yscall)==71 );..
1e830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e840 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74  MIT_WAL.  /* get
1e850 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
1e860 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
1e870 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
1e880 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
1e890 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
1e8a0 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
1e8b0 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
1e8c0 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
1e8d0 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
1e8e0 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
1e8f0 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
1e900 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
1e910 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e  sert(winSysInfo.
1e920 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
1e930 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65  ularity > 0);.#e
1e940 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
1e950 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
1e960 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75  nVfs, 1);.  retu
1e970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
1e980 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
1e990 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
1e9a0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1e9b0 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 20  .  if( sleepObj 
1e9c0 21 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  != NULL ){.    o
1e9d0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
1e9e0 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
1e9f0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
1ea00 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1ea10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1ea20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ea30 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.