/ Hex Artifact Content
Login

Artifact 75d5de49067252dbd98fb8b1a2b2fabe7938e53c:


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 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
07a0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
07b0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
07c0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
07e0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
07f0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0800: 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  or */.  winShm *
0810: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
0820: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
0830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
0840: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63  this file */.  c
0850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0860: 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  ;      /* Full p
0870: 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  athname of this 
0880: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  file */.  int sz
0890: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
08a0: 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20    /* Chunk size 
08b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  configured by FC
08c0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
08d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
08e0: 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a  WINCE.  LPWSTR z
08f0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0910: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0920: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0930: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
0940: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
0950: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
0960: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
0970: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
0980: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
0990: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
09a0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
09b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
09c0: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
09d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
09f0: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0a00: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0a10: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0a20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0a30: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
0a40: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
0a50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0a60: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
0a70: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
0a80: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
0a90: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
0aa0: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
0ab0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
0ac0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
0ad0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
0af0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
0b00: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
0b10: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
0b20: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0b30: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0b40: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0b50: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0b60: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0b70: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0b80: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0b90: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0bb0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54  2_MALLOC./*. * T
0bc0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
0bd0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0be0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0bf0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0c00: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0c10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0c20: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
0c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c40: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
0c50: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
0c60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
0c70: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
0ca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
0cb0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
0cc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0cd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
0ce0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0cf0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0d00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0d10: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0d20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0d30: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
0d40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0d50: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d60: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
0d70: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
0d80: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
0d90: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
0da0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
0db0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
0dc0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
0dd0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
0de0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
0e00: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
0e10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
0e20: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
0e30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0e40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75   winMemData stru
0e50: 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66  cture stores inf
0e60: 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65  ormation require
0e70: 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73  d by the Win32-s
0e80: 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74  pecific.** sqlit
0e90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69  e3_mem_methods i
0ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0eb0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ec0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d   winMemData winM
0ed0: 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77  emData;.struct w
0ee0: 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e  inMemData {.#ifn
0ef0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
0f00: 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61   magic;    /* Ma
0f10: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
0f20: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
0f30: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
0f40: 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48  ndif.  HANDLE hH
0f50: 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64  eap; /* The hand
0f60: 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20  le to our heap. 
0f70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64  */.  BOOL bOwned
0f80: 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20  ;  /* Do we own 
0f90: 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64  the heap (i.e. d
0fa0: 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75  estroy it on shu
0fb0: 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23  tdown)? */.};..#
0fc0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
0fd0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
0fe0: 49 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30  IC     0x42b2830
0ff0: 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  b.#endif..static
1000: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1010: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
1020: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
1030: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
1040: 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c  C,.#endif.  NULL
1050: 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e  , FALSE.};..#ifn
1060: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
1070: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
1080: 61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77  agic() assert( w
1090: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
10a0: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
10b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
10c0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
10d0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
10e0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
10f0: 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  p() win_mem_data
1100: 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76  .hHeap..static v
1110: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1120: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
1130: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
1140: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
1150: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
1160: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
1170: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
1180: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
1190: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
11a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
11b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
11c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
11d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
11e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
11f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
1200: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
1210: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
1220: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
1230: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
1240: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
1250: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
1260: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
1270: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
1280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1290: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
12a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
12b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
12c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
12d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
12e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
1300: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
1310: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
1320: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
1330: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
1340: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
1350: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
1360: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
1370: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
1380: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
1390: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
13a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
13b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
13c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
13d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
13e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
13f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
1400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1410: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1420: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
1430: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  se.static int sq
1440: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  0;.#endif..#if !
1460: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1470: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
1480: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1490: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
14a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
14b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
14c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
14d0: 4e 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  NT || SQLITE_OS_
14e0: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
14f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1500: 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69  _WIDE.#endif..#i
1510: 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20  fndef SYSCALL.# 
1520: 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20   define SYSCALL 
1530: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
1540: 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ptr.#endif..#if 
1550: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1560: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72  /*.** These macr
1570: 6f 73 20 61 72 65 20 6e 65 63 65 73 73 61 72 79  os are necessary
1580: 20 62 65 63 61 75 73 65 20 57 69 6e 64 6f 77 73   because Windows
1590: 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74   CE does not nat
15a0: 69 76 65 6c 79 20 73 75 70 70 6f 72 74 20 74 68  ively support th
15b0: 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49 73 20  e.** Win32 APIs 
15c0: 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b  LockFile, Unlock
15d0: 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69  File, and LockFi
15e0: 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65  leEx.. */..#  de
15f0: 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c  fine LockFile(a,
1600: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77  b,c,d,e)       w
1610: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c  inceLockFile(&a,
1620: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20   b, c, d, e).#  
1630: 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c  define UnlockFil
1640: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
1650: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
1660: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
1670: 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46  .#  define LockF
1680: 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c  ileEx(a,b,c,d,e,
1690: 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69  f)   winceLockFi
16a0: 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64  leEx(&a, b, c, d
16b0: 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54  , e, f)../*.** T
16c0: 68 65 73 65 20 61 72 65 20 74 68 65 20 73 70 65  hese are the spe
16d0: 63 69 61 6c 20 73 79 73 63 61 6c 6c 20 68 61 63  cial syscall hac
16e0: 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 43  ks for Windows C
16f0: 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  E.  The locking 
1700: 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e  related.** defin
1710: 65 73 20 68 65 72 65 20 72 65 66 65 72 20 74 6f  es here refer to
1720: 20 74 68 65 20 6d 61 63 72 6f 73 20 64 65 66 69   the macros defi
1730: 6e 65 64 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a  ned just above..
1740: 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f   */..#  define o
1750: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
1760: 28 29 20 20 20 20 20 20 20 31 0a 23 20 20 64 65  ()       1.#  de
1770: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20  fine osLockFile 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1790: 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e  ockFile.#  defin
17a0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20  e osUnlockFile  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f              Unlo
17c0: 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65  ckFile.#  define
17d0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20   osLockFileEx   
17e0: 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b 46             LockF
17f0: 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ileEx.#endif../*
1800: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
1810: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
1820: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
1830: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
1840: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
1850: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
1860: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
1870: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
1880: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
1890: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
18a0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
18b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
18c0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
18d0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
18e0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
18f0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
1900: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
1910: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
1920: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
1930: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
1940: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1950: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1970: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
1980: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
1990: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
19a0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
19b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
19c0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
19d0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
19e0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
19f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
1a00: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
1a10: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
1a20: 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65  (SYSCALL)AreFile
1a30: 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20  ApisANSI,       
1a40: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
1a50: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
1a60: 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  I ((BOOL(WINAPI*
1a70: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
1a80: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  [0].pCurrent).#e
1a90: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1aa0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1ab0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1ae0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1af0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
1b00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1b10: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
1b20: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
1b30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1b40: 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20  CharLowerW,     
1b50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1b60: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  lse.  { "CharLow
1b70: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
1b80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1bb0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
1bc0: 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28  LowerW ((LPWSTR(
1bd0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
1be0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
1bf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
1c00: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
1c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1c20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1c30: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1c50: 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57  SCALL)CharUpperW
1c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
1c70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
1c80: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
1c90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1ca0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
1cb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1cc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
1cd0: 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c  osCharUpperW ((L
1ce0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
1cf0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
1d00: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
1d10: 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c  { "CloseHandle",
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1d30: 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c  SCALL)CloseHandl
1d40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
1d50: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43   },..#define osC
1d60: 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f  loseHandle ((BOO
1d70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
1d80: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  E))aSyscall[3].p
1d90: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
1da0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1db0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
1dc0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1de0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41  CALL)CreateFileA
1df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
1e00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
1e10: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
1e20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1e30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
1e40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1e50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
1e60: 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48  sCreateFileA ((H
1e70: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
1e80: 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  PCSTR,DWORD,DWOR
1e90: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
1ea0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1eb0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
1ec0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
1ed0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
1ee0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ef0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1f00: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1f10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1f20: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
1f30: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
1f40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1f50: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1f70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1f90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1fa0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
1fb0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
1fc0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
1fd0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
1fe0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1ff0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
2000: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
2010: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
2020: 29 0a 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )..  { "CreateFi
2030: 6c 65 4d 61 70 70 69 6e 67 22 2c 20 20 20 20 20  leMapping",     
2040: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
2050: 65 46 69 6c 65 4d 61 70 70 69 6e 67 2c 20 20 20  eFileMapping,   
2060: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
2070: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2080: 70 70 69 6e 67 20 28 28 48 41 4e 44 4c 45 28 57  pping ((HANDLE(W
2090: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
20a0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
20b0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
20c0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
20d0: 44 2c 4c 50 43 54 53 54 52 29 29 61 53 79 73 63  D,LPCTSTR))aSysc
20e0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
20f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2100: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2110: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2120: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2130: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2140: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
2150: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2160: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2170: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
2180: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21b0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
21c0: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
21d0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
21e0: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
21f0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
2200: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
2210: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
2220: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
2230: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2240: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2250: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
2260: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
2270: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2280: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
2290: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
22a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
22b0: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
22c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
22d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
22f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2300: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
2310: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
2320: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
2330: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
2340: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
2350: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
2360: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
2370: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2380: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
2390: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
23a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
23b0: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
23c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
23d0: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
23e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
23f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2420: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
2430: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
2440: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
2450: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
2460: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2470: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2480: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
2490: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
24a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
24b0: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
24c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
24d0: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
24e0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
24f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2520: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
2530: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
2540: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
2550: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
2560: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
2570: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2580: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
2590: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
25a0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
25b0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
25c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
25d0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
25e0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
25f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2600: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2610: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2620: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
2630: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
2640: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2650: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2660: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
2670: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
2680: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
26a0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
26b0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
26c0: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
26d0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
26e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
26f0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2700: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
2710: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2720: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2730: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2740: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
2750: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
2760: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
2770: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
2780: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
2790: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
27a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
27b0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
27c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
27d0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
27e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
27f0: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
2800: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
2810: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
2820: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
2830: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2850: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2860: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2870: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2880: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
2890: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
28a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
28b0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
28c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
28d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
28e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
28f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2900: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
2910: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2920: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
2930: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
2940: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
2950: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
2960: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
2970: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2980: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2990: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
29a0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
29b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
29c0: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
29d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
29e0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
29f0: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
2a00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2a30: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
2a40: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
2a50: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
2a60: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
2a70: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
2a80: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
2a90: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
2aa0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
2ab0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2ad0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
2ae0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
2af0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
2b00: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
2b10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
2b20: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
2b30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2b40: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
2b50: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
2b60: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
2b70: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
2b80: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
2b90: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2ba0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
2bb0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
2bc0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
2bd0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2be0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2bf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2c00: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
2c10: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
2c30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2c40: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
2c50: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
2c60: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
2c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
2cb0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
2cc0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
2cd0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
2ce0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
2cf0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
2d00: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
2d10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
2d20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2d30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2d40: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2d50: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
2d60: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
2d70: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
2d80: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
2d90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2da0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2db0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
2dc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2de0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2df0: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
2e00: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
2e10: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
2e20: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2e30: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2e40: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2e50: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
2e60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2e70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2e80: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
2e90: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
2ea0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
2eb0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
2ec0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2ed0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
2ee0: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
2ef0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2f20: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
2f30: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
2f40: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
2f50: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
2f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2f70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2f80: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2f90: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2fa0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
2fb0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
2fc0: 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20  tributesW,      
2fd0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2fe0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2ff0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
3000: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3010: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3020: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3030: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
3040: 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49  utesW ((DWORD(WI
3050: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
3060: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
3070: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3080: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3090: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
30a0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
30b0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
30c0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
30d0: 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c  utesExW,    0 },
30e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
30f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
3100: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
3110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3120: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3130: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3140: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3150: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
3160: 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f  I*)(LPCWSTR,GET_
3170: 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45  FILEEX_INFO_LEVE
3180: 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LS, \.        LP
3190: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
31a0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
31b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
31c0: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
31d0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
31e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3210: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3230: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
3240: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
3250: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3260: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
3270: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
3280: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
3290: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
32a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
32b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
32c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
32d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
32e0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
32f0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
3300: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
3310: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
3320: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3330: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
3340: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
3350: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3370: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3380: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
3390: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
33a0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
33b0: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
33c0: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
33d0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
33e0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
33f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3410: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3420: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3430: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
3440: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
3450: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
3460: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
3470: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3480: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
3490: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
34a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
34c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
34d0: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
34e0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
34f0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
3500: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
3510: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
3520: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
3530: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
3540: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
3550: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3560: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
3570: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
3580: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
3590: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
35a0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
35b0: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
35c0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
35d0: 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68  OS_WINCE.  /* Th
35e0: 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  e GetProcAddress
35f0: 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  A() routine is o
3600: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
3610: 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a   Windows CE. */.
3620: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
3630: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
3640: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
3650: 64 64 72 65 73 73 41 2c 20 20 20 20 20 20 20 20  ddressA,        
3660: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a   0 },.#else.  /*
3670: 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f   All other Windo
3680: 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70  ws platforms exp
3690: 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65  ect GetProcAddre
36a0: 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a  ss() to take.  *
36b0: 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  * an ANSI string
36c0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
36d0: 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74  he _UNICODE sett
36e0: 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50  ing */.  { "GetP
36f0: 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20  rocAddressA",   
3700: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3710: 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20  etProcAddress,  
3720: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3730: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3740: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 20 28  etProcAddressA (
3750: 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a  (FARPROC(WINAPI*
3760: 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20  )(HMODULE, \.   
3770: 20 20 20 20 20 4c 50 43 53 54 52 29 29 61 53 79       LPCSTR))aSy
3780: 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65  scall[27].pCurre
3790: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73  nt)..  { "GetSys
37a0: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
37b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
37c0: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
37d0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
37e0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
37f0: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
3800: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
3810: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
3820: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3830: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
3840: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3850: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
3860: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3870: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
3880: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
3890: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
38a0: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
38b0: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
38c0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
38d0: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
38e0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
38f0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
3900: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
3910: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
3920: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
3930: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
3940: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3970: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
3980: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
3990: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
39a0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
39b0: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
39c0: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
39d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
39e0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
39f0: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
3a00: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
3a10: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
3a20: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
3a30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3a40: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
3a50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3a60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3a90: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
3aa0: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
3ab0: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
3ac0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
3ad0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3ae0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3af0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3b00: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3b10: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
3b20: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
3b30: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
3b40: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
3b50: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3b60: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3b80: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ba0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3bb0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
3bc0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
3bd0: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
3be0: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
3bf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3c00: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
3c10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c20: 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20  )GetTickCount,  
3c30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3c40: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
3c50: 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57  kCount ((DWORD(W
3c60: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
3c70: 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72  yscall[33].pCurr
3c80: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3c90: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3ca0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3cb0: 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20  tVersionExA",   
3cc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3cd0: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20  )GetVersionExA, 
3ce0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3cf0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
3d00: 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20  sionExA",       
3d10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3d40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3d50: 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f  VersionExA ((BOO
3d60: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
3d70: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
3d80: 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c  NINFOA))aSyscall
3d90: 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [34].pCurrent)..
3da0: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3dc0: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
3dd0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3de0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3df0: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
3e00: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
3e10: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
3e20: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
3e30: 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65  scall[35].pCurre
3e40: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 43 72  nt)..  { "HeapCr
3e50: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
3e60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3e70: 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  pCreate,        
3e80: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3e90: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
3ea0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3eb0: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
3ec0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
3ed0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e  T))aSyscall[36].
3ee0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3ef0: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
3f00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3f10: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3f30: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
3f40: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
3f50: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
3f60: 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75  aSyscall[37].pCu
3f70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
3f80: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
3f90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3fa0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
3fb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
3fc0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
3fd0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
3fe0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
3ff0: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
4000: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
4010: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
4020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4030: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
4040: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
4050: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4060: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
4070: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
4080: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
4090: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
40a0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 39  E_T))aSyscall[39
40b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
40c0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
40e0: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4100: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
4110: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
4120: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4130: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4140: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
4150: 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[40].pCurrent)
4160: 0a 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64  ..  { "HeapValid
4170: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
4180: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61   (SYSCALL)HeapVa
4190: 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  lidate,         
41a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
41b0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
41c0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
41d0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
41e0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
41f0: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
4200: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4210: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4220: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4230: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
4240: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4250: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4270: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
4280: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
4290: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42a0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
42b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
42c0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
42d0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
42e0: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
42f0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4300: 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [42].pCurrent)..
4310: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4320: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4330: 45 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  E).  { "LoadLibr
4340: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
4350: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
4360: 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20  ibraryW,        
4370: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4380: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
4390: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
43a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
43d0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
43e0: 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryW ((HMODULE(WI
43f0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
4400: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
4410: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4c 6f 63  rrent)..  { "Loc
4420: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
4430: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4440: 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20  LocalFree,      
4450: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4460: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
4470: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
4480: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
4490: 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65  scall[44].pCurre
44a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
44b0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
44c0: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
44d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
44e0: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
44f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4500: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
4510: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4520: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4530: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
4540: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
4550: 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72  Syscall[45].pCur
4560: 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20  rent).#else.  { 
4570: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
4580: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4590: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
45b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ,.#endif..#if !S
45c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
45d0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
45f0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45  YSCALL)LockFileE
4600: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
4610: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4620: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
4630: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4640: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4650: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4660: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
4670: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  D))aSyscall[46].
4680: 70 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a  pCurrent).#else.
4690: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
46b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20   0 },.#endif..  
46e0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
46f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4700: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
4710: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ile,           0
4720: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
4730: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c  apViewOfFile ((L
4740: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
4750: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
4760: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4770: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
4780: 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74  all[47].pCurrent
4790: 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74  )..  { "MultiByt
47a0: 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20  eToWideChar",   
47b0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69    (SYSCALL)Multi
47c0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20  ByteToWideChar, 
47d0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
47e0: 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  e osMultiByteToW
47f0: 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49  ideChar ((int(WI
4800: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
4810: 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57  D,LPCSTR,int,LPW
4820: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69  STR, \.        i
4830: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  nt))aSyscall[48]
4840: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4850: 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  "QueryPerformanc
4860: 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43  eCounter", (SYSC
4870: 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d  ALL)QueryPerform
4880: 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d  anceCounter, 0 }
4890: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65  ,..#define osQue
48a0: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
48b0: 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nter ((BOOL(WINA
48c0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
48d0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29  LARGE_INTEGER*))
48e0: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
48f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61  rrent)..  { "Rea
4900: 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  dFile",         
4910: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4920: 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20  ReadFile,       
4930: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4940: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c  define osReadFil
4950: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4960: 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c  )(HANDLE,LPVOID,
4970: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
4980: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
4990: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
49a0: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  50].pCurrent).. 
49b0: 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65   { "SetEndOfFile
49c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
49d0: 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46  YSCALL)SetEndOfF
49e0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
49f0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4a00: 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42  SetEndOfFile ((B
4a10: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4a20: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  DLE))aSyscall[51
4a30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4a40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
4a50: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
4a60: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
4a70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4aa0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
4ab0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4ac0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
4ad0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20  ter,          0 
4ae0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4af0: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
4b00: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
4b10: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
4b20: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
4b30: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
4b40: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
4b50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4b60: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
4b70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4bb0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4c00: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
4c10: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
4c20: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
4c30: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
4c40: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
4c50: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
4c60: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
4c70: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
4c80: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
4c90: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
4ca0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
4cb0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
4cc0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
4cd0: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
4ce0: 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65  scall[54].pCurre
4cf0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4d00: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
4d10: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
4d20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d30: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
4d40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4d50: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
4d60: 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  kFile ((BOOL(WIN
4d70: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4d80: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
4d90: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
4da0: 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43  )aSyscall[55].pC
4db0: 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20  urrent).#else.  
4dc0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4de0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4e00: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   },.#endif..#if 
4e10: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4e20: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
4e30: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
4e40: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
4e50: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
4e60: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4e70: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28  osUnlockFileEx (
4e80: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4e90: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
4ea0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4eb0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
4ec0: 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43  )aSyscall[56].pC
4ed0: 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20  urrent).#else.  
4ee0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
4ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4f00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4f20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20   },.#endif..  { 
4f30: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
4f40: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
4f50: 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46  ALL)UnmapViewOfF
4f60: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ile,         0 }
4f70: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d  ,..#define osUnm
4f80: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42  apViewOfFile ((B
4f90: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4fa0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  VOID))aSyscall[5
4fb0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
4fc0: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  { "WideCharToMul
4fd0: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59  tiByte",     (SY
4fe0: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f  SCALL)WideCharTo
4ff0: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30  MultiByte,     0
5000: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
5010: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
5020: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  te ((int(WINAPI*
5030: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
5040: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69  WSTR,int,LPSTR,i
5050: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  nt, \.        LP
5060: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79  CSTR,LPBOOL))aSy
5070: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
5080: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46  nt)..  { "WriteF
5090: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
50a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69      (SYSCALL)Wri
50b0: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  teFile,         
50c0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
50d0: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20  ine osWriteFile 
50e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
50f0: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44  HANDLE,LPCVOID,D
5100: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5110: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
5120: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
5130: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
5140: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5150: 43 45 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  CE.  { "CreateEv
5160: 65 6e 74 45 78 22 2c 20 20 20 20 20 20 20 20 20  entEx",         
5170: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
5180: 65 45 76 65 6e 74 45 78 2c 20 20 20 20 20 20 20  eEventEx,       
5190: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
51a0: 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  e osCreateEventE
51b0: 78 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  x ((HANDLE(WINAP
51c0: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
51d0: 54 54 52 49 42 55 54 45 53 2c 4c 50 43 54 53 54  TTRIBUTES,LPCTST
51e0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
51f0: 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  RD,DWORD))aSysca
5200: 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[60].pCurrent)
5210: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
5220: 74 65 45 76 65 6e 74 45 78 22 2c 20 20 20 20 20  teEventEx",     
5230: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5250: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5260: 64 69 66 0a 0a 20 20 7b 20 22 57 61 69 74 46 6f  dif..  { "WaitFo
5270: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
5280: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69      (SYSCALL)Wai
5290: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
52a0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
52b0: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
52c0: 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52  gleObject ((DWOR
52d0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
52e0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  E, \.        DWO
52f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d  RD))aSyscall[61]
5300: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5310: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
5320: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
5330: 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20  gleObjectEx",   
5340: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
5350: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20  SingleObjectEx, 
5360: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5370: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
5380: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
5390: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
53a0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
53b0: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
53c0: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  62].pCurrent).#e
53d0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
53e0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
53f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5420: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5430: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 53 65 74 46  _WINCE.  { "SetF
5440: 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20  ilePointerEx",  
5450: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
5460: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c  etFilePointerEx,
5470: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5480: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
5490: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
54a0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
54b0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
54c0: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
54d0: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
54e0: 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72  Syscall[63].pCur
54f0: 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20  rent).#else.  { 
5500: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
5510: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
5520: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5540: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ,.#endif..#if !S
5550: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5560: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
5570: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
5580: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46  ", (SYSCALL)GetF
5590: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
55a0: 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 0a  HandleEx, 0 },..
55b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
55c0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
55d0: 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  ndleEx ((BOOL(WI
55e0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
55f0: 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e  .        FILE_IN
5600: 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41  FO_BY_HANDLE_CLA
5610: 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29  SS,LPVOID,DWORD)
5620: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
5630: 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20  urrent).#else.  
5640: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
5650: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
5660: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5680: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20   },.#endif..  { 
5690: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 45 78  "MapViewOfFileEx
56a0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
56b0: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
56c0: 65 45 78 2c 20 20 20 20 20 20 20 20 20 30 20 7d  eEx,         0 }
56d0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  ,..#define osMap
56e0: 56 69 65 77 4f 66 46 69 6c 65 45 78 20 28 28 4c  ViewOfFileEx ((L
56f0: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
5700: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
5710: 44 2c 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  D,DWORD,SIZE_T, 
5720: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
5730: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
5740: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
5750: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
5760: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
5770: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
5780: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
5790: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
57a0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
57b0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
57c0: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
57d0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
57e0: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
57f0: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
5800: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
5810: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
5820: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
5830: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
5840: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
5850: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
5860: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
5870: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
5880: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
5890: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
58a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
58b0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
58c0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
58d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
58e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
58f0: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
5900: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
5910: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5920: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
5930: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
5940: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
5950: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
5960: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
5970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
5980: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
5990: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
59a0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
59b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
59c0: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
59d0: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
59e0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
59f0: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
5a00: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
5a10: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
5a20: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
5a30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
5a40: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
5a50: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
5a60: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
5a70: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
5a80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
5a90: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
5aa0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5ab0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
5ac0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
5ad0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
5ae0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
5af0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
5b00: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
5b10: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
5b20: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
5b30: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
5b40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
5b50: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
5b60: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
5b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5b80: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
5b90: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
5ba0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
5bb0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
5bc0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
5bd0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
5be0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
5bf0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
5c00: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
5c10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
5c20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
5c30: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
5c40: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
5c50: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
5c60: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
5c70: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5c80: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
5c90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ca0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
5cd0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
5ce0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5cf0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
5d00: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
5d10: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
5d20: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
5d30: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
5d40: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
5d50: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
5d60: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
5d70: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
5d80: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
5d90: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
5da0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
5db0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5dc0: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5dd0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5de0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5df0: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5e00: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5e10: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5e20: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
5e30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
5e40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5e50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
5e60: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
5e70: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
5e80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5ea0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5eb0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5ec0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5ed0: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5ee0: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5ef0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5f00: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5f10: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5f20: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
5f30: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
5f40: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
5f50: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
5f60: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
5f70: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
5f80: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
5f90: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
5fa0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
5fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5fc0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
5fd0: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
5fe0: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
5ff0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
6000: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6010: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
6020: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6030: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
6040: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
6050: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6060: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
6070: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
6080: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
6090: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
60a0: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
60b0: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
60c0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
60d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
60e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
60f0: 67 20 72 6f 75 74 69 6e 65 20 53 75 73 70 65 6e  g routine Suspen
6100: 64 73 20 74 68 65 20 74 68 72 65 61 64 20 66 6f  ds the thread fo
6110: 72 20 61 74 20 6c 65 61 73 74 20 6d 73 20 6d 69  r at least ms mi
6120: 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69  lliseconds.  Thi
6130: 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a  s is equivalent.
6140: 2a 2a 20 74 6f 20 74 68 65 20 77 69 6e 33 32 20  ** to the win32 
6150: 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63  Sleep() interfac
6160: 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  e..*/.#if SQLITE
6170: 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63  _OS_WINRT.static
6180: 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a   HANDLE sleepObj
6190: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f  ;.static void po
61a0: 72 74 61 62 6c 65 53 6c 65 65 70 28 69 6e 74 20  rtableSleep(int 
61b0: 6d 73 29 7b 0a 20 20 6f 73 57 61 69 74 46 6f 72  ms){.  osWaitFor
61c0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73  SingleObjectEx(s
61d0: 6c 65 65 70 4f 62 6a 2c 20 6d 73 2c 20 46 41 4c  leepObj, ms, FAL
61e0: 53 45 29 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61  SE);.}.#else.sta
61f0: 74 69 63 20 76 6f 69 64 20 70 6f 72 74 61 62 6c  tic void portabl
6200: 65 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  eSleep(int ms){.
6210: 20 20 6f 73 53 6c 65 65 70 28 6d 73 29 3b 20 0a    osSleep(ms); .
6220: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6230: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
6240: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
6250: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
6260: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
6270: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
6280: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
6290: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
62a0: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
62b0: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
62c0: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
62d0: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
62e0: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
62f0: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
6300: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
6310: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
6320: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
6330: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
6340: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
6350: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
6360: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
6370: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
6380: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
6390: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
63a0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
63b0: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
63c0: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
63d0: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
63e0: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
63f0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6400: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
6410: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
6420: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23  leEx() API..*/.#
6430: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6440: 43 45 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  CE  || SQLITE_OS
6450: 5f 57 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20  _WINRT.# define 
6460: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
6470: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
6480: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
6490: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
64a0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
64b0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
64c0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
64d0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
64e0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
64f0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
6500: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
6510: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
6520: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
6530: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
6540: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
6550: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
6560: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
6570: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
6580: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ==2;.  }.#endif 
6590: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
65a0: 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  CE */..#ifdef SQ
65b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
65c0: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
65d0: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
65e0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
65f0: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
6600: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
6610: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
6620: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
6630: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
6640: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
6650: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
6660: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
6670: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
6680: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
6690: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66  _VALUE );.#ifdef
66a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
66b0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20  LLOC_VALIDATE.  
66c0: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
66d0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
66e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
66f0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
6700: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
6710: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
6720: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
6730: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
6740: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
6750: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
6760: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
6770: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
6780: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
6790: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
67a0: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
67b0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
67c0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
67d0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
67e0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
67f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6800: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
6810: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6820: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
6830: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
6840: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
6850: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
6860: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
6870: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
6880: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
6890: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
68a0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
68b0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
68c0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
68d0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
68e0: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
68f0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6900: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6910: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6920: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
6930: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
6940: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
6950: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
6960: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
6970: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
6980: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
6990: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
69a0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
69b0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
69c0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
69d0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
69e0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
69f0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
6a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6a10: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
6a20: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
6a30: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
6a40: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6a50: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
6a60: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
6a70: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
6a80: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
6a90: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
6aa0: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
6ab0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
6ac0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
6ad0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
6ae0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
6af0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
6b00: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
6b10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
6b20: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6b30: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6b40: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6b50: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6b60: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
6b70: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
6b80: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
6b90: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
6ba0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
6bb0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
6bc0: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
6bd0: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
6be0: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
6bf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6c00: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
6c10: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
6c20: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
6c30: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
6c40: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6c50: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
6c60: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
6c70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
6c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
6c90: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
6ca0: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
6cb0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
6cc0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
6cd0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
6ce0: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
6cf0: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
6d00: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
6d10: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
6d20: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
6d30: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
6d40: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
6d50: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
6d60: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
6d70: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
6d80: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
6d90: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
6da0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
6db0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
6dc0: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
6dd0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
6de0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
6df0: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6e00: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6e10: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6e20: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6e30: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6e40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6e50: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6e60: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6e70: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
6e80: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
6e90: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
6ea0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
6eb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
6ec0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
6ed0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6ee0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
6ef0: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
6f00: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
6f10: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6f20: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6f30: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
6f40: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
6f50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6f60: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
6f70: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
6f80: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
6f90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6fa0: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
6fb0: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
6fc0: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
6fd0: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
6fe0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
6ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
7000: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
7010: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
7020: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7030: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
7040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7050: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
7060: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
7070: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
7080: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
7090: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
70a0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
70b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
70c0: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
70d0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
70e0: 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  agic==WINMEM_MAG
70f0: 49 43 20 29 3b 0a 20 20 69 66 28 20 21 70 57 69  IC );.  if( !pWi
7100: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
7110: 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  ){.    pWinMemDa
7120: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
7130: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
7140: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
7150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
7180: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
7190: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
71c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
71d0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
71e0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
71f0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
7200: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
7210: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
7220: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
7230: 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61  Create (%d), fla
7240: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
7250: 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c  %u, maxSize=%u",
7260: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
7270: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
7280: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
7290: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
72a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
72b0: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c  P_INIT_SIZE, SQL
72c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
72d0: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  AX_SIZE);.      
72e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
72f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
7300: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
7310: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d 0a 20  ed = TRUE;.  }. 
7320: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
7330: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
7340: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
7350: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
7360: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
7370: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
7380: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
7390: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
73a0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
73b0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
73c0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
73d0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
73e0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
73f0: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
7400: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
7410: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
7420: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
7430: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
7440: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
7450: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
7460: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
7470: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
7480: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
7490: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
74a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
74b0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
74c0: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
74d0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
74e0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
74f0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
7500: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
7510: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
7520: 45 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  E.    assert( os
7530: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
7540: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
7550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
7560: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
7570: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
7580: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
7590: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
75a0: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
75b0: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
75c0: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
75d0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
75e0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
75f0: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
7600: 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  y (%d), heap=%p"
7610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7620: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
7630: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
7640: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
7650: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
7660: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
7670: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
7680: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
7690: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
76a0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
76b0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
76c0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
76d0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
76e0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
76f0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
7700: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
7710: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
7720: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
7730: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
7740: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
7750: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
7760: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
7770: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7780: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
7790: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
77a0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
77b0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
77c0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
77d0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
77e0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
77f0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
7800: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
7810: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
7820: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
7830: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
7840: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
7850: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
7860: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
7870: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
7880: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
7890: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
78a0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
78b0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
78c0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
78d0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
78e0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
78f0: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
7900: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
7910: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
7920: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
7930: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
7940: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
7950: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
7960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7970: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
7980: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
7990: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
79a0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
79b0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
79c0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
79d0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
79e0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
79f0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
7a00: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
7a10: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63   utf8ToUnicode(c
7a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
7a30: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
7a40: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
7a50: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
7a60: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
7a70: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
7a80: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
7a90: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
7aa0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
7ab0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7ac0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
7ad0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7ae0: 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69  malloc( nChar*si
7af0: 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61  zeof(zWideFilena
7b00: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
7b10: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30  zWideFilename==0
7b20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7b30: 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20  ;.  }.  nChar = 
7b40: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7b50: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
7b60: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
7b70: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a   zWideFilename,.
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
7bb0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  har==0 ){.    sq
7bc0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
7bd0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
7be0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30  WideFilename = 0
7bf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7c00: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  WideFilename;.}.
7c10: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
7c20: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
7c30: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
7c40: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
7c50: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
7c60: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
7c70: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7c80: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
7c90: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
7ca0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  8(LPCWSTR zWideF
7cb0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
7cc0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
7cd0: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79  Filename;..  nBy
7ce0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
7cf0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
7d00: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
7d10: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
7d20: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7d30: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
7d40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
7d50: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
7d60: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
7d70: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
7d80: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
7d90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
7da0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
7db0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
7dc0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
7dd0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
7de0: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
7e10: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7e20: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
7e30: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
7e40: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
7e50: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
7e60: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
7e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
7e80: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
7e90: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
7ea0: 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74  code, based on t
7eb0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f  he.** current co
7ec0: 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20  depage settings 
7ed0: 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a  for file apis..*
7ee0: 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  * .** Space to h
7ef0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7f00: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
7f10: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
7f20: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  te3_malloc..*/.s
7f30: 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63  tatic LPWSTR mbc
7f40: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
7f50: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7f60: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
7f70: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69    LPWSTR zMbcsFi
7f80: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
7f90: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
7fa0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
7fb0: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
7fc0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
7fd0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
7fe0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
7ff0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
8000: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57       0)*sizeof(W
8030: 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79  CHAR);.  if( nBy
8040: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  te==0 ){.    ret
8050: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62  urn 0;.  }.  zMb
8060: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  csFilename = sql
8070: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
8080: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
8090: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
80a0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
80b0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
80c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
80d0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
80e0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
80f0: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
8100: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
8110: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
8140: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
8150: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8160: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
8170: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
8180: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
8190: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
81a0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
81b0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
81c0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
81d0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
81e0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
81f0: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
8200: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
8210: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
8220: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
8230: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
8240: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
8250: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
8260: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
8270: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
8280: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
8290: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
82a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
82b0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
82c0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
82d0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
82e0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
82f0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
8300: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
8310: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
8320: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
8330: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
8340: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
8350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8360: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
8370: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
8380: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
8390: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
83a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
83b0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
83c0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
83d0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
83e0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
83f0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
8420: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
8430: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
8440: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
8450: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
8460: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
8470: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
8480: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
8490: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
84a0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
84b0: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
84c0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
84d0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
84e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
84f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
8500: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
8510: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
8520: 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  _utf8(const char
8530: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
8540: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
8550: 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  tf8;.  LPWSTR zT
8560: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
8570: 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63  ide = mbcsToUnic
8580: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
8590: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
85a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
85b0: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
85c0: 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65  meUtf8 = unicode
85d0: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
85e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
85f0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
8600: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
8610: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
8620: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
8630: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
8640: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
8650: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
8660: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
8670: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
8680: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
8690: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
86a0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
86b0: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
86c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
86d0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
86e0: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
86f0: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
8700: 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  pWide = utf8ToUn
8710: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
8720: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
8730: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8740: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
8750: 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f  nameMbcs = unico
8760: 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64  deToMbcs(zTmpWid
8770: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
8780: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
8790: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
87a0: 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Mbcs;.}.../*.** 
87b0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
87c0: 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72   of getLastError
87d0: 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  Msg.** is zero i
87e0: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
87f0: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
8800: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
8810: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
8820: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
8830: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
8840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
8850: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
8860: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
8870: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
8880: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
8890: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
88a0: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
88b0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
88c0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
88d0: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
88e0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
88f0: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
8900: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
8910: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
8920: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
8930: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
8940: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
8950: 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
8960: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
8970: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52  _WINRT.    WCHAR
8980: 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58 5f 50   zTempWide[MAX_P
8990: 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a  ATH+1]; /* NOTE:
89a0: 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69 74 72   Somewhat arbitr
89b0: 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77 4c 65  ary. */.    dwLe
89c0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
89d0: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
89e0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
89f0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
8a10: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
8a20: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
8a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
8a70: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c        zTempWide,
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 41                MA
8ae0: 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20 20 20  X_PATH,.        
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20       0);.#else. 
8b10: 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57     LPWSTR zTempW
8b20: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
8b30: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
8b40: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
8b50: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
8b60: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
8b90: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
8ba0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
8bd0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
8c00: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29          (LPWSTR)
8c70: 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20   &zTempWide,.   
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
8cc0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c  ndif.    if( dwL
8cd0: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
8ce0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
8cf0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
8d00: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
8d10: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
8d20: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
8d30: 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
8d40: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69  deToUtf8(zTempWi
8d50: 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  de);.      sqlit
8d60: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
8d70: 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  c();.#if !SQLITE
8d80: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
8d90: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
8da0: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
8db0: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
8dc0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
8dd0: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57  LocalFree(zTempW
8de0: 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ide);.#endif.   
8df0: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
8e00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
8e10: 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
8e20: 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55  char *zTemp = NU
8e30: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
8e40: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  osFormatMessageA
8e50: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
8e60: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
8e70: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
8e90: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
8ea0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
8ed0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
8ee0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
8f30: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a  (LPSTR) &zTemp,.
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
8fc0: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
8fd0: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
8fe0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
8ff0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
9000: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
9010: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
9020: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
9030: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
9040: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
9050: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  8(zTemp);.      
9060: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
9070: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
9080: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
9090: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
90a0: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
90b0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
90c0: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29  LocalFree(zTemp)
90d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
90e0: 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77  if.  if( 0 == dw
90f0: 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
9100: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
9110: 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72  , zBuf, "OsError
9120: 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73   0x%x (%u)", las
9130: 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e  tErrno, lastErrn
9140: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
9150: 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d   /* copy a maxim
9160: 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73  um of nBuf chars
9170: 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65   to output buffe
9180: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
9190: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
91a0: 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74  zBuf, "%s", zOut
91b0: 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74  );.    /* free t
91c0: 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a  he UTF8 buffer *
91d0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
91e0: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
91f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9200: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9210: 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f  ion - winLogErro
9220: 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f  rAtLine() - is o
9230: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
9240: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
9250: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a   winLogError()..
9260: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9270: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  ne is invoked af
9280: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
9290: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
92a0: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67  ction..** It log
92b0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
92c0: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
92d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
92e0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
92f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
9300: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
9310: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9320: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
9330: 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  om .** FormatMes
9340: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
9350: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
9360: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
9370: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
9380: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
9390: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
93a0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
93b0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
93c0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
93d0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
93e0: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
93f0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
9400: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
9410: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
9420: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
9430: 64 20 61 6e 64 20 74 68 65 20 74 68 65 20 61 73  d and the the as
9440: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
9450: 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e  stem path, if an
9460: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  y..*/.#define wi
9470: 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c  nLogError(a,b,c,
9480: 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  d)   winLogError
9490: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f  AtLine(a,b,c,d,_
94a0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
94b0: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
94c0: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
94d0: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
94e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
94f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
9500: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
9510: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
9520: 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74     /* Win32 last
9530: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
9540: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
9550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9560: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
9570: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
9580: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9590: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
95a0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
95b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
95c0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
95d0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
95f0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
9600: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
9610: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
9620: 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20  har zMsg[500];  
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9640: 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  * Human readable
9650: 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20   error text */. 
9660: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9690: 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d   */..  zMsg[0] =
96a0: 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72   0;.  getLastErr
96b0: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
96c0: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
96d0: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
96e0: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
96f0: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
9700: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
9710: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
9720: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
9730: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
9740: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
9750: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
9760: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
9770: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
9780: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  win.c:%d: (%d) %
9790: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
97a0: 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72     iLine, lastEr
97b0: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
97c0: 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20  h, zMsg.  );..  
97d0: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
97e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  }../*.** The num
97f0: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
9800: 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20  t a ReadFile(), 
9810: 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64  WriteFile(), and
9820: 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a   DeleteFile().**
9830: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64   will be retried
9840: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63   following a loc
9850: 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f  king error - pro
9860: 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20  bably caused by 
9870: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
9880: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
9890: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
98a0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
98b0: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
98c0: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
98d0: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
98e0: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
98f0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
9900: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
9910: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
9920: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
9930: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
9940: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
9950: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
9960: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
9970: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
9980: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
9990: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
99a0: 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53  32IoerrRetry = S
99b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
99c0: 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20  R_RETRY;.static 
99d0: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
99e0: 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54  tryDelay = SQLIT
99f0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
9a00: 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a  TRY_DELAY;../*.*
9a10: 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28  * If a ReadFile(
9a20: 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29  ) or WriteFile()
9a30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69   error occurs, i
9a40: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
9a50: 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ne.** to see if 
9a60: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  it should be ret
9a70: 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52  ried.  Return TR
9a80: 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65  UE to retry.  Re
9a90: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f  turn FALSE.** to
9aa0: 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e   give up with an
9ab0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
9ac0: 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72  c int retryIoerr
9ad0: 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
9ae0: 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
9af0: 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
9b00: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
9b10: 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
9b20: 33 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a  32IoerrRetry ){.
9b30: 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
9b40: 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
9b50: 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = e;.    }.    r
9b60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
9b70: 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45  f( e==ERROR_ACCE
9b80: 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20  SS_DENIED ||.   
9b90: 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b     e==ERROR_LOCK
9ba0: 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20  _VIOLATION ||.  
9bb0: 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41      e==ERROR_SHA
9bc0: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29  RING_VIOLATION )
9bd0: 7b 0a 20 20 20 20 70 6f 72 74 61 62 6c 65 53 6c  {.    portableSl
9be0: 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65  eep(win32IoerrRe
9bf0: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
9c00: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
9c10: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
9c20: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
9c30: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70  pError ){.    *p
9c40: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20  Error = e;.  }. 
9c50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9c60: 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72  .** Log a I/O er
9c70: 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64  ror retry episod
9c80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
9c90: 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  d logIoerr(int n
9ca0: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
9cb0: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
9cc0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
9cd0: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
9ce0: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
9cf0: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
9d00: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
9d10: 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
9d20: 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
9d30: 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d  +1)/2.    );.  }
9d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  .}../*.** Lock a
9d50: 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f   file region..*/
9d60: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
9d70: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44  LockFile(.  HAND
9d80: 4c 45 20 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  LE hFile,.  DWOR
9d90: 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44  D flags,.  DWORD
9da0: 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
9db0: 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
9dc0: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
9dd0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
9de0: 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 20 20 69  BytesHigh.){.  i
9df0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
9e00: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
9e10: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
9e20: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
9e30: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
9e40: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
9e50: 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
9e60: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
9e70: 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
9e80: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
9e90: 45 78 28 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c  Ex(hFile, flags,
9ea0: 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
9eb0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
9ec0: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
9ed0: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
9ee0: 6b 46 69 6c 65 28 68 46 69 6c 65 2c 20 6f 66 66  kFile(hFile, off
9ef0: 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
9f00: 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
9f10: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
9f20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c    }.}../*.** Unl
9f30: 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
9f40: 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
9f50: 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
9f60: 28 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c 65  (.  HANDLE hFile
9f70: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
9f80: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
9f90: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
9fa0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
9fb0: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
9fc0: 67 68 0a 29 7b 0a 20 20 69 66 28 20 69 73 4e 54  gh.){.  if( isNT
9fd0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
9fe0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
9ff0: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
a000: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
a010: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
a020: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
a030: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
a040: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
a050: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
a060: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 68 46  sUnlockFileEx(hF
a070: 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ile, 0, numBytes
a080: 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
a090: 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
a0a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
a0b0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 68 46 69 6c  sUnlockFile(hFil
a0c0: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
a0d0: 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
a0e0: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
a0f0: 69 67 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  igh);.  }.}..#if
a100: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
a110: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
a160: 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
a170: 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
a180: 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a  nCE only..*/./*.
a190: 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f  ** Windows CE do
a1a0: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
a1b0: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
a1c0: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
a1d0: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
a1e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
a1f0: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
a200: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
a210: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
a220: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
a230: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
a240: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
a250: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
a260: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
a270: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
a280: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
a290: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
a2a0: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
a2b0: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
a2c0: 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
a2d0: 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
a2e0: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
a2f0: 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
a300: 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  2);.  osFileTime
a310: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28  ToLocalFileTime(
a320: 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73  &uTm,&lTm);.  os
a330: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
a340: 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
a350: 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
a360: 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
a370: 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
a380: 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
a390: 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
a3a0: 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
a3b0: 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
a3c0: 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
a3d0: 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
a3e0: 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
a3f0: 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
a400: 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
a410: 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
a420: 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
a430: 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
a440: 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
a450: 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
a460: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
a470: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
a480: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
a490: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
a4a0: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
a4b0: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
a4c0: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
a4d0: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
a4e0: 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
a4f0: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
a500: 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
a510: 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
a520: 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
a530: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
a540: 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
a550: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
a560: 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
a570: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
a580: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
a590: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
a5a0: 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
a5b0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
a5c0: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
a5d0: 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
a5e0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
a5f0: 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
a600: 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
a610: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
a620: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
a630: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
a640: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
a650: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
a660: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
a670: 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
a680: 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20   TRUE;..  zName 
a690: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
a6a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
a6b0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
a6c0: 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f    /* out of memo
a6d0: 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ry */.    return
a6e0: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f   FALSE;.  }..  /
a6f0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
a700: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
a710: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69  */.  memset(&pFi
a720: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69  le->local, 0, si
a730: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
a740: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
a750: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
a760: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
a770: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
a780: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
a790: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
a7a0: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f  e. */.  zTok = o
a7b0: 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d  sCharLowerW(zNam
a7c0: 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
a7d0: 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
a7e0: 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
a7f0: 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
a800: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
a810: 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
a820: 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
a830: 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61  >hMutex = osCrea
a840: 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
a850: 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
a860: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
a870: 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex){.    pFile->
a880: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
a890: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
a8a0: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
a8b0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c  LITE_ERROR, pFil
a8c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
a8d0: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
a8e0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
a8f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a900: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
a910: 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  n FALSE;.  }..  
a920: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
a930: 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74  utex before cont
a940: 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63  inuing */.  winc
a950: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
a960: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
a970: 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
a980: 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
a990: 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
a9a0: 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
a9b0: 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20  s etc are .  ** 
a9c0: 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20  case-sensitive, 
a9d0: 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
a9e0: 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63  f that by upperc
a9f0: 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20  asing the mutex 
aa00: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73  name.  ** and us
aa10: 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20  ing that as the 
aa20: 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69  shared filemappi
aa30: 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ng name..  */.  
aa40: 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61  osCharUpperW(zNa
aa50: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
aa60: 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65  hared = osCreate
aa70: 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56  FileMappingW(INV
aa80: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
aa90: 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  E, NULL,.       
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
aad0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
aae0: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
ab10: 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53  Name);  ..  /* S
ab20: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
ab30: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
ab40: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
ab50: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
ab60: 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62   it .  ** must b
ab70: 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
ab80: 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65  ed */.  if (osGe
ab90: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20  tLastError() == 
aba0: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
abb0: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
abc0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
abd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
abe0: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
abf0: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
ac00: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
ac10: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
ac20: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20  map it. */.  if 
ac30: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
ac40: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  {.    pFile->sha
ac50: 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b  red = (winceLock
ac60: 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  *)osMapViewOfFil
ac70: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
ac80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ac90: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
aca0: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
acb0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
acc0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
acd0: 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
ace0: 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
acf0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
ad00: 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
ad10: 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d  .    if (!pFile-
ad20: 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20  >shared){.      
ad30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ad40: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
ad50: 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  r();.      winLo
ad60: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
ad70: 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ROR, pFile->last
ad80: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
ad90: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
ada0: 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e  teLock2", zFilen
adb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c  ame);.      osCl
adc0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
add0: 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
ade0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
adf0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
ae00: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
ae10: 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
ae20: 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
ae30: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
ae40: 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
ae50: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68    if (pFile->hSh
ae60: 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20  ared == NULL){. 
ae70: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
ae80: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
ae90: 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
aea0: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
aeb0: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
aec0: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
aed0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
aee0: 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  E;.  }.  .  /* I
aef0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
af00: 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
af10: 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
af20: 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29   */.  if (bInit)
af30: 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46   {.    memset(pF
af40: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
af50: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
af60: 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
af70: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
af80: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
af90: 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f  eturn TRUE;.}../
afa0: 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
afb0: 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
afc0: 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
afd0: 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
afe0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
aff0: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
b000: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b010: 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
b020: 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
b030: 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
b040: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
b050: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
b060: 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
b070: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
b080: 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
b090: 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
b0a0: 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
b0b0: 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
b0c0: 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
b0d0: 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
b0e0: 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
b0f0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
b100: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
b110: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
b120: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
b130: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
b140: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
b150: 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
b160: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
b170: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
b180: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
b190: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
b1a0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
b1b0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
b1c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
b1d0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
b1e0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
b1f0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
b200: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
b210: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
b220: 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
b230: 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
b240: 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
b250: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
b260: 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
b270: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
b280: 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
b290: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
b2a0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
b2b0: 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
b2c0: 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
b2d0: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
b2e0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
b2f0: 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43  ex);    .    osC
b300: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
b310: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70  ->hMutex);.    p
b320: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e  File->hMutex = N
b330: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  ULL;.  }.}../* .
b340: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
b350: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
b360: 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
b370: 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
b380: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
b390: 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e  eLockFile(.  HAN
b3a0: 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44  DLE *phFile,.  D
b3b0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
b3c0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
b3d0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
b3e0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
b3f0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
b400: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
b410: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
b420: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
b430: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
b440: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
b450: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
b460: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
b470: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
b480: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
b490: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
b4a0: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
b4b0: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
b4c0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
b4d0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
b4e0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
b4f0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
b500: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
b510: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
b520: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
b530: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
b540: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
b550: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
b560: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
b570: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
b580: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
b590: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
b5a0: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
b5b0: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
b5c0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
b5d0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
b5e0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
b5f0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
b600: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
b610: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
b620: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
b630: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
b640: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
b650: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
b660: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
b670: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
b680: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
b690: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
b6a0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
b6b0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
b6c0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
b6d0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
b6e0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
b6f0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
b700: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
b710: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
b720: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
b730: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
b740: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
b750: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
b760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
b770: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
b780: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
b790: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
b7a0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
b7b0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
b7c0: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
b7d0: 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  NG_BYTE && nNumb
b7e0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
b7f0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
b800: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
b810: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
b820: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
b830: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
b840: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
b850: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
b860: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
b870: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
b880: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
b890: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
b8a0: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
b8b0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
b8c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
b8d0: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
b8e0: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
b8f0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
b900: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
b910: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
b920: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b930: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
b940: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
b950: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
b960: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
b970: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
b980: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
b990: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b9a0: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
b9b0: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
b9c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
b9d0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
b9e0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
b9f0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
ba00: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
ba10: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
ba20: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
ba30: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
ba40: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
ba50: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
ba60: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  nceUnlockFile(. 
ba70: 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c   HANDLE *phFile,
ba80: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
ba90: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
baa0: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
bab0: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
bac0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
bad0: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
bae0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
baf0: 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
bb00: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
bb10: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
bb20: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
bb30: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
bb40: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
bb50: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
bb60: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
bb70: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
bb80: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
bb90: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
bba0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
bbb0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
bbc0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
bbd0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
bbe0: 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
bbf0: 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
bc00: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
bc10: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
bc20: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
bc30: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
bc40: 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
bc50: 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
bc60: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
bc70: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
bc80: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
bc90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
bca0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
bcb0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
bcc0: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
bcd0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
bce0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
bcf0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
bd00: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
bd10: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
bd20: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
bd30: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
bd40: 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
bd50: 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
bd60: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
bd70: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
bd80: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
bd90: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
bda0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
bdb0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
bdc0: 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75  ARED_SIZE || nNu
bdd0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
bde0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
bdf0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
be00: 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
be10: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
be20: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
be30: 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
be40: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
be50: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
be60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
be70: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
be80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
be90: 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
bea0: 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
beb0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
bec0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
bed0: 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e  ENDING_BYTE && n
bee0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
bef0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
bf00: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
bf10: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
bf20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
bf30: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
bf40: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
bf50: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
bf60: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
bf70: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
bf80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
bf90: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
bfa0: 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
bfb0: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
bfc0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
bfd0: 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
bfe0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
bff0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
c000: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
c010: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
c020: 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
c030: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
c040: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
c050: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
c060: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
c070: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
c080: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
c090: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
c0a0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
c0b0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
c0c0: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
c0d0: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
c0e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
c0f0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f  ckFileEx() API o
c100: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
c110: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
c120: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
c130: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
c140: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  e,.  DWORD dwFla
c150: 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 65  gs,.  DWORD dwRe
c160: 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 20  served,.  DWORD 
c170: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
c180: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
c190: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
c1a0: 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f  oLockHigh,.  LPO
c1b0: 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 72  VERLAPPED lpOver
c1c0: 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53  lapped.){.  UNUS
c1d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 52  ED_PARAMETER(dwR
c1e0: 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e 55 53  eserved);.  UNUS
c1f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
c200: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
c210: 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66  kHigh);..  /* If
c220: 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e 74   the caller want
c230: 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64 20  s a shared read 
c240: 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74 68  lock, forward th
c250: 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20  is call.  ** to 
c260: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f  winceLockFile */
c270: 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61 70  .  if (lpOverlap
c280: 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28  ped->Offset == (
c290: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
c2a0: 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46 6c  ST &&.      dwFl
c2b0: 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20 20  ags == 1 &&.    
c2c0: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
c2d0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
c2e0: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
c2f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  {.    return win
c300: 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  ceLockFile(phFil
c310: 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
c320: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
c330: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
c340: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
c350: 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
c360: 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
c370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3b0: 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
c3c0: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
c3d0: 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  E */../*********
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c420: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  ****.** The next
c430: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
c440: 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  es implement the
c450: 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65   I/O methods spe
c460: 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  cified.** by the
c470: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
c480: 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a  ods object..****
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
c4e0: 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66  ** Some Microsof
c4f0: 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b  t compilers lack
c500: 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e   this definition
c510: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56  ..*/.#ifndef INV
c520: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
c530: 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49  INTER.# define I
c540: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
c550: 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29  POINTER ((DWORD)
c560: 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  -1).#endif..#if 
c570: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 3d  SQLITE_OS_WINRT=
c580: 3d 30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  =0./*.** Move th
c590: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
c5a0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
c5b0: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
c5c0: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
c5d0: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
c5e0: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
c5f0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
c600: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
c610: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
c620: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
c630: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
c640: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
c650: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69  tatic int seekWi
c660: 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  nFile(winFile *p
c670: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
c680: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 20 20  t64 iOffset){.  
c690: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
c6c0: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
c6d0: 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
c6e0: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
c6f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
c700: 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
c710: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
c720: 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
c750: 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
c760: 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52  nter() */.  DWOR
c770: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
c780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
c790: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
c7a0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
c7b0: 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20  */..  upperBits 
c7c0: 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65  = (LONG)((iOffse
c7d0: 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
c7e0: 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  fff);.  lowerBit
c7f0: 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73  s = (LONG)(iOffs
c800: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
c810: 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69  ;..  /* API oddi
c820: 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75  ty: If successfu
c830: 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  l, SetFilePointe
c840: 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77  r() returns a dw
c850: 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ord .  ** contai
c860: 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33  ning the lower 3
c870: 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65  2-bits of the ne
c880: 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f  w file-offset. O
c890: 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a  r, if it fails,.
c8a0: 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20    ** it returns 
c8b0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
c8c0: 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65  _POINTER. Howeve
c8d0: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d  r according to M
c8e0: 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c  SDN, .  ** INVAL
c8f0: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
c900: 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  TER may also be 
c910: 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73  a valid new offs
c920: 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d  et. So to determ
c930: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
c940: 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  r an error has a
c950: 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65 64 2c  ctually occured,
c960: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
c970: 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20  ssary to call . 
c980: 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
c990: 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
c9a0: 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
c9b0: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
c9c0: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
c9d0: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
c9e0: 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
c9f0: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
ca00: 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
ca10: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
ca20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
ca30: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
ca40: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
ca50: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
ca60: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
ca70: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
ca80: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
ca90: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
caa0: 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69        "seekWinFi
cab0: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
cac0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  h);.    return 1
cad0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
cae0: 30 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  0;.}.#else /* if
caf0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
cb00: 3d 3d 31 20 2a 2f 0a 2f 2a 20 0a 2a 2a 20 53 61  ==1 */./* .** Sa
cb10: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 61  me function as a
cb20: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
cb30: 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  t this implement
cb40: 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 0a  ation works for.
cb50: 2a 2a 20 77 69 6e 64 6f 77 73 52 54 2e 0a 2a 2f  ** windowsRT..*/
cb60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
cb70: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
cb80: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
cb90: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
cba0: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
cbb0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
cbc0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66    /* The new off
cbd0: 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  set */.  BOOL bR
cbe0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
cbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
cc00: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
cc10: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29  tFilePointerEx()
cc20: 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72   */..  x.QuadPar
cc30: 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62  t = iOffset;.  b
cc40: 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
cc50: 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e  ointerEx(pFile->
cc60: 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45  h, x, 0, FILE_BE
cc70: 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65  GIN);..  if(!bRe
cc80: 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  t){.    pFile->l
cc90: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
cca0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
ccb0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
ccc0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
ccd0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
cce0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
ccf0: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
cd00: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
cd10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
cd20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
cd30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
cd40: 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e a file..**.** 
cd50: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
cd60: 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hat an attempt t
cd70: 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  o close a handle
cd80: 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73   might sometimes
cd90: 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20  .** fail.  This 
cda0: 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73  is a very unreas
cdb0: 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62  onable result, b
cdc0: 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f  ut Windows is no
cdd0: 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62  torious.** for b
cde0: 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c  eing unreasonabl
cdf0: 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f  e so I do not do
ce00: 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68  ubt that it migh
ce10: 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a  t happen.  If.**
ce20: 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73   the close fails
ce30: 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31  , we pause for 1
ce40: 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
ce50: 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20  and try again.  
ce60: 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58  As.** many as MX
ce70: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61  _CLOSE_ATTEMPT a
ce80: 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65  ttempts to close
ce90: 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20   the handle are 
cea0: 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67  made before.** g
ceb0: 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74  iving up and ret
cec0: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
ced0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
cee0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73  LOSE_ATTEMPT 3.s
cef0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f  tatic int winClo
cf00: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
cf10: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  *id){.  int rc, 
cf20: 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69  cnt = 0;.  winFi
cf30: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
cf40: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
cf50: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
cf60: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
cf70: 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52  Shm==0 );.  OSTR
cf80: 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
cf90: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
cfa0: 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73   do{.    rc = os
cfb0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
cfc0: 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69  e->h);.    /* Si
cfd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
cfe0: 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53  c=0; cnt=MX_CLOS
cff0: 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f  E_ATTEMPT; ); */
d000: 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30  .  }while( rc==0
d010: 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43   && ++cnt < MX_C
d020: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20  LOSE_ATTEMPT && 
d030: 28 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 31  (portableSleep(1
d040: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
d050: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
d060: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
d070: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
d080: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
d090: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
d0a0: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
d0b0: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
d0c0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
d0d0: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
d0e0: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
d0f0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
d100: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
d110: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
d120: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
d130: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
d140: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
d150: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
d160: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
d170: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
d180: 20 20 20 20 20 20 20 70 6f 72 74 61 62 6c 65 53         portableS
d190: 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
d1a0: 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
d1b0: 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
d1c0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
d1d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
d1e0: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
d1f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
d200: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
d210: 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
d220: 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
d230: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 4f 70  "failed"));.  Op
d240: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
d250: 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
d260: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
d270: 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
d280: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
d290: 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
d2a0: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
d2d0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
d2e0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
d2f0: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
d300: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
d310: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
d320: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
d330: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
d340: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
d350: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
d360: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
d370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
d380: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
d390: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
d3a0: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
d3b0: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
d3c0: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
d3d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d3e0: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
d3f0: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
d400: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
d410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d420: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
d430: 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
d440: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
d450: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
d460: 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
d470: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  fset */.){.  win
d480: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
d490: 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
d4a0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
d4b0: 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20   DWORD nRead;   
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
d4e0: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
d4f0: 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
d500: 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
d530: 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  trys */..  asser
d540: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
d550: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
d560: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d570: 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
d580: 43 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63  CE(("READ %d loc
d590: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
d5a0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
d5b0: 70 65 29 29 3b 0a 0a 20 20 69 66 28 20 73 65 65  pe));..  if( see
d5c0: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
d5d0: 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72  offset) ){.    r
d5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
d5f0: 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
d600: 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
d610: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
d620: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20   &nRead, 0) ){. 
d630: 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
d640: 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74 72  no;.    if( retr
d650: 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
d660: 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
d670: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c  ntinue;.    pFil
d680: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
d690: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65  astErrno;.    re
d6a0: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
d6b0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  (SQLITE_IOERR_RE
d6c0: 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AD, pFile->lastE
d6d0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d6e0: 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
d6f0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
d700: 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74  .  logIoerr(nRet
d710: 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  ry);.  if( nRead
d720: 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20  <(DWORD)amt ){. 
d730: 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
d740: 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
d750: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
d760: 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
d770: 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
d780: 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74  )[nRead], 0, amt
d790: 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65 74  -nRead);.    ret
d7a0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d7b0: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
d7c0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
d7d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E_OK;.}../*.** W
d7e0: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
d7f0: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
d800: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
d810: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d820: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
d830: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
d840: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
d850: 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
d860: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
d870: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
d880: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
d890: 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
d8a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8c0: 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
d8d0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
d8e0: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d900: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
d910: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
d920: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
d930: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
d940: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
d950: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
d960: 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
d970: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
d9a0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
d9b0: 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
d9c0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
d9d0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
d9e0: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
d9f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
da00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
da10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
da20: 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
da30: 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
da40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
da50: 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
da60: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
da70: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
da80: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
da90: 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
daa0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
dab0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
dac0: 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  TE %d lock=%d\n"
dad0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
dae0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
daf0: 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69    rc = seekWinFi
db00: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
db10: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
db20: 7b 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  {.    u8 *aRem =
db30: 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
db40: 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
db50: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
db60: 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
db70: 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
db80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
db90: 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
dba0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
dbb0: 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbd0: 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
dbe0: 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
dbf0: 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
dc00: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
dc10: 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
dc20: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
dc30: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
dc40: 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  */..    while( n
dc50: 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Rem>0 ){.      i
dc60: 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
dc70: 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
dc80: 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30  nRem, &nWrite, 0
dc90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
dca0: 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65   retryIoerr(&nRe
dcb0: 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
dcc0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
dcd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dce0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57    }.      if( nW
dcf0: 72 69 74 65 3c 3d 30 20 29 20 62 72 65 61 6b 3b  rite<=0 ) break;
dd00: 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
dd10: 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
dd20: 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
dd30: 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
dd40: 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
dd50: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
dd60: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
dd70: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
dd80: 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
dd90: 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
dda0: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
ddb0: 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
ddc0: 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
ddd0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
dde0: 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
ddf0: 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 72 65 74  LL )){.      ret
de00: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
de10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
de20: 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
de30: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
de40: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
de50: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
de60: 20 22 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69   "winWrite", pFi
de70: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
de80: 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72  lse{.    logIoer
de90: 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20  r(nRetry);.  }. 
dea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
deb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
dec0: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
ded0: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
dee0: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
def0: 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28  int winTruncate(
df00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
df10: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
df20: 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c  nByte){.  winFil
df30: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
df40: 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
df50: 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20  e handle object 
df60: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
df70: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
df80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
df90: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ode for this fun
dfa0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
dfb0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
dfc0: 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
dfd0: 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70  TE %d %lld\n", p
dfe0: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29  File->h, nByte))
dff0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
e000: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
e010: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
e020: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e030: 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
e040: 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
e050: 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
e060: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
e070: 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
e080: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
e090: 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
e0a0: 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
e0b0: 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
e0c0: 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
e0d0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
e0e0: 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
e0f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
e100: 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
e110: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
e120: 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
e130: 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
e140: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
e150: 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
e160: 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
e170: 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hunk;.  }..  /* 
e180: 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72  SetEndOfFile() r
e190: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
e1a0: 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c  when successful,
e1b0: 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74   or zero when it
e1c0: 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28   fails. */.  if(
e1d0: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
e1e0: 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  le, nByte) ){.  
e1f0: 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
e200: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
e210: 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
e220: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
e230: 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
e240: 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  ncate1", pFile->
e250: 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20  zPath);.  }else 
e260: 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f  if( 0==osSetEndO
e270: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
e280: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
e290: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
e2a0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
e2b0: 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
e2c0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
e2d0: 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
e2e0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
e2f0: 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
e300: 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
e310: 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  ath);.  }..  OST
e320: 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
e330: 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70  %d %lld %s\n", p
e340: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
e350: 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
e360: 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
e370: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
e380: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
e390: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e3a0: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
e3b0: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
e3c0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
e3d0: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
e3e0: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
e3f0: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
e400: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
e410: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
e420: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
e430: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
e440: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
e450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
e460: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
e470: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
e480: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
e490: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
e4a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4b0: 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
e4c0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
e4d0: 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
e4e0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
e4f0: 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
e500: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
e510: 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
e520: 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
e530: 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
e540: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
e550: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
e560: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
e570: 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28   \.    (defined(
e580: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
e590: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
e5a0: 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a  EBUG)).  /*.  **
e5b0: 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54   Used when SQLIT
e5c0: 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
e5d0: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20   defined and by 
e5e0: 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64  the assert() and
e5f0: 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45  /or.  ** OSTRACE
e600: 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f  () macros..   */
e610: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
e620: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
e630: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
e640: 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
e650: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e660: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20  ( pFile );.  /* 
e670: 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
e680: 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
e690: 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
e6a0: 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
e6b0: 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
e6c0: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
e6d0: 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
e6e0: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
e6f0: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
e700: 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
e710: 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  YNC %d lock=%d\n
e720: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
e730: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
e740: 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
e750: 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
e760: 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
e770: 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
e780: 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
e790: 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
e7a0: 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
e7b0: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
e7c0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
e7d0: 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
e7e0: 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
e7f0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
e800: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
e810: 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
e820: 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
e830: 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
e840: 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
e850: 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
e860: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
e870: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
e880: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
e890: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
e8a0: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
e8b0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
e8c0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
e8d0: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
e8e0: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
e8f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
e900: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72  _NO_SYNC.  retur
e910: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
e920: 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73  se.  rc = osFlus
e930: 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69  hFileBuffers(pFi
e940: 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61  le->h);.  Simula
e950: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41  teIOError( rc=FA
e960: 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20  LSE );.  if( rc 
e970: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e980: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
e990: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
e9a0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
e9b0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
e9c0: 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
e9d0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
e9e0: 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SYNC, pFile->las
e9f0: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
ea00: 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
ea10: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
ea20: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ea30: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
ea40: 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
ea50: 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
ea60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ea70: 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
ea80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
ea90: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
eaa0: 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
eab0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
eac0: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
ead0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
eae0: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
eaf0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
eb00: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
eb10: 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23 69 66  OERR_FSTAT);.#if
eb20: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
eb30: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54  .  {.    FILE_ST
eb40: 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f  ANDARD_INFO info
eb50: 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46  ;.    if( osGetF
eb60: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
eb70: 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e  HandleEx(pFile->
eb80: 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49  h, FileStandardI
eb90: 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c            &info,
ebc0: 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29   sizeof(info)) )
ebd0: 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
ebe0: 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e   info.EndOfFile.
ebf0: 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65  QuadPart;.    }e
ec00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
ec10: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
ec20: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
ec30: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
ec40: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
ec50: 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
ec60: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
ec90: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
eca0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
ecb0: 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
ecc0: 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44  upperBits;.    D
ecd0: 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
ece0: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
ecf0: 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42  rno;..    lowerB
ed00: 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53  its = osGetFileS
ed10: 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
ed20: 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a  pperBits);.    *
ed30: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
ed40: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
ed50: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
ed60: 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20  Bits;.    if(   
ed70: 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e  (lowerBits == IN
ed80: 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29  VALID_FILE_SIZE)
ed90: 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  .       && ((las
eda0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
edb0: 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
edc0: 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70  RROR) ){.      p
edd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ede0: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
edf0: 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
ee00: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
ee10: 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
ee20: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
ee30: 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
ee40: 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
ee50: 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
ee60: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
ee70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
ee80: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
ee90: 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
eea0: 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
eeb0: 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
eec0: 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
eed0: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
eee0: 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
eef0: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
ef00: 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
ef10: 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
ef20: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
ef30: 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
ef40: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
ef50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
ef60: 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
ef70: 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
ef80: 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
ef90: 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
efa0: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
efb0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
efc0: 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
efd0: 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
efe0: 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
eff0: 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
f000: 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
f010: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
f020: 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
f030: 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
f040: 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
f050: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
f060: 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
f070: 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
f080: 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
f090: 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
f0a0: 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
f0b0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
f0c0: 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
f0d0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
f0e0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
f0f0: 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
f100: 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
f110: 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
f120: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
f130: 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
f160: 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
f170: 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
f180: 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
f190: 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
f1a0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
f1b0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
f1c0: 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
f1d0: 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
f1e0: 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
f1f0: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
f200: 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
f210: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
f220: 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
f230: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
f240: 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
f250: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
f260: 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
f270: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
f280: 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
f290: 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
f2a0: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
f2b0: 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
f2c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
f2d0: 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
f2e0: 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
f2f0: 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c  tic int getReadL
f300: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
f310: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
f320: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
f330: 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
f340: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f350: 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
f360: 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
f370: 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
f3a0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
f3b0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
f3c0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
f3d0: 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
f3e0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
f3f0: 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
f400: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
f410: 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
f420: 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
f430: 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
f440: 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
f450: 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70   = winLockFile(p
f460: 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
f470: 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
f4a0: 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
f4b0: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
f4c0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
f4d0: 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
f4e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
f4f0: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f500: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
f510: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
f520: 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
f530: 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  k */.  }.  retur
f540: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
f550: 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a  Undo a readlock.
f560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f570: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e  lockReadLock(win
f580: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
f590: 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44  int res;.  DWORD
f5a0: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
f5b0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
f5c0: 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
f5d0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
f5e0: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
f5f0: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
f600: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f610: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
f620: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
f630: 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
f640: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
f650: 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
f660: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
f670: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
f680: 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
f690: 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
f6a0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
f6b0: 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
f6c0: 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
f6d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f6e0: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
f6f0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
f700: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
f710: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f720: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
f730: 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  "unlockReadLock"
f740: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
f750: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
f760: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
f770: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
f780: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
f790: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
f7a0: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
f7b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f7c0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
f7d0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
f7e0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
f7f0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
f800: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
f810: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
f820: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
f830: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
f840: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
f850: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
f860: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
f870: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
f880: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
f890: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
f8a0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
f8b0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
f8c0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
f8d0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
f8e0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
f8f0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
f900: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
f910: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
f920: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
f930: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
f940: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
f950: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
f960: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
f970: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
f980: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
f990: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
f9a0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
f9b0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
f9c0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f9d0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
f9e0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f9f0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
fa00: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
fa10: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
fa20: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
fa30: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
fa40: 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
fa50: 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
fa60: 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
fa70: 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
fa80: 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
fa90: 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
faa0: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
fab0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
fac0: 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
fad0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
fae0: 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
faf0: 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
fb00: 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
fb10: 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
fb20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
fb30: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fb40: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
fb50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fb60: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
fb70: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
fb80: 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
fb90: 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
fba0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
fbb0: 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
fbc0: 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
fbd0: 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
fbe0: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
fbf0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
fc00: 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
fc10: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
fc20: 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
fc30: 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
fc40: 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
fc50: 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
fc60: 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
fc70: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
fc80: 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
fc90: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
fca0: 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
fcb0: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
fcc0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25  RACE(("LOCK %d %
fcd0: 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c  d was %d(%d)\n",
fce0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
fcf0: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  e->h, locktype, 
fd00: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
fd10: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
fd20: 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20  ckByte));..  /* 
fd30: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
fd40: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
fd50: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
fd60: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
fd70: 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
fd80: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
fd90: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
fda0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
fdb0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
fdc0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
fdd0: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
fde0: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
fdf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
fe00: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
fe10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fe20: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
fe30: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
fe40: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
fe50: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
fe60: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
fe70: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
fe80: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
fe90: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
fea0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
feb0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
fec0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
fed0: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
fee0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
fef0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
ff00: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74   );..  /* Lock t
ff10: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
ff20: 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20  byte if we need 
ff30: 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e  to acquire a PEN
ff40: 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a  DING lock or.  *
ff50: 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  * a SHARED lock.
ff60: 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75    If we are acqu
ff70: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
ff80: 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69  ock, the acquisi
ff90: 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65  tion of.  ** the
ffa0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
ffb0: 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e  te is temporary.
ffc0: 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74  .  */.  newLockt
ffd0: 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
ffe0: 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28  ktype;.  if(   (
fff0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
10000 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c  =NO_LOCK).     |
10010 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d  | (   (locktype=
10020 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
10030 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46  .         && (pF
10040 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ile->locktype==R
10050 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20  ESERVED_LOCK)). 
10060 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
10070 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
10080 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
10090 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46  = winLockFile(pF
100a0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
100b0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
100f0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
10100 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
10110 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
10120 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
10130 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
10140 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
10150 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
10160 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
10170 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
10180 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
10190 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
101a0 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
101b0 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
101c0 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
101d0 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
101e0 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
101f0 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
10200 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
10210 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
10220 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
10230 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
10240 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
10250 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63       OSTRACE(("c
10260 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
10270 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
10280 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20  =%d\n", cnt));. 
10290 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 70       if( cnt ) p
102a0 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 31 29 3b  ortableSleep(1);
102b0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
102c0 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
102d0 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
102e0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
102f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10300 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
10310 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
10320 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
10330 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
10340 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
10350 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
10360 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
10370 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
10380 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
10390 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
103a0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
103b0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
103c0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
103d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
103e0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
103f0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
10400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
10410 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
10420 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
10430 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
10440 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
10450 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
10460 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
10470 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
10480 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
10490 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  e(pFile->h, SQLI
104a0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
104b0 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
104c0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
104d0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
104e0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
104f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
10500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
10510 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10520 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10530 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
10540 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
10550 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
10560 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
10570 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
10580 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
10590 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
105a0 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
105b0 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
105c0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
105d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
105e0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
105f0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
10600 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
10610 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
10620 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  ocktype>=SHARED_
10630 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
10640 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  = unlockReadLock
10650 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54  (pFile);.    OST
10660 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c 6f 63  RACE(("unreadloc
10670 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 29  k = %d\n", res))
10680 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
10690 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
106a0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
106b0 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  E_FLAGS, SHARED_
106c0 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
106f0 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
10700 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
10710 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
10720 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
10730 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
10740 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10750 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
10760 28 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  (("error-code = 
10770 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f  %d\n", lastErrno
10780 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
10790 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
107a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
107b0 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
107c0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
107d0 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
107e0 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
107f0 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
10800 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
10810 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
10820 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
10830 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
10840 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  nUnlockFile(pFil
10850 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
10860 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
10870 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
10880 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
10890 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e  lock has held in
108a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
108b0 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72  ptor then.  ** r
108c0 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
108d0 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64  riate result cod
108e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  e..  */.  if( re
108f0 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  s ){.    rc = SQ
10900 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
10910 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
10920 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74  LOCK FAILED %d t
10930 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74  rying for %d but
10940 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c   got %d\n", pFil
10950 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
10960 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
10970 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46  cktype));.    pF
10980 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10990 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
109a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
109b0 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
109c0 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65  ocktype = (u8)ne
109d0 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74  wLocktype;.  ret
109e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
109f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
10a00 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
10a10 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
10a20 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
10a30 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
10a40 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
10a50 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
10a60 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
10a70 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e  eld, return.** n
10a80 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  on-zero, otherwi
10a90 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  se zero..*/.stat
10aa0 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52  ic int winCheckR
10ab0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
10ac0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
10ad0 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
10ae0 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65  nt rc;.  winFile
10af0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
10b00 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
10b10 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
10b20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10b30 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
10b40 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
10b50 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   id!=0 );.  if( 
10b60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
10b70 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
10b80 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
10b90 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
10ba0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28   WR-LOCK %d %d (
10bb0 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
10bc0 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c  ->h, rc));.  }el
10bd0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  se{.    rc = win
10be0 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
10bf0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
10c00 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
10c10 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
10c20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10c30 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  .      winUnlock
10c40 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
10c50 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
10c60 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
10c70 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20    rc = !rc;.    
10c80 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
10c90 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65  R-LOCK %d %d (re
10ca0 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
10cb0 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20  >h, rc));.  }.  
10cc0 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
10cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
10cf0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
10d00 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
10d10 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
10d20 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
10d30 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
10d40 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
10d50 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
10d60 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
10d70 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
10d80 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
10d90 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
10da0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
10db0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
10dc0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
10dd0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
10de0 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
10df0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
10e00 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
10e10 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
10e20 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
10e30 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
10e40 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
10e50 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
10e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10e70 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
10e80 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
10e90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
10ea0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10eb0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10ec0 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
10ed0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
10ee0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
10ef0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10f00 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
10f10 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
10f20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
10f30 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
10f40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
10f50 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73  OCK %d to %d was
10f60 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c   %d(%d)\n", pFil
10f70 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
10f80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
10f90 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
10fa0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
10fb0 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
10fc0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
10fd0 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
10fe0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
10ff0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46  winUnlockFile(pF
11000 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
11010 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
11020 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
11030 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
11040 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
11050 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
11060 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
11070 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
11080 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
11090 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
110a0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
110b0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
110c0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
110d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
110e0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
110f0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
11100 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
11110 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
11120 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
11130 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
11140 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
11150 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
11160 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
11170 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
11180 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
11190 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
111a0 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
111b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
111c0 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63     unlockReadLoc
111d0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
111e0 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
111f0 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  G_LOCK ){.    wi
11200 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  nUnlockFile(pFil
11210 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
11220 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
11230 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
11240 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
11250 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
11260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
11270 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
11280 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
11290 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
112a0 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
112b0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
112c0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
112d0 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
112e0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
112f0 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
11300 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
11310 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
11320 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
11330 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
11340 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
11350 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
11360 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
11370 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
11380 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
11390 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
113a0 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
113b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
113c0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
113d0 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
113e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
113f0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
11400 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
11410 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
11420 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
11430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  .}../*.** Contro
11440 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
11450 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
11460 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
11470 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
11480 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
11490 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
114a0 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
114b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
114c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
114d0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
114e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
114f0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
11500 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
11510 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11520 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
11530 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
11540 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11550 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
11560 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
11570 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
11580 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
11590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
115a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
115b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
115c0 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
115d0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
115e0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
115f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11600 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
11610 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
11620 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
11630 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
11640 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
11650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
11660 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
11670 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
11680 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
11690 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
116a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
116b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
116c0 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
116d0 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
116e0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
116f0 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
11700 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
11710 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
11720 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
11730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
11740 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
11750 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
11760 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11770 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
11780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11790 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
117a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
117b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
117c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
117d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
117e0 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
117f0 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
11800 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
11810 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
11820 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
11830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11850 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
11860 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
11870 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
11880 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
11890 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
118a0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
118b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
118c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
118d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
118e0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
118f0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
11900 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 77 69  ite3_mprintf("wi
11910 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72 65 74  n32");.      ret
11920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11930 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
11940 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
11950 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
11960 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
11970 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
11980 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
11990 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
119a0 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  try = a[0];.    
119b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
119c0 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[0] = win32Ioe
119d0 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
119e0 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
119f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
11a00 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
11a10 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
11a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
11a30 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72  [1] = win32Ioerr
11a40 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
11a50 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
11a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
11a70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
11a80 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
11a90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11aa0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
11ab0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
11ac0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
11ad0 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
11ae0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
11af0 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
11b00 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
11b10 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
11b20 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
11b30 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
11b40 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
11b50 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
11b60 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
11b70 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
11b80 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
11b90 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
11ba0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
11bb0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
11bc0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
11bd0 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
11be0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
11bf0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
11c00 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
11c10 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
11c20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
11c30 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
11c40 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
11c50 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74   (void)id;.  ret
11c60 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
11c70 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
11c80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c90 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
11ca0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
11cb0 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
11cc0 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
11cd0 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
11ce0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11cf0 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69  winFile *p = (wi
11d00 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74  nFile*)id;.  ret
11d10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
11d20 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
11d30 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20  N_OPEN |.       
11d40 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73    ((p->ctrlFlags
11d50 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29   & WINFILE_PSOW)
11d60 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f  ?SQLITE_IOCAP_PO
11d70 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
11d80 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E:0);.}..#ifndef
11d90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11da0 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73  ../* .** Windows
11db0 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79   will only let y
11dc0 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20 76  ou create file v
11dd0 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20  iew mappings.** 
11de0 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  on allocation si
11df0 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62  ze granularity b
11e00 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75  oundaries..** Du
11e10 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f  ring sqlite3_os_
11e20 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20 47  init() we do a G
11e30 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a  etSystemInfo().*
11e40 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72 61  * to get the gra
11e50 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a  nularity size..*
11e60 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69  /.SYSTEM_INFO wi
11e70 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a  nSysInfo;../*.**
11e80 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
11e90 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
11ea0 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
11eb0 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
11ec0 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
11ed0 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
11ee0 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49  ect the winLockI
11ef0 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64  nfo objects used
11f00 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c   by .** this fil
11f10 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
11f20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
11f30 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
11f40 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
11f50 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
11f60 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
11f70 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
11f80 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
11f90 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
11fa0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
11fb0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
11fc0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
11fd0 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
11fe0 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
11ff0 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  **   winShmEnter
12000 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
12010 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
12020 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
12030 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
12040 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x().*/.static vo
12050 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  id winShmEnterMu
12060 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
12070 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12080 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
12090 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
120a0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
120b0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
120c0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
120d0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
120e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
120f0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12100 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12110 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
12120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
12130 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  UG.static int wi
12140 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f  nShmMutexHeld(vo
12150 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
12160 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12170 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
12180 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12190 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
121a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
121b0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
121c0 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e   represent a sin
121d0 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  gle file opened 
121e0 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70  and mmapped to p
121f0 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64  rovide.** shared
12200 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d   memory.  When m
12210 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
12220 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
12230 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75  e same.** log-su
12240 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65  mmary, each thre
12250 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77  ad has its own w
12260 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  inFile object, b
12270 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
12280 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
12290 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
122a0 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
122b0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
122c0 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
122d0 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
122e0 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
122f0 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  **.** winShmMute
12300 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
12310 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
12320 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
12330 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
12340 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
12350 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
12360 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
12370 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
12380 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20  f.**      pNext 
12390 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
123a0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
123b0 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
123c0 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
123d0 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
123e0 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
123f0 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
12400 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ither winShmNode
12410 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
12420 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64  eld or winShmNod
12430 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
12440 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
12450 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
12460 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
12470 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
12480 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
12490 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73  ructure..**.*/.s
124a0 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
124b0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   {.  sqlite3_mut
124c0 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
124d0 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
124e0 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
124f0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
12500 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
12510 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12520 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  le */.  winFile 
12530 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  hFile;          
12540 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
12550 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a  e from winOpen *
12560 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  /..  int szRegio
12570 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12580 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
12590 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
125a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f   */.  int nRegio
125b0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
125c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
125d0 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
125e0 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
125f0 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d   {.    HANDLE hM
12600 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
12610 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
12620 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61  rom CreateFileMa
12630 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69  pping */.    voi
12640 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52  d *pMap;.  } *aR
12650 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c  egion;.  DWORD l
12660 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
12670 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
12680 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
12690 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
126a0 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b   */..  int nRef;
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
126d0 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
126e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
126f0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72  /.  winShm *pFir
12700 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
12710 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a  * All winShm obj
12720 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
12730 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
12740 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20  mNode *pNext;   
12750 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e        /* Next in
12760 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e   list of all win
12770 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20  ShmNode objects 
12780 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
12790 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74  _DEBUG.  u8 next
127a0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
127b0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
127c0 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20  lable winShm.id 
127d0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
127e0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  };../*.** A glob
127f0 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20  al array of all 
12800 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
12810 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69  ts..**.** The wi
12820 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
12830 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69  must be true whi
12840 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
12850 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e  iting this list.
12860 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68  .*/.static winSh
12870 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64  mNode *winShmNod
12880 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
12890 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
128a0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
128b0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
128c0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
128d0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
128e0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
128f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
12900 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
12910 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
12920 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
12930 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
12940 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
12950 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
12960 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d  *    winShm.pShm
12970 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68  Node.**    winSh
12980 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
12990 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
129a0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
129b0 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
129c0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
129d0 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
129e0 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
129f0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
12a00 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20  /.struct winShm 
12a10 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
12a20 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f  pShmNode;      /
12a30 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
12a40 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
12a50 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ct */.  winShm *
12a60 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
12a70 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68     /* Next winSh
12a80 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
12a90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
12aa0 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
12ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12ac0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
12ad0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74  e winShmNode mut
12ae0 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  ex */.  u16 shar
12af0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
12b00 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
12b10 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
12b20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
12b30 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12b40 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
12b50 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
12b60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
12b70 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20  _DEBUG.  u8 id; 
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
12ba0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
12bb0 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
12bc0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
12bd0 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
12be0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
12bf0 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
12c00 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
12c10 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
12c20 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
12c30 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
12c40 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
12c50 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
12c60 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
12c70 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
12c80 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
12c90 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
12ca0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
12cb0 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
12cc0 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
12cd0 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
12ce0 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
12cf0 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
12d00 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
12d10 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
12d20 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
12d30 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
12d40 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
12d50 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
12d60 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
12d70 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
12d80 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
12d90 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
12da0 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
12db0 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
12dc0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
12dd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
12de0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
12df0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
12e00 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
12e10 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
12e20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12e30 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
12e40 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nlock */.){.  in
12e50 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
12e60 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12e70 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
12e80 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
12e90 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
12ea0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
12eb0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
12ec0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
12ed0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
12ee0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12ef0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
12f00 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
12f10 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73   );..  /* Releas
12f20 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
12f30 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
12f40 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
12f50 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
12f60 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
12f70 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
12f80 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c  File.h, ofst, 0,
12f90 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65   nByte, 0);.  }e
12fa0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
12fb0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
12fc0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
12fd0 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61  .    DWORD dwFla
12fe0 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
12ff0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
13000 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
13010 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
13020 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
13030 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
13040 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
13050 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nLockFile(pFile-
13060 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
13070 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  s, ofst, 0, nByt
13080 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  e, 0);.  }.  .  
13090 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20  if( rc!= 0 ){.  
130a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
130b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
130c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
130d0 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  =  osGetLastErro
130e0 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
130f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
13100 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
13110 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78  LOCK %d %s %s 0x
13120 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20  %08lx\n", .     
13130 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
13140 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
13150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
13160 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
13170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
13180 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
13190 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45  K ? "UnlockFileE
131a0 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78  x" : "LockFileEx
131b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
131c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29  ile->lastErrno))
131d0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
131e0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
131f0 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
13200 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69  methods */.stati
13210 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71  c int winOpen(sq
13220 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74  lite3_vfs*,const
13230 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66   char*,sqlite3_f
13240 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a  ile*,int,int*);.
13250 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
13260 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
13270 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69   *,const char*,i
13280 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  nt);../*.** Purg
13290 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  e the winShmNode
132a0 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
132b0 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69   entries with wi
132c0 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
132d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
132e0 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
132f0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
13300 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
13310 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
13320 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
13330 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
13340 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13350 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69  winShmPurge(sqli
13360 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
13370 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a  nt deleteFlag){.
13380 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70    winShmNode **p
13390 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  p;.  winShmNode 
133a0 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a  *p;.  BOOL bRc;.
133b0 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
133c0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
133d0 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
133e0 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
133f0 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
13400 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
13410 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
13420 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
13430 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
13440 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
13450 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tex);.      for(
13460 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
13470 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
13480 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69   bRc = osUnmapVi
13490 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67  ewOfFile(p->aReg
134a0 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20  ion[i].pMap);.  
134b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
134c0 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
134d0 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64   unmap region=%d
134e0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
134f0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
13500 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
13510 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
13520 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
13530 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
13540 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  ));.        bRc 
13550 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
13560 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d  p->aRegion[i].hM
13570 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
13580 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
13590 20 70 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65   pid-%d close re
135a0 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
135d0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
135e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135f0 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22    bRc ? "ok" : "
13600 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
13610 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
13620 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41 4c  hFile.h != INVAL
13630 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
13640 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
13650 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
13660 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
13670 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
13680 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
13690 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
136a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
136b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
136c0 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
136d0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
136e0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
136f0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
13700 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
13710 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
13720 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
13730 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
13740 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
13750 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
13760 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
13770 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
13780 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
13790 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
137a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
137b0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
137c0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
137d0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
137e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
137f0 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
13800 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13810 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
13820 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
13830 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
13840 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
13850 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
13860 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
13870 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
13880 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
13890 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
138a0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
138b0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
138c0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
138d0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
138e0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
138f0 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
13900 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
13910 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
13920 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
13930 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
13940 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
13950 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
13960 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
13970 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13980 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
13990 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
139a0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
139b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
139c0 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
139d0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
139e0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
139f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
13a20 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
13a30 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
13a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
13a50 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
13a60 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
13a70 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
13aa0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
13ab0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
13ac0 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
13ad0 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
13ae0 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
13af0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
13b00 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
13b10 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
13b20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
13b30 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
13b40 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
13b50 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
13b60 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
13b70 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
13b80 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
13b90 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
13ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13bb0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ERR_NOMEM;.  mem
13bc0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
13bd0 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d  (*p));.  nName =
13be0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13bf0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
13c00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
13c10 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
13c20 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61  *pShmNode) + nNa
13c30 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28  me + 17 );.  if(
13c40 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
13c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
13c60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13c70 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
13c80 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
13c90 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
13ca0 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  ew) + nName + 17
13cb0 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  );.  pNew->zFile
13cc0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
13cd0 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
13ce0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
13cf0 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
13d00 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
13d10 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
13d20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
13d30 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
13d40 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
13d50 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  e); ..  /* Look 
13d60 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
13d70 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
13d80 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
13d90 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
13da0 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
13db0 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
13dc0 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
13dd0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
13de0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
13df0 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
13e00 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
13e10 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
13e20 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
13e30 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
13e40 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
13e50 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
13e60 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
13e70 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
13e80 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
13e90 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
13ea0 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
13eb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
13ec0 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
13ed0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
13ee0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
13ef0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
13f00 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
13f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13f20 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
13f30 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
13f40 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
13f50 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
13f60 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
13f70 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
13f80 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
13f90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
13fa0 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
13fb0 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
13fc0 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
13fd0 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
13fe0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
13ff0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
14000 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
14010 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
14020 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
14030 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
14040 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
14050 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
14060 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
14070 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
14080 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20  n(pDbFd->pVfs,. 
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
140b0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
140c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
140d0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
14100 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
14110 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ,  /* File handl
14120 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20  e here */.      
14130 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14140 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c  E_OPEN_WAL | SQL
14150 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
14160 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
14170 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64 65  _CREATE, /* Mode
14180 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20 20   flags */.      
14190 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
141a0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
141b0 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  !=rc ){.      go
141c0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
141d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
141e0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
141f0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
14200 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
14210 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
14220 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
14230 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
14240 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
14250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14260 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
14270 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
14280 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
14290 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
142a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
142b0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
142c0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
142d0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
142e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
142f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14300 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
14310 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14320 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
14330 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14350 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62  winOpenShm", pDb
14360 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
14370 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14390 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53  ){.      winShmS
143a0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
143b0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
143c0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
143d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
143e0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
143f0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
14400 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
14410 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
14420 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
14430 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
14440 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
14460 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ild of the winSh
14470 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
14480 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
14490 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
144a0 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
144b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
144c0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
144d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
144e0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
144f0 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65   = p;.  winShmLe
14500 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
14510 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
14520 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
14530 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
14540 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
14550 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
14560 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ver of the winSh
14570 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  mEnterMutex() mu
14580 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
14590 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
145a0 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69  * new (struct wi
145b0 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  nShm) object to 
145c0 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
145d0 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
145e0 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
145f0 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
14600 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
14610 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
14620 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
14630 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
14640 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
14650 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
14660 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
14670 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
14680 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
14690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
146a0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
146b0 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
146c0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
146d0 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
146e0 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
146f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14700 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
14710 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
14720 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
14730 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
14740 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
14750 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
14760 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
14770 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
14780 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
14790 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28  ;.  winShmPurge(
147a0 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b  pDbFd->pVfs, 0);
147b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
147c0 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
147d0 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
147e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
147f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
14800 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53  ee(pNew);.  winS
14810 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
14820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14830 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
14840 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
14850 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
14860 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
14870 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
14880 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
14890 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
148a0 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
148b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
148c0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
148d0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
148e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
148f0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
14900 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
14910 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
14920 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
14930 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
14940 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
14950 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
14960 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
14970 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
14980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14990 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
149a0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
149b0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
149c0 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
149d0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
149e0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
149f0 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
14a00 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
14a10 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
14a20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
14a30 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
14a40 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
14a50 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
14a60 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
14a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
14a80 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
14a90 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
14aa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
14ab0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
14ac0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
14ad0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
14ae0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
14af0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14b00 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
14b10 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
14b20 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
14b30 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
14b40 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
14b50 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
14b60 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
14b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
14b80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14b90 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
14ba0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
14bb0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
14bc0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
14bd0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
14be0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
14bf0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
14c00 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
14c10 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
14c20 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
14c30 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
14c40 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
14c50 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
14c60 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
14c70 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
14c80 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
14c90 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
14ca0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
14cb0 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
14cc0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
14cd0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
14ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14cf0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
14d00 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
14d10 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
14d20 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
14d30 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
14d40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
14d50 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
14d60 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
14d70 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
14d80 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
14d90 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
14da0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
14db0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
14dc0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
14dd0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14df0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
14e00 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
14e10 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
14e20 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
14e30 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
14e40 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
14e50 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
14e60 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
14e70 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
14e80 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
14e90 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
14ea0 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
14eb0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
14ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14ed0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
14ee0 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
14ef0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
14f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14f20 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
14f30 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
14f40 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
14f50 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
14f60 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
14f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
14fa0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
14fd0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
14fe0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
14ff0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
15000 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
15010 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
15020 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
15030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
15040 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
15050 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
15060 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
15070 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
15080 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
15090 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
150a0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
150b0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
150c0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
150d0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
150e0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
150f0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
15100 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
15110 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
15120 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
15130 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
15140 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
15150 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
15160 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
15170 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
15180 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
15190 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
151a0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
151b0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
151c0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
151d0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
151e0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
151f0 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
15200 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
15210 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
15220 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
15230 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
15240 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
15250 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
15260 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
15270 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
15280 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
15290 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
152a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
152b0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
152c0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
152d0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
152e0 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
152f0 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
15300 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
15310 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
15320 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
15330 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
15340 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
15350 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
15360 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
15370 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
15380 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
15390 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
153a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
153b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
153c0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
153d0 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
153e0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
153f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15400 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
15410 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
15420 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
15430 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
15440 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
15450 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
15460 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
15470 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
15480 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
15490 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
154a0 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
154b0 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
154c0 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
154d0 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
154e0 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
154f0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
15500 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
15510 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
15520 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
15530 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
15540 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
15550 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
15560 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
15570 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
15580 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
15590 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
155a0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
155b0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
155c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
155d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
155e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
155f0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
15600 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
15610 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
15620 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
15630 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
15640 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
15650 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
15660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
15680 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
15690 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
156a0 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
156b0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
156c0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73   _SHM_RDLCK, ofs
156d0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
156e0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
156f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
15700 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
15710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
15720 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
15730 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
15740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
15760 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
15770 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
15780 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
15790 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
157a0 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
157b0 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
157c0 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
157d0 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
157e0 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
157f0 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
15800 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
15810 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
15820 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
15830 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
15840 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
15850 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
15860 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
15870 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
15880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15890 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
158a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
158b0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
158c0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
158d0 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
158e0 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
158f0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
15900 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
15910 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
15920 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
15930 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
15940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
15960 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
15970 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
15980 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _WRLCK, ofst+WIN
15990 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
159a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
159b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
159c0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
159d0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
159e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
159f0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
15a00 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
15a10 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
15a20 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
15a30 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
15a40 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
15a50 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
15a60 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
15a70 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  x %s\n",.       
15a80 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29      p->id, (int)
15a90 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15aa0 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61 72  essId(), p->shar
15ab0 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
15ac0 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
15ad0 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
15ae0 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
15af0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
15b00 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
15b10 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
15b20 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
15b30 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
15b40 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
15b50 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
15b60 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
15b70 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
15b80 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
15b90 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
15ba0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
15bb0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
15bc0 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
15bd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
15be0 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
15bf0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
15c00 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
15c10 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
15c20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
15c30 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
15c40 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
15c50 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
15c60 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
15c70 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
15c80 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
15c90 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
15ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15cb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15cc0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
15cd0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
15ce0 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
15cf0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
15d00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
15d10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15d20 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
15d30 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
15d40 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
15d50 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
15d60 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
15d70 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
15d80 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
15d90 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
15da0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15db0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
15dc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
15dd0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
15de0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
15df0 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
15e00 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
15e10 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
15e20 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
15e30 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
15e40 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
15e50 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
15e60 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
15e70 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
15e80 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
15e90 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
15ea0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
15eb0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
15ec0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
15ed0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
15ee0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
15ef0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
15f00 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
15f10 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
15f20 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
15f30 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15f40 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
15f50 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
15f60 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
15f70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
15f80 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
15f90 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
15fa0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
15fb0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
15fc0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
15fd0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
15fe0 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
15ff0 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
16000 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
16010 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
16020 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
16030 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
16040 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
16050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16060 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
16070 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
16080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
16090 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
160a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
160b0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
160e0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
160f0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
16100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
16110 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
16120 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
16150 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
16160 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
16170 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
16180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16190 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
161a0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
161b0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
161c0 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
161d0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
161e0 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
161f0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
16200 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16210 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
16220 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
16230 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
16240 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
16250 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16260 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
16270 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
16280 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
16290 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
162a0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
162b0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
162c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
162d0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
162e0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
162f0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
16300 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
16310 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
16320 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
16330 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
16340 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
16350 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
16360 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
16370 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
16380 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
16390 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
163a0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
163b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
163c0 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
163d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
163e0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
163f0 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
16400 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
16410 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
16420 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
16430 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
16440 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
16450 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
16460 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
16470 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
16480 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
16490 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
164a0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
164b0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
164c0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
164d0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
164e0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
164f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
16500 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
16510 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
16520 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
16530 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
16540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16550 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
16560 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16570 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
16580 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
165a0 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
165b0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
165c0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
165d0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
165e0 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
165f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
16600 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
16610 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
16620 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
16630 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
16640 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
16650 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
16660 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
16670 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
16680 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
16690 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
166a0 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
166b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
166c0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
166d0 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
166e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
166f0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
16700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16710 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
16720 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
16730 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
16740 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
16750 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
16760 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
16770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16790 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
167a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
167b0 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
167c0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
167d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
167e0 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
167f0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
16800 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
16810 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
16820 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
16830 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
16840 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
16850 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
16860 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
16870 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
16880 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
16890 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
168a0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
168b0 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
168c0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
168d0 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
168e0 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
168f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16900 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
16910 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
16920 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
16930 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
16940 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
16950 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
16960 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
16970 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
16980 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
16990 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
169a0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
169b0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
169c0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
169d0 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
169e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
169f0 20 20 20 20 20 0a 20 20 20 20 20 20 68 4d 61 70       .      hMap
16a00 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
16a10 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d  apping(pShmNode-
16a20 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20  >hFile.h, .     
16a30 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
16a40 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
16a50 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
16a60 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
16a70 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25  (("SHM-MAP pid-%
16a80 64 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e 3d  d create region=
16a90 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e  %d nbyte=%d %s\n
16aa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16ab0 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
16ac0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16ad0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
16ae0 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
16af0 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
16b00 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
16b20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
16b30 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
16b40 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
16b50 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
16b60 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
16b70 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
16b80 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
16b90 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
16ba0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
16bb0 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70  NRT.        pMap
16bc0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
16bd0 6c 65 45 78 28 68 4d 61 70 2c 20 46 49 4c 45 5f  leEx(hMap, FILE_
16be0 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
16bf0 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
16c00 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65         0, iOffse
16c10 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
16c20 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
16c30 66 73 65 74 53 68 69 66 74 2c 20 4e 55 4c 4c 0a  fsetShift, NULL.
16c40 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
16c50 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
16c60 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
16c70 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
16c80 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
16c90 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
16ca0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
16cb0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
16cc0 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
16cd0 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
16ce0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
16cf0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
16d00 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69   pid-%d map regi
16d10 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20  on=%d offset=%d 
16d20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  size=%d %s\n",. 
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
16d50 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
16d60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
16d70 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
16d80 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
16d90 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
16da0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
16db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16dc0 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
16dd0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
16de0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
16df0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
16e00 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
16e10 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
16e20 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
16e30 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16e50 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46  inShmMap3", pDbF
16e60 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
16e70 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73     if( hMap ) os
16e80 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70  CloseHandle(hMap
16e90 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
16ea0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
16eb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d     }..      pShm
16ec0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
16ed0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
16ee0 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  .pMap = pMap;.  
16ef0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
16f00 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
16f10 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20  nRegion].hMap = 
16f20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  hMap;.      pShm
16f30 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
16f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
16f50 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
16f60 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
16f70 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
16f80 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52  int iOffset = iR
16f90 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
16fa0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
16fb0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
16fc0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
16fd0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
16fe0 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ity;.    char *p
16ff0 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e   = (char *)pShmN
17000 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65  ode->aRegion[iRe
17010 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20  gion].pMap;.    
17020 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  *pp = (void *)&p
17030 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a  [iOffsetShift];.
17040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
17050 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
17060 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17070 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
17080 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17090 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
170a0 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30   winShmMap     0
170b0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
170c0 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
170d0 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  ne winShmBarrier
170e0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
170f0 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
17100 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
17110 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
17120 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
17130 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
17140 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
17150 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
17160 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
17180 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
17190 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17200 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
17210 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
17220 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
17230 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
17240 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
17250 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
17260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
17270 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
17280 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
17290 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20   = {.  2,       
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
172c0 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
172d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
172e0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
172f0 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
17320 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
17350 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17370 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
17380 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
173b0 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173d0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
173e0 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
17410 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
17440 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
17450 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
17460 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
17470 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
17480 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
174a0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
174b0 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
174c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
174d0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
174e0 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
174f0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
17500 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
17510 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
17520 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
17530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17540 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
17550 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
17560 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
17570 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
17580 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
17590 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
175a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
175b0 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
175c0 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20  hmUnmap         
175d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
175e0 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a  ShmUnmap */.};..
175f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
17660 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
17670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
17690 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
176a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
176b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
176c0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
176d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
176e0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ect..*/../*.** C
176f0 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
17700 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
17710 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
17720 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
17730 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
17740 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
17750 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
17760 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
17770 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
17780 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
17790 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
177a0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
177b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
177c0 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38  oid *convertUtf8
177d0 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
177e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
177f0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
17800 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  ted = 0;.  if( i
17810 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
17820 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f  nverted = utf8To
17830 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
17840 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
17850 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
17860 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
17870 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
17880 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
17890 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61  _to_mbcs(zFilena
178a0 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
178b0 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
178c0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
178d0 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
178e0 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
178f0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
17900 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
17910 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
17920 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
17930 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
17940 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68   at pVfs->mxPath
17950 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e  name characters.
17960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
17970 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
17980 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
17990 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
179a0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
179b0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
179c0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
179d0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
179e0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
179f0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
17a00 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
17a10 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d  char zTempPath[M
17a20 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f  AX_PATH+2];..  /
17a30 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
17a40 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
17a50 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
17a60 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
17a70 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
17a80 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
17a90 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
17aa0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
17ab0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
17ac0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
17ad0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
17ae0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
17af0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
17b00 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50  .  memset(zTempP
17b10 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48  ath, 0, MAX_PATH
17b20 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  +2);..  if( sqli
17b30 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
17b40 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
17b50 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
17b60 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
17b70 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  h, "%s", sqlite3
17b80 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
17b90 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54  ;.  }.#if !SQLIT
17ba0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c 73  E_OS_WINRT.  els
17bb0 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a  e if( isNT() ){.
17bc0 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69      char *zMulti
17bd0 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64  ;.    WCHAR zWid
17be0 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  ePath[MAX_PATH];
17bf0 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61  .    osGetTempPa
17c00 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  thW(MAX_PATH-30,
17c10 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20   zWidePath);.   
17c20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64   zMulti = unicod
17c30 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74  eToUtf8(zWidePat
17c40 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c  h);.    if( zMul
17c50 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ti ){.      sqli
17c60 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
17c70 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
17c80 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74  ath, "%s", zMult
17c90 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
17ca0 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a  3_free(zMulti);.
17cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17cd0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
17ce0 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
17cf0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
17d00 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
17d10 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
17d20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
17d30 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73  AX_PATH];.    os
17d40 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58  GetTempPathA(MAX
17d50 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50  _PATH-30, zMbcsP
17d60 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20  ath);.    zUtf8 
17d70 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
17d80 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62  mbcs_to_utf8(zMb
17d90 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  csPath);.    if(
17da0 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20   zUtf8 ){.      
17db0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
17dc0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
17dd0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
17de0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
17df0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
17e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17e10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17e20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
17e30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
17e40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
17e50 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
17e60 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
17e70 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
17e80 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
17e90 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
17ea0 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
17eb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
17ec0 20 2a 2f 0a 20 20 69 66 28 20 28 73 71 6c 69 74   */.  if( (sqlit
17ed0 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
17ee0 50 61 74 68 29 20 2b 20 73 71 6c 69 74 65 33 53  Path) + sqlite3S
17ef0 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
17f00 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
17f10 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29   + 18) >= nBuf )
17f20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17f30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
17f40 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53    for(i=sqlite3S
17f50 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
17f60 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70  h); i>0 && zTemp
17f70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b  Path[i-1]=='\\';
17f80 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50   i--){}.  zTempP
17f90 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73  ath[i] = 0;..  s
17fa0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
17fb0 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 0a 20  nBuf-18, zBuf,. 
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54    "%s\\"SQLITE_T
17fe0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
17ff0 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a   zTempPath);.  j
18000 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
18010 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
18020 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
18030 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
18040 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
18050 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
18060 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
18070 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
18080 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
18090 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
180a0 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
180b0 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
180c0 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  +1] = 0;..  OSTR
180d0 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e  ACE(("TEMP FILEN
180e0 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66  AME: %s\n", zBuf
180f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
18100 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
18110 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
18120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18130 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
18140 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
18150 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f    /* Not used */
18160 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18170 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
18180 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
18190 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
181a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
181b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
181c0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
181d0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
181e0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
181f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18200 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
18210 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
18220 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
18230 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
18240 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
18250 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
18260 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52  astErrno;.  DWOR
18270 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
18280 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
18290 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
182a0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
182b0 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
182c0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
182d0 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
182e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
182f0 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
18300 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
18310 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
18320 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
18330 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
18340 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
18350 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
18360 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
18370 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
18380 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
18390 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
183a0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
183b0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
183c0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
183d0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
183e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
183f0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
18400 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
18410 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
18420 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
18430 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
18440 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
18450 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
18460 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42  ATH+2];     /* B
18470 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72  uffer used to cr
18480 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61  eate temp filena
18490 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  me */..  int rc 
184a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
184b0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
184c0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
184d0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
184e0 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
184f0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
18500 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
18510 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
18520 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
18530 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
18540 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
18550 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
18560 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
18570 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
18580 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
18590 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
185a0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
185b0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
185c0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
185d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
185e0 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
185f0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
18600 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
18610 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
18620 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  NLY);.#endif.  i
18630 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
18640 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
18650 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18660 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
18670 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
18680 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
18690 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
186a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
186b0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
186c0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
186d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
186e0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
186f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
18700 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
18710 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
18720 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
18730 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
18740 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
18750 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
18760 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
18770 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
18780 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
18790 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
187a0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
187b0 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
187c0 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
187d0 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
187e0 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
187f0 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
18800 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
18810 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
18820 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
18830 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
18840 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
18850 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
18860 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
18870 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
18880 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
18890 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
188a0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
188b0 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
188c0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
188d0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
188e0 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
188f0 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
18900 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
18910 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
18920 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
18930 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
18940 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
18950 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
18960 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
18970 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
18980 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
18990 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
189a0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
189b0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
189c0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
189d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
189e0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
189f0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
18a00 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
18a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18a20 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
18a30 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
18a40 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
18a50 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
18a60 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
18a70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
18a80 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
18a90 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
18aa0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
18ab0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
18ac0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
18ad0 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
18ae0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
18af0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
18b00 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
18b10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
18b20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
18b30 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
18b40 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
18b50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18b60 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
18b70 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
18b80 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
18b90 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
18ba0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
18bb0 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
18bc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
18bd0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
18be0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
18bf0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
18c00 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
18c10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
18c20 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73  _WAL.  );..  ass
18c30 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
18c40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18c50 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65  (pVfs);..  pFile
18c60 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
18c70 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f  NDLE_VALUE;..  /
18c80 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
18c90 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
18ca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
18cb0 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
18cc0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
18cd0 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
18ce0 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
18cf0 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  8Name ){.    ass
18d00 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
18d10 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b  !isOpenJournal);
18d20 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d  .    rc = getTem
18d30 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32  pname(MAX_PATH+2
18d40 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
18d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18d80 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
18d90 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
18da0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
18db0 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
18dc0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
18dd0 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
18de0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
18df0 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
18e00 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
18e10 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
18e20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
18e30 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
18e40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
18e50 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
18e60 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
18e70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
18e80 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
18e90 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72     zUtf8Name[str
18ea0 6c 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  len(zUtf8Name)+1
18eb0 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
18ec0 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
18ed0 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
18ee0 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
18ef0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
18f00 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
18f10 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
18f20 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
18f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18f40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
18f50 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  M;.  }..  if( is
18f60 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
18f70 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
18f80 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
18f90 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
18fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
18fb0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
18fc0 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
18fd0 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
18fe0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
18ff0 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
19000 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
19010 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61  le is .  ** crea
19020 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
19030 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
19040 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
19050 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20  e access" .  ** 
19060 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
19070 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
19080 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  /.  if( isExclus
19090 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ive ){.    /* Cr
190a0 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65  eates a new file
190b0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65  , only if it doe
190c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
190d0 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  ist. */.    /* I
190e0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
190f0 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  s, it fails. */.
19100 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
19110 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41  sposition = CREA
19120 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20  TE_NEW;.  }else 
19130 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
19140 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
19150 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
19160 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
19170 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
19180 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
19190 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
191a0 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
191b0 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
191c0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
191d0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
191e0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
191f0 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
19200 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61  NG;.  }..  dwSha
19210 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
19220 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
19230 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
19240 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
19250 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
19260 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
19270 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
19280 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
19290 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
192a0 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
192b0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
192c0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
192d0 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
19300 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
19310 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
19340 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
19350 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
19360 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
19370 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
19380 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
19390 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
193a0 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
193b0 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
193c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
193d0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
193e0 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
193f0 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
19400 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
19410 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
19420 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
19430 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
19440 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
19450 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
19460 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
19470 4e 54 28 29 20 29 7b 0a 20 20 20 20 77 68 69 6c  NT() ){.    whil
19480 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
19490 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a  FileW((LPCWSTR)z
194a0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
194d0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
19500 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
19530 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
19560 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
19570 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19590 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
195a0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
195b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
195e0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
195f0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
19600 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
19610 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68  I.  else{.    wh
19620 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
19630 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29  teFileA((LPCSTR)
19640 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
19670 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
196a0 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
196d0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
196e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
19700 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
19710 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
19740 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
19750 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
19780 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
19790 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c  }.  }.#endif.  l
197a0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20  ogIoerr(cnt);.. 
197b0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
197c0 25 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e  %d %s 0x%lx %s\n
197d0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68  ", .           h
197e0 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  , zName, dwDesir
197f0 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20  edAccess, .     
19800 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44        h==INVALID
19810 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20  _HANDLE_VALUE ? 
19820 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
19830 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
19840 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
19850 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
19860 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
19870 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
19880 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
19890 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
198a0 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
198b0 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
198c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
198d0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
198e0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
198f0 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
19900 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
19910 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
19920 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
19930 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
19940 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
19950 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45  ADONLY)&~(SQLITE
19960 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
19970 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19980 54 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29  TE)), pOutFlags)
19990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
199a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
199b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
199c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
199d0 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
199e0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
199f0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  e ){.      *pOut
19a00 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
19a10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
19a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a30 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
19a40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19a50 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
19a60 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
19a70 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29   sizeof(*pFile))
19a80 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
19a90 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
19aa0 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  d;.  pFile->h = 
19ab0 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  h;.  pFile->last
19ac0 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
19ad0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
19ae0 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
19af0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69  >pShm = 0;.  pFi
19b00 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
19b10 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
19b20 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
19b30 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49  me, "psow", SQLI
19b40 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
19b50 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
19b60 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
19b70 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b  |= WINFILE_PSOW;
19b80 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
19b90 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
19ba0 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
19bb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
19bc0 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
19bd0 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65   && !winceCreate
19be0 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c  Lock(zName, pFil
19bf0 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c  e).  ){.    osCl
19c00 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20  oseHandle(h);.  
19c10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19c20 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
19c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
19c40 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d  NTOPEN_BKPT;.  }
19c50 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
19c60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
19c70 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
19c80 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
19c90 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
19ca0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
19cb0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  nverted);.  }.. 
19cc0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
19cd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19ce0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
19cf0 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
19d00 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57  *.** Note that W
19d10 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
19d20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
19d30 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
19d40 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
19d50 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
19d60 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
19d70 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
19d80 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
19d90 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
19da0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
19db0 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
19dc0 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
19dd0 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
19de0 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69  er it does.  Whi
19df0 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72  le this other pr
19e00 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
19e10 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   the.** file ope
19e20 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  n, we will be un
19e30 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69  able to delete i
19e40 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  t.  To work arou
19e50 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c  nd this.** probl
19e60 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30  em, we delay 100
19e70 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
19e80 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  d try to delete 
19e90 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f  again.  Up.** to
19ea0 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
19eb0 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61  EMPTs deletion a
19ec0 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20  ttempts are run 
19ed0 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a  before giving.**
19ee0 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
19ef0 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  g an error..*/.s
19f00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
19f10 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
19f20 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
19f30 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
19f40 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
19f50 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
19f60 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
19f70 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
19f80 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
19f90 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
19fa0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
19fb0 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
19fc0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
19fd0 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
19fe0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
19ff0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1a000 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a010 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
1a020 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
1a030 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
1a040 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
1a050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
1a060 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  ETE);.  zConvert
1a070 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1a080 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
1a090 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
1a0a0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
1a0b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a0c0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1a0d0 20 72 63 20 3d 20 31 3b 0a 20 20 69 66 28 20 69   rc = 1;.  if( i
1a0e0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
1a0f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1a100 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
1a110 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
1a120 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
1a130 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
1a140 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
1a150 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f  ));.    while( o
1a160 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1a170 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64  esExW(zConverted
1a180 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53  , GetFileExInfoS
1a190 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
1a1c0 72 44 61 74 61 29 20 26 26 0a 23 65 6c 73 65 0a  rData) &&.#else.
1a1d0 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74      while( osGet
1a1e0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
1a1f0 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56  zConverted)!=INV
1a200 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1a210 55 54 45 53 20 26 26 0a 23 65 6e 64 69 66 0a 20  UTES &&.#endif. 
1a220 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f 73          (rc = os
1a230 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
1a240 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20 72  verted))==0 && r
1a250 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1a260 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
1a270 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51      rc = rc ? SQ
1a280 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
1a290 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 69 66 64  _ERROR;.  }.#ifd
1a2a0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1a2b0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1a2c0 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65  .    while( osGe
1a2d0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1a2e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e  (zConverted)!=IN
1a2f0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1a300 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
1a310 20 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65    (rc = osDelete
1a320 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
1a330 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f  ))==0 && retryIo
1a340 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1a350 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63  rrno) ){}.    rc
1a360 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f   = rc ? SQLITE_O
1a370 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  K : SQLITE_ERROR
1a380 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
1a390 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20  f( rc ){.    rc 
1a3a0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1a3b0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1a3c0 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  E, lastErrno,.  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44             "winD
1a3e0 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
1a3f0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1a400 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
1a410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1a420 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1a430 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
1a440 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c  TE \"%s\" %s\n",
1a450 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20   zFilename, (rc 
1a460 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
1a470 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  " )));.  return 
1a480 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
1a490 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  ck the existance
1a4a0 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
1a4b0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1a4c0 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
1a4d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1a4e0 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
1a4f0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
1a500 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
1a510 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1a520 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1a530 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
1a540 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1a550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
1a560 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
1a570 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
1a580 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
1a590 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a5a0 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
1a5b0 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
1a5c0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
1a5d0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1a5e0 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
1a5f0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
1a600 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1a610 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
1a620 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1a630 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1a640 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ; );.  zConverte
1a650 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1a660 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
1a670 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1a680 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1a690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a6a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1a6b0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1a6c0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1a6d0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1a6e0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1a6f0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
1a700 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
1a710 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
1a720 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
1a730 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
1a740 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
1a750 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1a760 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
1a790 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
1a7c0 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
1a7d0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1a7e0 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72  o) ){}.    if( r
1a7f0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  c ){.      /* Fo
1a800 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45  r an SQLITE_ACCE
1a810 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c  SS_EXISTS query,
1a820 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65   treat a zero-le
1a830 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20  ngth file.      
1a840 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73  ** as if it does
1a850 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
1a860 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20    */.      if(  
1a870 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f    flags==SQLITE_
1a880 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20  ACCESS_EXISTS.  
1a890 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
1a8a0 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69  Data.nFileSizeHi
1a8b0 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  gh==0 .         
1a8c0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
1a8d0 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
1a8e0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
1a8f0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1a900 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
1a910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
1a920 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
1a930 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1a940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1a950 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65  se{.      logIoe
1a960 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69  rr(cnt);.      i
1a970 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  f( lastErrno!=ER
1a980 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
1a990 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  ND ){.        wi
1a9a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1a9b0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c  _IOERR_ACCESS, l
1a9c0 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63  astErrno, "winAc
1a9d0 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  cess", zFilename
1a9e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a9f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1aa00 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
1aa10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1aa20 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d  _ACCESS;.      }
1aa30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
1aa40 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
1aa50 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
1aa60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1aa70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1aa80 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1aa90 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
1aaa0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1aab0 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
1aac0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
1aad0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
1aae0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1aaf0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
1ab00 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1ab10 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
1ab20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ab30 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
1ab40 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
1ab50 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1ab60 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
1ab70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1ab80 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
1ab90 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
1aba0 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
1abb0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1abc0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1abd0 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
1abe0 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
1abf0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
1ac00 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1ac10 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
1ac20 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
1ac30 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
1ac40 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
1ac50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ac60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
1ac70 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1ac80 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
1ac90 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
1aca0 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
1acb0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
1acc0 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
1acd0 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
1ace0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
1acf0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1ad00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1ad10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
1ad20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1ad30 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
1ad40 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
1ad50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
1ad60 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
1ad70 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
1ad80 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
1ad90 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
1ada0 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1adc0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
1add0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
1ade0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
1ae10 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
1ae20 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
1ae30 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
1ae40 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1ae50 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1ae60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ae70 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77  R(nFull);.  cygw
1ae80 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
1ae90 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61  win32_path(zRela
1aea0 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20  tive, zFull);.  
1aeb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1aec0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
1aed0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1aee0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1aef0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1af00 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1af10 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
1af20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
1af30 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  ull);.  /* WinCE
1af40 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
1af50 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
1af60 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
1af70 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71  am told. */.  sq
1af80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70  lite3_snprintf(p
1af90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
1afa0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
1afb0 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75  elative);.  retu
1afc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
1afd0 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
1afe0 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
1aff0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
1b000 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
1b010 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79  WIN__).  int nBy
1b020 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
1b030 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
1b040 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
1b050 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
1b060 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
1b070 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
1b080 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
1b090 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
1b0a0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
1b0b0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
1b0c0 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
1b0d0 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
1b0e0 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49  ='/' && sqlite3I
1b0f0 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65  salpha(zRelative
1b100 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76  [1]) && zRelativ
1b110 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20  e[2]==':' ){.   
1b120 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20   zRelative++;.  
1b130 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  }..  /* It's odd
1b140 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
1b150 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
1b160 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
1b170 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
1b180 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
1b190 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
1b1a0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
1b1b0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
1b1c0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
1b1d0 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
1b1e0 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
1b1f0 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
1b200 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
1b210 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
1b220 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
1b230 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
1b240 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1b250 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b260 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
1b270 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
1b280 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
1b290 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1b2a0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  me(zRelative);. 
1b2b0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1b2c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b2d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1b2e0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
1b2f0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
1b300 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
1b310 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
1b320 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
1b330 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
1b340 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
1b350 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
1b360 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73  _malloc( nByte*s
1b370 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
1b380 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
1b390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1b3a0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1b3b0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
1b3c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b3d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1b3e0 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e    osGetFullPathN
1b3f0 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
1b400 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
1b410 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
1b420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1b430 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
1b440 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
1b450 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
1b460 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
1b470 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  p);.  }.#ifdef S
1b480 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1b490 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1b4a0 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
1b4b0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
1b4c0 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
1b4d0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
1b4e0 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20  0, 0, 0) + 3;.  
1b4f0 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
1b500 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  3_malloc( nByte*
1b510 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
1b520 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
1b530 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1b540 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1b550 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
1b560 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b570 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
1b580 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68     osGetFullPath
1b590 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
1b5a0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
1b5b0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73  zTemp, 0);.    s
1b5c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1b5d0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
1b5e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
1b5f0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
1b600 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
1b610 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
1b620 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
1b630 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
1b640 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
1b650 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
1b660 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
1b670 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1b680 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
1b690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b6a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1b6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b6c0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  RR_NOMEM;.  }.#e
1b6d0 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ndif.}..#ifndef 
1b6e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1b6f0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
1b700 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
1b710 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
1b720 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
1b730 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
1b740 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
1b750 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
1b760 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
1b770 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
1b780 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
1b790 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
1b7a0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
1b7b0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
1b7c0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
1b7d0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1b7e0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
1b7f0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1b800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b810 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
1b820 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
1b830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b840 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
1b850 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  h;.  void *zConv
1b860 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1b870 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
1b880 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
1b890 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1b8a0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
1b8b0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
1b8c0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1b8d0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
1b8e0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
1b8f0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1b900 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 69 66 64  erted);.  }.#ifd
1b910 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1b920 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1b930 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
1b940 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a  ibraryA((char*)z
1b950 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
1b960 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b970 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1b980 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
1b990 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76  d*)h;.}.static v
1b9a0 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73  oid winDlError(s
1b9b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b9c0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1b9d0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e   *zBufOut){.  UN
1b9e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1b9f0 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45  Vfs);.  getLastE
1ba00 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73  rrorMsg(osGetLas
1ba10 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20  tError(), nBuf, 
1ba20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74  zBufOut);.}.stat
1ba30 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53  ic void (*winDlS
1ba40 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
1ba50 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
1ba60 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  dle, const char 
1ba70 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29  *zSymbol))(void)
1ba80 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1ba90 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
1baa0 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
1bab0 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64  id))osGetProcAdd
1bac0 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48  ressA((HANDLE)pH
1bad0 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b  andle, zSymbol);
1bae0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
1baf0 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  inDlClose(sqlite
1bb00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
1bb10 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
1bb20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bb30 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c  pVfs);.  osFreeL
1bb40 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
1bb50 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
1bb60 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
1bb70 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
1bb80 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
1bb90 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
1bba0 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
1bbb0 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20  e winDlError 0. 
1bbc0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79   #define winDlSy
1bbd0 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
1bbe0 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  winDlClose 0.#en
1bbf0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  dif.../*.** Writ
1bc00 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74  e up to nBuf byt
1bc10 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73  es of randomness
1bc20 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73   into zBuf..*/.s
1bc30 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e  tatic int winRan
1bc40 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
1bc50 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
1bc60 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1bc70 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
1bc80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bc90 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66  R(pVfs);.#if def
1bca0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1bcb0 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20  ).  n = nBuf;.  
1bcc0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
1bcd0 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  nBuf);.#else.  i
1bce0 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  f( sizeof(SYSTEM
1bcf0 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  TIME)<=nBuf-n ){
1bd00 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20  .    SYSTEMTIME 
1bd10 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74  x;.    osGetSyst
1bd20 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
1bd30 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1bd40 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
1bd50 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1bd60 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (x);.  }.  if( s
1bd70 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
1bd80 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
1bd90 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72  D pid = osGetCur
1bda0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b  rentProcessId();
1bdb0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
1bdc0 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  f[n], &pid, size
1bdd0 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20  of(pid));.    n 
1bde0 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a  += sizeof(pid);.
1bdf0 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
1be00 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
1be10 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
1be20 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
1be30 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
1be40 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
1be50 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
1be60 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
1be70 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  t);.  }.  if( si
1be80 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
1be90 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ER)<=nBuf-n ){. 
1bea0 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
1beb0 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
1bec0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
1bed0 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
1bee0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
1bef0 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
1bf00 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
1bf10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1bf20 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
1bf30 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
1bf40 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
1bf50 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
1bf60 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
1bf70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
1bf80 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
1bf90 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
1bfa0 73 65 63 29 7b 0a 20 20 70 6f 72 74 61 62 6c 65  sec){.  portable
1bfb0 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  Sleep((microsec+
1bfc0 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
1bfd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1bfe0 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
1bff0 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
1c000 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
1c010 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1c020 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
1c030 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
1c040 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
1c050 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
1c060 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
1c070 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
1c080 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
1c090 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
1c0a0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
1c0b0 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
1c0c0 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
1c0d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1c0e0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
1c0f0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
1c100 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
1c110 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
1c120 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
1c130 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
1c140 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1c150 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
1c160 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
1c170 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
1c180 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
1c190 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
1c1a0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
1c1b0 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
1c1c0 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
1c1d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
1c1e0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
1c1f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
1c200 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
1c210 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
1c220 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
1c230 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
1c240 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
1c250 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
1c260 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
1c270 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
1c280 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
1c290 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
1c2a0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
1c2b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
1c2c0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
1c2d0 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
1c2e0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
1c2f0 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
1c300 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
1c310 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
1c320 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
1c330 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
1c340 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
1c350 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
1c360 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
1c370 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31  umber of .     1
1c380 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
1c390 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
1c3a0 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
1c3b0 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20   JD 2305813.5). 
1c3c0 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
1c3d0 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
1c3e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
1c3f0 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
1c400 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
1c410 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
1c420 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
1c430 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
1c440 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1c450 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
1c460 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
1c470 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
1c480 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
1c490 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
1c4a0 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
1c4b0 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
1c4c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1c4d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
1c4e0 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20  32BitValue = .  
1c4f0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
1c500 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
1c510 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
1c520 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
1c530 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
1c540 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
1c550 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
1c560 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
1c570 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
1c580 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20  &time);.  /* if 
1c590 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
1c5a0 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74  Time() fails, it
1c5b0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a   returns zero. *
1c5c0 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65  /.  if (!osSyste
1c5d0 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
1c5e0 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20  &time,&ft)){.   
1c5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c600 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  RROR;.  }.#else.
1c610 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
1c620 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
1c630 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70   );.#endif..  *p
1c640 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69  iNow = winFileti
1c650 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20  meEpoch +.      
1c660 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65        ((((sqlite
1c670 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67  3_int64)ft.dwHig
1c680 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32  hDateTime)*max32
1c690 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20  BitValue) + .   
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1c6b0 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
1c6c0 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
1c6d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
1c6e0 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
1c6f0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
1c700 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
1c710 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
1c720 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
1c730 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
1c740 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
1c750 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
1c760 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
1c770 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
1c780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
1c7a0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1c7b0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
1c7c0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
1c7d0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
1c7e0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
1c7f0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
1c800 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
1c810 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
1c820 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
1c830 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
1c840 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
1c850 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
1c860 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
1c870 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
1c880 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
1c890 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
1c8a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
1c8b0 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
1c8c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
1c8d0 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
1c8e0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
1c8f0 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
1c900 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
1c910 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c920 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
1c930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
1c940 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
1c950 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
1c960 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
1c970 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
1c980 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
1c990 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
1c9a0 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
1c9b0 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
1c9c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
1c9d0 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
1c9e0 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
1c9f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
1ca00 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
1ca10 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
1ca20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
1ca30 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
1ca40 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
1ca50 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
1ca60 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
1ca70 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
1ca80 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
1ca90 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
1caa0 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
1cab0 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
1cac0 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
1cad0 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
1cae0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
1caf0 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
1cb00 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
1cb10 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
1cb20 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
1cb30 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
1cb40 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
1cb50 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
1cb60 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
1cb70 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
1cb80 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
1cb90 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
1cba0 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
1cbb0 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
1cbc0 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
1cbd0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
1cbe0 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
1cbf0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
1cc00 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
1cc10 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
1cc20 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
1cc30 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
1cc40 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
1cc50 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1cc60 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
1cc70 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
1cc80 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
1cc90 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
1cca0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1ccb0 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
1ccc0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
1ccd0 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
1cce0 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
1ccf0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
1cd00 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
1cd10 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
1cd20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
1cd30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
1cd40 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
1cd50 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
1cd60 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
1cd70 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
1cd80 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
1cd90 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
1cda0 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
1cdb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
1cdc0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
1cdd0 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
1cde0 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
1cdf0 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
1ce00 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
1ce10 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
1ce20 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
1ce30 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
1ce40 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1ce50 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1ce60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1ce70 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
1ce80 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72  urn getLastError
1ce90 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
1cea0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
1ceb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
1cec0 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
1ced0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
1cee0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
1cef0 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
1cf00 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
1cf10 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
1cf20 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
1cf30 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cf50 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
1cf60 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
1cf70 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
1cf80 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41  le */.    MAX_PA
1cf90 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  TH,            /
1cfa0 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
1cfb0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
1cfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
1cfd0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
1cfe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1cff0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d010 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
1d020 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
1d030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
1d040 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
1d050 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
1d060 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
1d070 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
1d080 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
1d090 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
1d0a0 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
1d0b0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
1d0c0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
1d0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1d0e0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
1d0f0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
1d100 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
1d110 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
1d120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1d130 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
1d140 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1d150 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
1d160 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
1d170 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
1d180 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
1d190 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
1d1a0 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
1d1b0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
1d1c0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
1d1d0 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
1d1e0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
1d1f0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
1d200 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
1d210 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
1d220 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
1d230 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
1d240 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
1d250 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
1d260 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
1d270 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
1d280 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
1d290 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
1d2a0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
1d2b0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
1d2c0 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20  l */.  };..  /* 
1d2d0 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
1d2e0 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
1d2f0 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
1d300 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
1d310 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
1d320 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
1d330 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
1d340 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
1d350 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 36 36  ze(aSyscall)==66
1d360 20 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   );..#if SQLITE_
1d370 4f 53 5f 57 49 4e 52 54 0a 20 20 73 6c 65 65 70  OS_WINRT.  sleep
1d380 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76  Obj = osCreateEv
1d390 65 6e 74 45 78 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  entEx(NULL, NULL
1d3a0 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
1d3b0 41 4e 55 41 4c 5f 52 45 53 45 54 2c 20 0a 20 20  ANUAL_RESET, .  
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
1d3e0 52 4f 4e 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a  RONIZE);.#endif.
1d3f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d400 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65  OMIT_WAL.  /* ge
1d410 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
1d420 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
1d430 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
1d440 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
1d450 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
1d460 46 4f 29 29 3b 0a 20 20 6f 73 47 65 74 53 79 73  FO));.  osGetSys
1d470 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
1d480 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 77  nfo);.  assert(w
1d490 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
1d4a0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
1d4b0 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  y > 0);.#endif..
1d4c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1d4d0 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20  gister(&winVfs, 
1d4e0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
1d4f0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20  ITE_OK; .}..int 
1d500 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
1d510 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c 49 54  oid){ .#if SQLIT
1d520 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 43  E_OS_WINRT.  osC
1d530 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
1d540 4f 62 6a 29 3b 0a 20 20 73 6c 65 65 70 4f 62 6a  Obj);.  sleepObj
1d550 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
1d560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d570 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
1d580 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
1d590 2f 0a                                            /.