/ Hex Artifact Content
Login

Artifact 5245515000a855dd0fe4f6e86dfe599cd7865b7b:


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 2f 2a 0a 2a 2a  0;.#endif../*.**
1460: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
1470: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
1480: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
1490: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
14a0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
14b0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
14c0: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
14d0: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
14e0: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
14f0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
1500: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
1510: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
1520: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
1530: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
1540: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
1550: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
1560: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
1570: 4f 53 5f 57 49 4e 43 45 0a 23 20 20 64 65 66 69  OS_WINCE.#  defi
1580: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1590: 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69 66 0a  HAS_ANSI.#endif.
15a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
15b0: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
15c0: 53 5f 57 49 4e 4e 54 0a 23 20 20 64 65 66 69 6e  S_WINNT.#  defin
15d0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
15e0: 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a  AS_WIDE.#endif..
15f0: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
1600: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
1610: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
1620: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69  l_ptr.#endif..#i
1630: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1640: 45 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61  E./*.** These ma
1650: 63 72 6f 73 20 61 72 65 20 6e 65 63 65 73 73 61  cros are necessa
1660: 72 79 20 62 65 63 61 75 73 65 20 57 69 6e 64 6f  ry because Windo
1670: 77 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e  ws CE does not n
1680: 61 74 69 76 65 6c 79 20 73 75 70 70 6f 72 74 20  atively support 
1690: 74 68 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49  the.** Win32 API
16a0: 73 20 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f  s LockFile, Unlo
16b0: 63 6b 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b  ckFile, and Lock
16c0: 46 69 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20  FileEx.. */..#  
16d0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
16e0: 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20  a,b,c,d,e)      
16f0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
1700: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23  a, b, c, d, e).#
1710: 20 20 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46    define UnlockF
1720: 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20  ile(a,b,c,d,e)  
1730: 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69     winceUnlockFi
1740: 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  le(&a, b, c, d, 
1750: 65 29 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63  e).#  define Loc
1760: 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c  kFileEx(a,b,c,d,
1770: 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b  e,f)   winceLock
1780: 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c  FileEx(&a, b, c,
1790: 20 64 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a   d, e, f)../*.**
17a0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73   These are the s
17b0: 70 65 63 69 61 6c 20 73 79 73 63 61 6c 6c 20 68  pecial syscall h
17c0: 61 63 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77 73  acks for Windows
17d0: 20 43 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e   CE.  The lockin
17e0: 67 20 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66  g related.** def
17f0: 69 6e 65 73 20 68 65 72 65 20 72 65 66 65 72 20  ines here refer 
1800: 74 6f 20 74 68 65 20 6d 61 63 72 6f 73 20 64 65  to the macros de
1810: 66 69 6e 65 64 20 6a 75 73 74 20 61 62 6f 76 65  fined just above
1820: 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65  .. */..#  define
1830: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
1840: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 20 20  SI()       1.#  
1850: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
1860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1870: 20 4c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66   LockFile.#  def
1880: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 6e                Un
18a0: 6c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69  lockFile.#  defi
18b0: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20  ne osLockFileEx 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63               Loc
18d0: 6b 46 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a  kFileEx.#endif..
18e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
18f0: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
1900: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1920: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d  ame of the sytem
1930: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
1940: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
1950: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
1960: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
1970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1980: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1990: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
19a0: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
19b0: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
19c0: 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45   = {.#if !SQLITE
19d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 41  _OS_WINCE.  { "A
19e0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c  reFileApisANSI",
19f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1a00: 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  L)AreFileApisANS
1a10: 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  I,         0 },.
1a20: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
1a30: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
1a40: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
1a50: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
1a60: 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b  rrent).#else.  {
1a70: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
1a80: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
1a90: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1ab0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  },.#endif..#if S
1ac0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
1ad0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1ae0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1af0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
1b00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1b10: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
1b20: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
1b30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1b40: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1b60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1b80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1b90: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
1ba0: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
1bb0: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
1bc0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
1bd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1be0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
1bf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1c00: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
1c10: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
1c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1c30: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
1c40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
1c50: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
1c60: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
1c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
1cb0: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
1cc0: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
1cd0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
1ce0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
1cf0: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
1d00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1d10: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
1d20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
1d30: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
1d40: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
1d50: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
1d60: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
1d70: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
1d80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1d90: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
1da0: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
1db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
1dc0: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
1dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
1de0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
1df0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
1e00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
1e30: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
1e40: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
1e50: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
1e60: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
1e70: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
1e80: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
1e90: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
1ea0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
1eb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
1ec0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1ed0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
1ee0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
1ef0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1f00: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
1f10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1f20: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
1f30: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
1f40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
1f70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
1f80: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
1f90: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
1fa0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
1fb0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
1fc0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
1fd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
1fe0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
1ff0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2000: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
2010: 6e 67 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  ng",       (SYSC
2020: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
2030: 70 70 69 6e 67 2c 20 20 20 20 20 20 20 30 20 7d  pping,       0 }
2040: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  ,..#define osCre
2050: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 28  ateFileMapping (
2060: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2070: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
2080: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
2090: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
20a0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 54 53  WORD,DWORD,LPCTS
20b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  TR))aSyscall[6].
20c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
20d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
20e0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
20f0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2100: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
2110: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2120: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
2130: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2140: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2150: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
2160: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2180: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2190: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
21a0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
21b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
21c0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
21d0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
21e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
21f0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
2200: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
2210: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2220: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2230: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  DE).  { "CreateM
2240: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
2250: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
2260: 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20  teMutexW,       
2270: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2280: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
2290: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
22a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
22d0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75  efine osCreateMu
22e0: 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  texW ((HANDLE(WI
22f0: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
2300: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f  Y_ATTRIBUTES,BOO
2310: 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  L, \.        LPC
2320: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38  WSTR))aSyscall[8
2330: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2340: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2350: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2360: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
2370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2380: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
2390: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  leA,            
23a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
23b0: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
23c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
23d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
23f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2400: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20  e osDeleteFileA 
2410: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2420: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
2430: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
2440: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2450: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2460: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
2470: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
2480: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
2490: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
24a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
24b0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
24d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
24f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2500: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
2510: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
2520: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
2530: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
2540: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2550: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
2560: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2570: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46  ime", (SYSCALL)F
2580: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2590: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
25a0: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
25b0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
25c0: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
25f0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
2600: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
2610: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
2620: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
2630: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
2640: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
2650: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
2660: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2670: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
2680: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
2690: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69  ,    (SYSCALL)Fi
26a0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
26b0: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  me,    0 },.#els
26c0: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
26d0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
26e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2710: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
2720: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28  meToSystemTime (
2730: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
2740: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
2750: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
2760: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
2770: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
2780: 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75    { "FlushFileBu
2790: 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28  ffers",        (
27a0: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c  SYSCALL)FlushFil
27b0: 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20  eBuffers,       
27c0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
27d0: 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
27e0: 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  s ((BOOL(WINAPI*
27f0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
2800: 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[13].pCurrent)
2810: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2820: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2830: 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  NSI).  { "Format
2840: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
2850: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
2860: 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20  matMessageA,    
2870: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2880: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
2890: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
28a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
28d0: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
28e0: 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28  essageA ((DWORD(
28f0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2900: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2910: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
2920: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
2930: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  t*))aSyscall[14]
2940: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2950: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2960: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2970: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
2980: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
2990: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
29a0: 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20  sageW,          
29b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
29c0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
29d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
29e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2a00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2a10: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
2a20: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
2a30: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
2a40: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57  ,DWORD,DWORD,LPW
2a50: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2a60: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2a70: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
2a80: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 72 65 65  rent)..  { "Free
2a90: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
2aa0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2ab0: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
2ac0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2ad0: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
2ae0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
2af0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
2b00: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
2b10: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
2b20: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
2b30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
2b40: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2b50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
2b60: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
2b70: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
2b80: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
2b90: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
2ba0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2bb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2bc0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2bd0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2be0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
2bf0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
2c00: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
2c10: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
2c20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2c30: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2c40: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
2c50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c80: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
2c90: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
2ca0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
2cb0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2cc0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2cd0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2ce0: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
2cf0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
2d00: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
2d10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2d20: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
2d30: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
2d40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2d50: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2d60: 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  W,       0 },.#e
2d70: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
2d80: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
2d90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2dc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
2dd0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28  iskFreeSpaceW ((
2de0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
2df0: 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  CWSTR,LPDWORD,LP
2e00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
2e10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
2e20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
2e30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2e40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2e50: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
2e60: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
2e70: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
2e80: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
2e90: 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20  ibutesA,      0 
2ea0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
2eb0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
2ec0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
2ed0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2ee0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2ef0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2f00: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
2f10: 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esA ((DWORD(WINA
2f20: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
2f30: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
2f40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2f50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2f60: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
2f70: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
2f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2f90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2fa0: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
2fb0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
2fc0: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
2fd0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3000: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3010: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
3020: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3030: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3040: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
3050: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3060: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3070: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
3080: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
3090: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
30a0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
30b0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
30c0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
30d0: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
30e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3110: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
3120: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
3130: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3140: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
3150: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
3160: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
3170: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3180: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 46  rent)..  { "GetF
3190: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
31a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
31b0: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
31c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
31d0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
31e0: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
31f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
3200: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
3210: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3220: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
3230: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3240: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3250: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
3260: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
3270: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
3280: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
3290: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
32a0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
32b0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
32c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
32f0: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
3300: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
3310: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
3320: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3330: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
3340: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3350: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3360: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3380: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3390: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
33a0: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
33b0: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
33c0: 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20  thNameW,        
33d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
33e0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
33f0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3400: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3420: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3430: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
3440: 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meW ((DWORD(WINA
3450: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
3460: 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  RD,LPWSTR, \.   
3470: 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53       LPWSTR*))aS
3480: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
3490: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61  ent)..  { "GetLa
34a0: 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20  stError",       
34b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
34c0: 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
34d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
34e0: 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72  fine osGetLastEr
34f0: 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ror ((DWORD(WINA
3500: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
3510: 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74  all[26].pCurrent
3520: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
3530: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
3540: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
3550: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
3560: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
3570: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
3580: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
3590: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
35a0: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
35b0: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
35c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
35d0: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
35e0: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
35f0: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
3600: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
3610: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
3620: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3630: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
3640: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
3650: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
3660: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3670: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
3680: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3690: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
36a0: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
36b0: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
36c0: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
36d0: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
36e0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
36f0: 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  )..  { "GetSyste
3700: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3710: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
3720: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
3730: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3740: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
3750: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
3760: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
3770: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
3780: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3790: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
37a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
37b0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
37c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
37d0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
37e0: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
37f0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
3800: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
3810: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3820: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3830: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
3840: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
3850: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
3860: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3870: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
3880: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
3890: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
38a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
38d0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
38e0: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
38f0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
3900: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
3910: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
3920: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3930: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3940: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3950: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
3960: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
3970: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
3980: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
3990: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
39a0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
39c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
39e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
39f0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
3a00: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
3a10: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
3a20: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
3a30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3a40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3a50: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3a60: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
3a70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a80: 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c  LL)GetTempPathW,
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3aa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
3ab0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
3ac0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ae0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3af0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3b00: 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57  etTempPathW ((DW
3b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3b20: 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63  RD,LPWSTR))aSysc
3b30: 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74  all[32].pCurrent
3b40: 29 0a 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  )..  { "GetTickC
3b50: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
3b60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
3b70: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
3b80: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3b90: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
3ba0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3bb0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
3bc0: 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [33].pCurrent)..
3bd0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3be0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3bf0: 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  I).  { "GetVersi
3c00: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
3c10: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65    (SYSCALL)GetVe
3c20: 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20  rsionExA,       
3c30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3c40: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
3c50: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
3c60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3c90: 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f  fine osGetVersio
3ca0: 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nExA ((BOOL(WINA
3cb0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
3cc0: 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41  LPOSVERSIONINFOA
3cd0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70  ))aSyscall[34].p
3ce0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3cf0: 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  eapAlloc",      
3d00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3d10: 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20  L)HeapAlloc,    
3d20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3d30: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41  .#define osHeapA
3d40: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
3d50: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
3d60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
3d70: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
3d80: 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  35].pCurrent).. 
3d90: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3db0: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
3dc0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3dd0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3de0: 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e  HeapCreate ((HAN
3df0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  DLE(WINAPI*)(DWO
3e00: 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20  RD,SIZE_T, \.   
3e10: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
3e20: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
3e30: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 44 65  nt)..  { "HeapDe
3e40: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
3e50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3e60: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
3e70: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3e80: 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f  ine osHeapDestro
3e90: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
3ea0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
3eb0: 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[37].pCurrent)
3ec0: 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22  ..  { "HeapFree"
3ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ee0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72   (SYSCALL)HeapFr
3ef0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
3f00: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
3f10: 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f   osHeapFree ((BO
3f20: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
3f30: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29  LE,DWORD,LPVOID)
3f40: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
3f50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
3f60: 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20  apReAlloc",     
3f70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3f80: 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20  )HeapReAlloc,   
3f90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3fa0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65  #define osHeapRe
3fb0: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
3fc0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
3fd0: 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20  WORD,LPVOID, \. 
3fe0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
3ff0: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
4000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4010: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
4020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4030: 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  eapSize,        
4040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4050: 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65  efine osHeapSize
4060: 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49   ((SIZE_T(WINAPI
4070: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4080: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
4090: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d  ID))aSyscall[40]
40a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
40b0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
40c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
40d0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
40e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
40f0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
4100: 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c  pValidate ((BOOL
4110: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4120: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4130: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
4140: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
4150: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4170: 41 4e 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  ANSI).  { "LoadL
4180: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
4190: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
41a0: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
41b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
41c0: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
41d0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
41e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4210: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
4220: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
4230: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4240: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
4250: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4270: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4280: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
4290: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
42a0: 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79  CALL)LoadLibrary
42b0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  W,            0 
42c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
42d0: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
42e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
42f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4320: 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28  sLoadLibraryW ((
4330: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
4340: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
4350: 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[43].pCurrent)
4360: 0a 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  ..  { "LocalFree
4370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4380: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
4390: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
43a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
43b0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
43c0: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
43d0: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
43e0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
43f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4400: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
4410: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4420: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4430: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4440: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4450: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
4460: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4470: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4480: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4490: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
44a0: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
44b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
44c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
44d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4500: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
4510: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
4520: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
4530: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4540: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
4550: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4560: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
4570: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
4580: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4590: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
45a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
45b0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
45c0: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
45d0: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c  nt).#else.  { "L
45e0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
45f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4600: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4610: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4620: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 4d 61 70  #endif..  { "Map
4630: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
4640: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4650: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  MapViewOfFile,  
4660: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4670: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
4680: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
4690: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
46a0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
46b0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
46c0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  E_T))aSyscall[47
46d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
46e0: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
46f0: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
4700: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
4710: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
4720: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
4730: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
4740: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
4750: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
4760: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
4770: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
4780: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
4790: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
47a0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
47b0: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
47c0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
47d0: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
47e0: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
47f0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
4800: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
4810: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
4820: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
4830: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
4840: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4860: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
4870: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
4880: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4890: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
48a0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
48b0: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
48c0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
48d0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
48e0: 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43  )aSyscall[50].pC
48f0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
4900: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
4910: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4920: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
4930: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4940: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
4950: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
4960: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
4970: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
4980: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 46  rent)..  { "SetF
4990: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
49a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
49b0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
49c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
49d0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
49e0: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
49f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
4a00: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
4a10: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
4a20: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
4a30: 74 29 0a 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  t)..  { "Sleep",
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65     (SYSCALL)Slee
4a60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4a70: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4a80: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
4a90: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4aa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
4ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
4ac0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
4ad0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
4ae0: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
4af0: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
4b00: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
4b10: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
4b20: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4b30: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
4b40: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
4b50: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
4b60: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
4b70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4b80: 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINCE.  { "Unloc
4b90: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
4ba0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
4bb0: 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  lockFile,       
4bc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4bd0: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
4be0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4bf0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4c00: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4c10: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
4c20: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
4c30: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55  nt).#else.  { "U
4c40: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
4c50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c80: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
4c90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
4ca0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4cc0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
4cd0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
4ce0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  },..#define osUn
4cf0: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
4d00: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4d10: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4d20: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4d30: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
4d40: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
4d50: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55  nt).#else.  { "U
4d60: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
4d70: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d80: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4d90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4da0: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 55 6e 6d  #endif..  { "Unm
4db0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
4dc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4dd0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
4de0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4df0: 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69  define osUnmapVi
4e00: 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ewOfFile ((BOOL(
4e10: 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44  WINAPI*)(LPCVOID
4e20: 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70  ))aSyscall[57].p
4e30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
4e40: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
4e50: 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  te",     (SYSCAL
4e60: 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  L)WideCharToMult
4e70: 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a  iByte,     0 },.
4e80: 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43  .#define osWideC
4e90: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28  harToMultiByte (
4ea0: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
4eb0: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  NT,DWORD,LPCWSTR
4ec0: 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20  ,int,LPSTR,int, 
4ed0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
4ee0: 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c  ,LPBOOL))aSyscal
4ef0: 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[58].pCurrent).
4f00: 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22  .  { "WriteFile"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f20: 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69  (SYSCALL)WriteFi
4f30: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
4f40: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4f50: 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f  osWriteFile ((BO
4f60: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4f70: 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  LE,LPCVOID,DWORD
4f80: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
4f90: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
4fa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70  ))aSyscall[59].p
4fb0: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
4fc0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
4fd0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
4fe0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
4ff0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
5000: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
5010: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
5020: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
5030: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
5040: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
5050: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
5060: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
5070: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
5080: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
5090: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
50a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
50b0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
50c0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
50d0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
50e0: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
50f0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
5100: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
5110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
5120: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
5130: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
5140: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
5150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
5160: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
5170: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
5180: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5190: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
51a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
51b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
51c0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
51d0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
51e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
51f0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
5200: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
5210: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
5220: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
5230: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
5240: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
5250: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
5260: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
5270: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
5280: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
5290: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
52a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
52b0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
52c0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
52d0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
52e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
52f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
5300: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
5310: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5320: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
5330: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
5340: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
5350: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
5360: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
5370: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
5380: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
5390: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
53a0: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
53b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
53c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
53d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
53f0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
5400: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
5410: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
5420: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
5430: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
5440: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
5450: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
5460: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
5470: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
5480: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
5490: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
54a0: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
54b0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
54c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
54d0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
54e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
54f0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
5500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5510: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5520: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5530: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
5540: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
5550: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5560: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
5570: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
5580: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
5590: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
55a0: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
55b0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
55c0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
55d0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
55e0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
55f0: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
5600: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
5610: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
5620: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5630: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5640: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5650: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5660: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5670: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5680: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5690: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
56a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
56b0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
56c0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
56d0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
56e0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
56f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5710: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5720: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5730: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5740: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5750: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5760: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5770: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5780: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5790: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
57a0: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
57b0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
57c0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
57d0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
57e0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
57f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
5800: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
5810: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
5820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5830: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
5840: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
5850: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
5860: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
5870: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5880: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
5890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
58a0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
58b0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
58c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
58d0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
58e0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
58f0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
5900: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
5910: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
5920: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
5930: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
5940: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5950: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5960: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65  (non-zero) if we
5970: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64   are running und
5980: 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c  er WinNT, Win2K,
5990: 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69   WinXP,.** or Wi
59a0: 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nCE.  Return fal
59b0: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
59c0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
59d0: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
59e0: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
59f0: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
5a00: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
5a10: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
5a20: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
5a30: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
5a40: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
5a50: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
5a60: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
5a70: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
5a80: 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75   call it when ru
5a90: 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d  nning Win95/98/M
5aa0: 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a  E.  A call to.**
5ab0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5ac0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
5ad0: 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ne if the host i
5ae0: 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72  s Win95/98/ME or
5af0: 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20  .** WinNT/2K/XP 
5b00: 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  so that we will 
5b10: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
5b20: 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c  not we can safel
5b30: 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f  y call.** the Lo
5b40: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a  ckFileEx() API..
5b50: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
5b60: 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20  _WINCE.# define 
5b70: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
5b80: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
5b90: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
5ba0: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
5bb0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
5bc0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
5bd0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
5be0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
5bf0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
5c00: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
5c10: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
5c20: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
5c30: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
5c40: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
5c50: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
5c60: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
5c70: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5c80: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
5c90: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ==2;.  }.#endif 
5ca0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
5cb0: 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  CE */..#ifdef SQ
5cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
5cd0: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
5ce0: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
5cf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
5d00: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
5d10: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
5d20: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
5d30: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
5d40: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
5d50: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
5d60: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
5d70: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
5d80: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
5d90: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
5da0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66  _VALUE );.#ifdef
5db0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
5dc0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20  LLOC_VALIDATE.  
5dd0: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
5de0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
5df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
5e00: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
5e10: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
5e20: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
5e30: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
5e40: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
5e50: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
5e60: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
5e70: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
5e80: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
5ea0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
5eb0: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
5ec0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
5ed0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
5ee0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
5ef0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
5f00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5f10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
5f20: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
5f30: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
5f40: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
5f50: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
5f60: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
5f70: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
5f80: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
5f90: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
5fa0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
5fb0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
5fc0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
5fd0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
5fe0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
5ff0: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6000: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6010: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6020: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6030: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
6040: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
6050: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
6060: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
6070: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
6080: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
6090: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
60a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
60b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
60c0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
60d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
60e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
60f0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
6100: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
6110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6120: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
6130: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
6140: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
6150: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6160: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
6170: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
6180: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
6190: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
61a0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
61b0: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
61c0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
61d0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
61e0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
61f0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
6200: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
6210: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
6220: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
6230: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6240: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6250: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6260: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6270: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
6280: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
6290: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
62a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
62b0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
62c0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
62d0: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
62e0: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
62f0: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
6300: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6310: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
6320: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
6330: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
6340: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
6350: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6360: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
6370: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
6380: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
6390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
63a0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
63b0: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
63c0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
63d0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
63e0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
63f0: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
6400: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
6410: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
6420: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
6430: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
6440: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
6450: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
6460: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
6470: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
6480: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
6490: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
64a0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
64b0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
64c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
64d0: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
64e0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
64f0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
6500: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6510: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6520: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6530: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6540: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6550: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6560: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6570: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6580: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
6590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
65a0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
65b0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
65c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
65d0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
65e0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
65f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
6600: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
6610: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
6620: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6630: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6640: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
6650: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
6660: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6670: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
6680: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
6690: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
66a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
66b0: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
66c0: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
66d0: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
66e0: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
66f0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
6700: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
6710: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
6720: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
6730: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
6740: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
6750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6760: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
6770: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
6780: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
6790: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
67a0: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
67b0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
67c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
67d0: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
67e0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
67f0: 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  agic==WINMEM_MAG
6800: 49 43 20 29 3b 0a 20 20 69 66 28 20 21 70 57 69  IC );.  if( !pWi
6810: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
6820: 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  ){.    pWinMemDa
6830: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
6840: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
6850: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
6890: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
68a0: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
68d0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
68e0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
68f0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
6900: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
6910: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6920: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
6930: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6940: 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61  Create (%d), fla
6950: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
6960: 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c  %u, maxSize=%u",
6970: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
6980: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
6990: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
69a0: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
69b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
69c0: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c  P_INIT_SIZE, SQL
69d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
69e0: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  AX_SIZE);.      
69f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6a00: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6a10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
6a20: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d 0a 20  ed = TRUE;.  }. 
6a30: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
6a40: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
6a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
6a60: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
6a70: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
6a80: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
6a90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
6aa0: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
6ab0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
6ac0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
6ad0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
6ae0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6af0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
6b00: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
6b10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6b20: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
6b30: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
6b40: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
6b50: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
6b60: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
6b70: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
6b80: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
6b90: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
6ba0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
6bb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6bc0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6bd0: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
6be0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
6bf0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6c00: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6c10: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6c20: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6c30: 45 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  E.    assert( os
6c40: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
6c50: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
6c60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6c70: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
6c80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
6c90: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
6ca0: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
6cb0: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
6cc0: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
6cd0: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
6ce0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
6cf0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
6d00: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
6d10: 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  y (%d), heap=%p"
6d20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6d30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6d40: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
6d50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
6d60: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6d70: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
6d80: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
6d90: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
6da0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
6db0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
6dc0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
6dd0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
6de0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
6df0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
6e00: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
6e10: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
6e20: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
6e30: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
6e40: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
6e50: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
6e60: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
6e70: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
6e80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6e90: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
6ea0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6eb0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
6ec0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
6ed0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
6ee0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
6ef0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
6f00: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
6f10: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
6f20: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
6f30: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
6f40: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
6f50: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
6f60: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
6f70: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
6f80: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
6f90: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
6fa0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
6fb0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
6fc0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
6fd0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
6fe0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
6ff0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
7000: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
7010: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
7020: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
7030: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
7040: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
7050: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
7060: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
7070: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7080: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
7090: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
70a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
70b0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
70c0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
70d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
70e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
70f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
7100: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
7110: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
7120: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63   utf8ToUnicode(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
7140: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
7150: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
7160: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
7170: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
7180: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
7190: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
71a0: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
71b0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
71c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
71d0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
71e0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
71f0: 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69  malloc( nChar*si
7200: 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61  zeof(zWideFilena
7210: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
7220: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30  zWideFilename==0
7230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7240: 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20  ;.  }.  nChar = 
7250: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7260: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
7270: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
7280: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a   zWideFilename,.
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
72c0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  har==0 ){.    sq
72d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
72e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
72f0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30  WideFilename = 0
7300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7310: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  WideFilename;.}.
7320: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
7330: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
7340: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
7350: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
7360: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
7370: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
7380: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7390: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
73a0: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
73b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  8(LPCWSTR zWideF
73c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
73d0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
73e0: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79  Filename;..  nBy
73f0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
7400: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
7410: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
7420: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
7430: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7440: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
7450: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
7460: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
7470: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
7480: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
7490: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
74a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
74b0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
74c0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
74d0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
74e0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
74f0: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
7520: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7530: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
7540: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
7550: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
7560: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
7570: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
7590: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
75a0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
75b0: 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74  code, based on t
75c0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f  he.** current co
75d0: 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20  depage settings 
75e0: 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a  for file apis..*
75f0: 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  * .** Space to h
7600: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7610: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
7620: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
7630: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  te3_malloc..*/.s
7640: 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63  tatic LPWSTR mbc
7650: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
7660: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7670: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
7680: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69    LPWSTR zMbcsFi
7690: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
76a0: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
76b0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
76c0: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
76d0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
76e0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
76f0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
7700: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
7710: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57       0)*sizeof(W
7740: 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79  CHAR);.  if( nBy
7750: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  te==0 ){.    ret
7760: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62  urn 0;.  }.  zMb
7770: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  csFilename = sql
7780: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
7790: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
77a0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
77b0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
77c0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
77d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
77e0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
77f0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
7800: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
7810: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
7820: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
7850: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7870: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
7880: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
7890: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
78a0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
78b0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
78c0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
78d0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
78e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
78f0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
7900: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
7910: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
7920: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
7930: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
7940: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
7950: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
7960: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
7970: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
7980: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
7990: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
79a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
79b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
79c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
79d0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
79e0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
79f0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
7a00: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
7a10: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
7a20: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
7a30: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
7a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
7a50: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
7a60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7a70: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
7a80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
7a90: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
7aa0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
7ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ac0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
7ad0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
7ae0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
7af0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
7b00: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
7b30: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7b40: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
7b50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
7b60: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
7b70: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
7b80: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
7b90: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
7ba0: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
7bb0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
7bc0: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
7bd0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
7be0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
7bf0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
7c00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
7c10: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
7c20: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
7c30: 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  _utf8(const char
7c40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7c50: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
7c60: 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  tf8;.  LPWSTR zT
7c70: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
7c80: 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63  ide = mbcsToUnic
7c90: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
7ca0: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
7cb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7cc0: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
7cd0: 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65  meUtf8 = unicode
7ce0: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
7cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
7d00: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
7d10: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
7d20: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
7d30: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
7d40: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
7d50: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
7d60: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
7d70: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
7d80: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
7d90: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7da0: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
7db0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
7dc0: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
7dd0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
7de0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
7df0: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
7e00: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
7e10: 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  pWide = utf8ToUn
7e20: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
7e30: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
7e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7e50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
7e60: 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f  nameMbcs = unico
7e70: 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64  deToMbcs(zTmpWid
7e80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
7e90: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
7ea0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
7eb0: 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Mbcs;.}.../*.** 
7ec0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
7ed0: 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72   of getLastError
7ee0: 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  Msg.** is zero i
7ef0: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
7f00: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
7f10: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
7f20: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
7f30: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
7f40: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
7f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7f60: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
7f70: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
7f80: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
7f90: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
7fa0: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
7fb0: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
7fc0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
7fd0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
7fe0: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
7ff0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
8000: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
8010: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
8020: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
8030: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
8040: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
8050: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
8060: 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
8070: 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
8080: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
8090: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
80a0: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
80b0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
80c0: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
80f0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
8100: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
8130: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
8140: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
81d0: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
81e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
8220: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
8230: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
8240: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
8250: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
8260: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
8270: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
8280: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
8290: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
82a0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
82b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
82c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
82d0: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
82e0: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
82f0: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
8300: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
8310: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
8320: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  e(zTempWide);.  
8330: 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
8340: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
8350: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
8360: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
8370: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
8380: 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
8390: 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
83a0: 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
83b0: 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
83c0: 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
83d0: 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
83e0: 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
83f0: 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
8400: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8410: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
8420: 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d     char *zTemp =
8430: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
8440: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
8450: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
8460: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
8470: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
84a0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
84d0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
84e0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
8530: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d     (LPSTR) &zTem
8580: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
85d0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
85e0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
85f0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
8600: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
8610: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
8620: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8630: 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
8640: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
8650: 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
8660: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
8670: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8680: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
8690: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
86a0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
86b0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
86c0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
86d0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  mp);.    }.#endi
86e0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d  f.  }.  if( 0 ==
86f0: 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71   dwLen ){.    sq
8700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8710: 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72  Buf, zBuf, "OsEr
8720: 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20  ror 0x%x (%u)", 
8730: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
8740: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
8750: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
8760: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
8770: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
8780: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
8790: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
87a0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
87b0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
87c0: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
87d0: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
87e0: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
87f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8800: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
8810: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
8820: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
8830: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
8840: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
8850: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
8860: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
8870: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
8880: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
8890: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
88a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
88b0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
88c0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
88d0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
88e0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
88f0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
8900: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
8910: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
8920: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
8930: 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74   from .** Format
8940: 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  Message..**.** T
8950: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8960: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
8970: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
8980: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
8990: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
89a0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
89b0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
89c0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
89d0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
89e0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
89f0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
8a00: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
8a10: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
8a20: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
8a30: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68 65  iled and the the
8a40: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
8a50: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66  -system path, if
8a60: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
8a70: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62   winLogError(a,b
8a80: 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72  ,c,d)   winLogEr
8a90: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
8aa0: 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  d,__LINE__).stat
8ab0: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72  ic int winLogErr
8ac0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
8ad0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8af0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
8b00: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
8b10: 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  Errno,          
8b20: 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c        /* Win32 l
8b30: 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  ast error */.  c
8b40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8b60: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
8b70: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
8b80: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8b90: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
8ba0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
8bb0: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
8bc0: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
8bd0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bf0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
8c00: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
8c10: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
8c20: 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d    char zMsg[500]
8c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c40: 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61    /* Human reada
8c50: 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a  ble error text *
8c60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8c90: 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30  ter */..  zMsg[0
8ca0: 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73 74  ] = 0;.  getLast
8cb0: 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72  ErrorMsg(lastErr
8cc0: 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29  no, sizeof(zMsg)
8cd0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72  , zMsg);.  asser
8ce0: 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49  t( errcode!=SQLI
8cf0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
8d00: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
8d10: 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = "";.  for(i=0;
8d20: 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67   zMsg[i] && zMsg
8d30: 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73  [i]!='\r' && zMs
8d40: 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29  g[i]!='\n'; i++)
8d50: 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30  {}.  zMsg[i] = 0
8d60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
8d70: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
8d80: 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64  os_win.c:%d: (%d
8d90: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
8da0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73        iLine, las
8db0: 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  tErrno, zFunc, z
8dc0: 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a  Path, zMsg.  );.
8dd0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
8de0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
8df0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
8e00: 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28  that a ReadFile(
8e10: 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20  ), WriteFile(), 
8e20: 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29  and DeleteFile()
8e30: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72  .** will be retr
8e40: 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ied following a 
8e50: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20  locking error - 
8e60: 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20  probably caused 
8e70: 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73  by .** antivirus
8e80: 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f   software.  Also
8e90: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c   the initial del
8ea0: 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ay before the fi
8eb0: 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68  rst retry..** Th
8ec0: 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65  e delay increase
8ed0: 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20  s linearly with 
8ee0: 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23  each retry..*/.#
8ef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
8f00: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a  N32_IOERR_RETRY.
8f10: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
8f20: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
8f30: 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  Y 10.#endif.#ifn
8f40: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
8f50: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
8f60: 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  AY.# define SQLI
8f70: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
8f80: 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65  ETRY_DELAY 25.#e
8f90: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
8fa0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20  win32IoerrRetry 
8fb0: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
8fc0: 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
8fd0: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
8fe0: 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51  rRetryDelay = SQ
8ff0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
9000: 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f  _RETRY_DELAY;../
9010: 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69  *.** If a ReadFi
9020: 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c  le() or WriteFil
9030: 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  e() error occurs
9040: 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  , invoke this ro
9050: 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20  utine.** to see 
9060: 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  if it should be 
9070: 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e  retried.  Return
9080: 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20   TRUE to retry. 
9090: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
90a0: 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68   to give up with
90b0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
90c0: 61 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f  atic int retryIo
90d0: 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79  err(int *pnRetry
90e0: 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29  , DWORD *pError)
90f0: 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
9100: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9110: 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d    if( *pnRetry>=
9120: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20  win32IoerrRetry 
9130: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f  ){.    if( pErro
9140: 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  r ){.      *pErr
9150: 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20  or = e;.    }.  
9160: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9170: 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41    if( e==ERROR_A
9180: 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a  CCESS_DENIED ||.
9190: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c        e==ERROR_L
91a0: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c  OCK_VIOLATION ||
91b0: 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f  .      e==ERROR_
91c0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
91d0: 4e 20 29 7b 0a 20 20 20 20 6f 73 53 6c 65 65 70  N ){.    osSleep
91e0: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
91f0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
9200: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
9210: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
9220: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
9230: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
9240: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
9250: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9260: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
9270: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
9280: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
9290: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
92a0: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
92b0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
92c0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
92d0: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
92e0: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
92f0: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
9300: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
9310: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
9320: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
9330: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
9340: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
9350: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
9360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
93a0: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
93b0: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
93c0: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
93d0: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43  ./*.** Windows C
93e0: 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  E does not have 
93f0: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
9400: 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61  nction.  So crea
9410: 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75  te a.** substitu
9420: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
9430: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
9440: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
9450: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
9460: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
9470: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
9480: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
9490: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
94a0: 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
94b0: 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
94c0: 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
94d0: 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
94e0: 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
94f0: 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
9500: 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
9510: 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
9520: 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
9530: 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
9540: 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
9550: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
9560: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
9570: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
9580: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
9590: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
95a0: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
95b0: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
95c0: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
95d0: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
95e0: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
95f0: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
9600: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
9610: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
9620: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
9630: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
9640: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
9650: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
9660: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e  ;.}..#define HAN
9670: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
9680: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
9690: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
96a0: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
96b0: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
96c0: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
96d0: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
96e0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
96f0: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
9700: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
9710: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
9720: 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f    dwErr = WaitFo
9730: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
9740: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
9750: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
9760: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
9770: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
9780: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
9790: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
97a0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
97b0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
97c0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
97d0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
97e0: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
97f0: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
9800: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
9810: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
9820: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
9830: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
9840: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
9850: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
9860: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
9870: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9880: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
9890: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
98a0: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
98b0: 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  me;.  BOOL bInit
98c0: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
98d0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
98e0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
98f0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
9900: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
9910: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
9920: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
9930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
9940: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
9950: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
9960: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
9970: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
9980: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
9990: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
99a0: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
99b0: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
99c0: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
99d0: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
99e0: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
99f0: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
9a00: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
9a10: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
9a20: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
9a30: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
9a40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
9a50: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
9a60: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
9a70: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
9a80: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
9a90: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
9aa0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
9ab0: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
9ac0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
9ad0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9ae0: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
9af0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
9b00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
9b10: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
9b20: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
9b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b40: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
9b50: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
9b60: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
9b70: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
9b80: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
9b90: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
9ba0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
9bb0: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
9bc0: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
9bd0: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
9be0: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
9bf0: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
9c00: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
9c10: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
9c20: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
9c30: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
9c40: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
9c50: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
9c60: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
9c70: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
9c80: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
9c90: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
9ca0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
9cb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
9cc0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9cd0: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
9d10: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
9d20: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
9d60: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
9d70: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
9d80: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
9d90: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
9da0: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
9db0: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
9dc0: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73  ized */.  if (os
9dd0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
9de0: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
9df0: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
9e00: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
9e10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9e20: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
9e30: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
9e40: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
9e50: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
9e60: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
9e70: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
9e80: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
9e90: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
9ea0: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
9eb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
9ec0: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
9ed0: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
9ee0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
9ef0: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
9f00: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
9f10: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
9f20: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
9f30: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
9f40: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
9f50: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
9f60: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
9f70: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
9f80: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
9f90: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
9fa0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
9fb0: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
9fc0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
9fd0: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
9fe0: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
9ff0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73  ename);.      os
a000: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a010: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
a020: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
a030: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
a040: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
a050: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
a060: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
a070: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
a080: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
a090: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
a0a0: 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b  Shared == NULL){
a0b0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a0c0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a0d0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
a0e0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
a0f0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
a100: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
a110: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
a120: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
a130: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a140: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
a150: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
a160: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
a170: 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t) {.    memset(
a180: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
a190: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
a1a0: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
a1b0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
a1c0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
a1d0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
a1e0: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
a1f0: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
a200: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
a210: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
a220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a230: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
a240: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
a250: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
a260: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
a270: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
a280: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
a290: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
a2a0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
a2b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
a2c0: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
a2d0: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
a2e0: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
a2f0: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
a300: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
a310: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
a320: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
a330: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
a340: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
a350: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
a360: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
a370: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
a380: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
a390: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
a3a0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
a3b0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
a3c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
a3d0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
a3e0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
a3f0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
a400: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
a410: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
a420: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a430: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a440: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
a450: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
a460: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
a470: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
a480: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
a490: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
a4a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
a4b0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
a4c0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
a4d0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
a4e0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
a4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
a500: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
a510: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a520: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a530: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
a540: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
a550: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
a560: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
a570: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
a580: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
a590: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
a5a0: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
a5b0: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
a5c0: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
a5d0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
a5e0: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
a5f0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
a600: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
a610: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
a620: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
a630: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a640: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
a650: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
a660: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
a670: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
a680: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
a690: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
a6a0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
a6b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a6c0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
a6d0: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
a6e0: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
a6f0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
a700: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
a710: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
a720: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
a730: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
a740: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
a750: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
a760: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
a770: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
a780: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
a790: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
a7a0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
a7b0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
a7c0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
a7d0: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
a7e0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
a7f0: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
a800: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
a810: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
a820: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a830: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
a840: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
a850: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
a860: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
a870: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
a880: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
a890: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
a8a0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
a8b0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
a8c0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
a8d0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
a8e0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
a8f0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
a900: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
a910: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
a920: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
a930: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
a940: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
a950: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
a960: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
a970: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
a980: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
a990: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
a9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a9b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a9c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a9d0: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
a9e0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
a9f0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
aa00: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
aa10: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
aa20: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
aa30: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
aa40: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
aa50: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
aa60: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
aa70: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
aa80: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
aa90: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
aaa0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
aab0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
aac0: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
aad0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
aae0: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
aaf0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
ab00: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
ab10: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
ab20: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
ab30: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
ab40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
ab50: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
ab60: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
ab70: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
ab80: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
ab90: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
aba0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
abb0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
abc0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
abd0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
abe0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
abf0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
ac00: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
ac10: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
ac20: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
ac30: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
ac40: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
ac50: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
ac60: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ac70: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
ac80: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
ac90: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
aca0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
acb0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
acc0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
acd0: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
ace0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
acf0: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
ad00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
ad10: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
ad20: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
ad30: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
ad40: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
ad50: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
ad60: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
ad70: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
ad80: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
ad90: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
ada0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
adb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
adc0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
add0: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
ade0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
adf0: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
ae00: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
ae10: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
ae20: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
ae30: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
ae40: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
ae50: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
ae60: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
ae70: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
ae80: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
ae90: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
aea0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
aeb0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
aec0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
aed0: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
aee0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
aef0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
af00: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
af10: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
af20: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
af30: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
af40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
af50: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
af60: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
af70: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
af80: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
af90: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
afa0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
afb0: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
afc0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
afd0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
afe0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
aff0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
b000: 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e  SHARED_SIZE || n
b010: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
b020: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
b030: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b040: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
b050: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
b060: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
b070: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
b080: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
b090: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
b0a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
b0c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b0d0: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
b0e0: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
b0f0: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
b100: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
b110: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26  )PENDING_BYTE &&
b120: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b130: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b140: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b150: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
b160: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b170: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
b180: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
b190: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
b1a0: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
b1b0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b1c0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
b1d0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
b1e0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
b1f0: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
b200: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
b210: 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
b220: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
b230: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
b240: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
b250: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b260: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
b270: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
b290: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
b2a0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
b2b0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
b2c0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b2d0: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
b2e0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
b2f0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
b300: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
b310: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
b320: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b330: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b340: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
b350: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
b360: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
b370: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
b380: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
b390: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
b3a0: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
b3b0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
b3c0: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
b3d0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
b3e0: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
b3f0: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
b400: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e  erlapped.){.  UN
b410: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
b420: 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e  wReserved);.  UN
b430: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
b440: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b450: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20  ockHigh);..  /* 
b460: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
b470: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
b480: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
b490: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
b4a0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
b4b0: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
b4c0: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
b4d0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
b4e0: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77  IRST &&.      dw
b4f0: 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20  Flags == 1 &&.  
b500: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
b510: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
b520: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
b530: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
b540: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
b550: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
b560: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
b570: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
b580: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
b590: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
b5a0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
b5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
b600: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
b610: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
b620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
b670: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
b680: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
b690: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
b6a0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
b6b0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
b6c0: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
b6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
b720: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
b730: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
b740: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
b750: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
b760: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
b770: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
b780: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
b790: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
b7a0: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  D)-1).#endif../*
b7b0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
b7c0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
b7d0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
b7e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
b7f0: 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
b800: 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
b810: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
b820: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
b830: 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a  ul, return 0. .*
b840: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
b850: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b860: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
b870: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
b880: 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65   int seekWinFile
b890: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
b8a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b8b0: 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  Offset){.  LONG 
b8c0: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
b8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
b8e0: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
b8f0: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
b900: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
b910: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
b920: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
b930: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
b940: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
b950: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
b970: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b980: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
b990: 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
b9a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
b9b0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b9c0: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
b9d0: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
b9e0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
b9f0: 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
ba00: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
ba10: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
ba20: 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
ba30: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
ba40: 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
ba50: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
ba60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
ba70: 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a  eturns a dword .
ba80: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
ba90: 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
baa0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
bab0: 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
bac0: 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
bad0: 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
bae0: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
baf0: 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
bb00: 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20  ording to MSDN, 
bb10: 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
bb20: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
bb30: 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
bb40: 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
bb50: 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  o to determine .
bb60: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20    ** whether an 
bb70: 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c  error has actual
bb80: 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69  ly occured, it i
bb90: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
bba0: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
bbb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
bbc0: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
bbd0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
bbe0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
bbf0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
bc00: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
bc10: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
bc20: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
bc30: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
bc40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
bc50: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
bc60: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
bc70: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bc80: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
bc90: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
bca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
bcb0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
bcc0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
bcd0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
bce0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
bcf0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
bd00: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
bd10: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
bd20: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
bd30: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
bd40: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
bd50: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
bd60: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
bd70: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
bd80: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
bd90: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69  e result, but Wi
bda0: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
bdb0: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
bdc0: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
bdd0: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
bde0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
bdf0: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
be00: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
be10: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
be20: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
be30: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
be40: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
be50: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
be60: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
be70: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
be80: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
be90: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
bea0: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
beb0: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
bec0: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
bed0: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
bee0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
bef0: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
bf00: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
bf10: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
bf20: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
bf30: 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
bf40: 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
bf50: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
bf60: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
bf70: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a  ile->h));.  do{.
bf80: 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65      rc = osClose
bf90: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29  Handle(pFile->h)
bfa0: 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74  ;.    /* Simulat
bfb0: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20  eIOError( rc=0; 
bfc0: 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  cnt=MX_CLOSE_ATT
bfd0: 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77  EMPT; ); */.  }w
bfe0: 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b  hile( rc==0 && +
bff0: 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f  +cnt < MX_CLOSE_
c000: 41 54 54 45 4d 50 54 20 26 26 20 28 6f 73 53 6c  ATTEMPT && (osSl
c010: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
c020: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c030: 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
c040: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
c050: 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
c060: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
c070: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
c080: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
c090: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
c0a0: 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
c0b0: 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
c0c0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
c0d0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
c0e0: 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
c0f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
c100: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
c110: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
c120: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
c130: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
c140: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
c150: 20 20 29 7b 0a 20 20 20 20 20 20 20 6f 73 53 6c    ){.       osSl
c160: 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
c170: 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
c180: 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
c190: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
c1a0: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
c1b0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
c1c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
c1d0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
c1e0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
c1f0: 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
c200: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28  failed"));.  if(
c210: 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
c220: 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
c230: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
c240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
c250: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
c260: 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
c270: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
c280: 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
c290: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
c2c0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
c2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
c2e0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
c2f0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
c300: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c310: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
c320: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
c330: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
c340: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
c350: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
c360: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
c370: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
c380: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
c390: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
c3a0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
c3b0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
c3d0: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
c3e0: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
c3f0: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c410: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c420: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
c430: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
c440: 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
c450: 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
c460: 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
c470: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c480: 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
c490: 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
c4a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
c4b0: 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
c4c0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
c4d0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
c4e0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
c4f0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
c500: 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
c530: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
c540: 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
c550: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c570: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
c580: 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
c590: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
c5a0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
c5b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c5c0: 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52  RR_READ);.  OSTR
c5d0: 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f  ACE(("READ %d lo
c5e0: 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
c5f0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
c600: 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
c610: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
c620: 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
c630: 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
c640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c650: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68  E_FULL;.  }.  wh
c660: 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65  ile( !osReadFile
c670: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
c680: 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29   amt, &nRead, 0)
c690: 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73   ){.#else.  mems
c6a0: 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
c6b0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
c6c0: 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61  PPED));.  overla
c6d0: 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
c6e0: 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
c6f0: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65  ffffffff);.  ove
c700: 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
c710: 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
c720: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
c730: 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28  fffff);.  while(
c740: 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
c750: 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
c760: 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c  , &nRead, &overl
c770: 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20  apped) &&.      
c780: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
c790: 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  r()!=ERROR_HANDL
c7a0: 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a  E_EOF ){.#endif.
c7b0: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
c7c0: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74  rno;.    if( ret
c7d0: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
c7e0: 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
c7f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
c800: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c810: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
c820: 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
c830: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  r(SQLITE_IOERR_R
c840: 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EAD, pFile->last
c850: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
c860: 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70      "winRead", p
c870: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
c880: 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65  }.  logIoerr(nRe
c890: 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  try);.  if( nRea
c8a0: 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a  d<(DWORD)amt ){.
c8b0: 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
c8c0: 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
c8d0: 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
c8e0: 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
c8f0: 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
c900: 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d  f)[nRead], 0, am
c910: 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65  t-nRead);.    re
c920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
c930: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
c940: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
c950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c960: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
c970: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
c980: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
c990: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
c9a0: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
c9b0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
c9c0: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
c9d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
c9e0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
c9f0: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
ca00: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
ca10: 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
ca20: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
ca30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ca40: 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
ca50: 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
ca60: 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
ca90: 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
caa0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
cab0: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
cac0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
cad0: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
cae0: 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
caf0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
cb20: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
cb30: 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f  d, else false */
cb40: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
cb50: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
cb60: 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
cb70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
cb80: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
cb90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cba0: 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a   of retries */..
cbb0: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
cbc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
cbd0: 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
cbe0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
cbf0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
cc00: 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
cc10: 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
cc20: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
cc30: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
cc40: 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  ITE %d lock=%d\n
cc50: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
cc60: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
cc70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
cc80: 49 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b  INCE.  rc = seek
cc90: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
cca0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
ccb0: 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b  ==0 ){.#else.  {
ccc0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
ccd0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
cce0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
ccf0: 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
cd00: 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
cd10: 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
cd20: 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
cd30: 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
cd40: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
cd50: 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
cd60: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
cd70: 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
cd80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd90: 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
cda0: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
cdb0: 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
cde0: 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
cdf0: 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
ce00: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
ce10: 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
ce20: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
ce30: 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
ce40: 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
ce50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
ce60: 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
ce70: 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
ce80: 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
ce90: 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
cea0: 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
ceb0: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
cec0: 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
ced0: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
cee0: 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
cef0: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
cf00: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69  .#endif..    whi
cf10: 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69  le( nRem>0 ){.#i
cf20: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
cf30: 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  E.      if( !osW
cf40: 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
cf50: 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
cf60: 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65  nWrite, 0) ){.#e
cf70: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f  lse.      if( !o
cf80: 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
cf90: 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
cfa0: 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c   &nWrite, &overl
cfb0: 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66  apped) ){.#endif
cfc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
cfd0: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
cfe0: 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
cff0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d010: 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
d020: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  <=0 ){.        l
d030: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
d040: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
d050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d060: 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
d070: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f  OS_WINCE.      o
d080: 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b  ffset += nWrite;
d090: 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
d0a0: 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
d0b0: 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
d0c0: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76  fffff);.      ov
d0d0: 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
d0e0: 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
d0f0: 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
d100: 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a  ffffff);.#endif.
d110: 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57        aRem += nW
d120: 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d  rite;.      nRem
d130: 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   -= nWrite;.    
d140: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30  }.    if( nRem>0
d150: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
d160: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
d170: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
d180: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
d190: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
d1a0: 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e   if(   ( pFile->
d1b0: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
d1c0: 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c  _HANDLE_DISK_FUL
d1d0: 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  L ).       || ( 
d1e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d1f0: 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c  ==ERROR_DISK_FUL
d200: 4c 20 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75  L )){.      retu
d210: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
d220: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
d230: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
d240: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c  ITE_IOERR_WRITE,
d250: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d260: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
d270: 22 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c  "winWrite", pFil
d280: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
d290: 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
d2a0: 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20  (nRetry);.  }.  
d2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
d2d0: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
d2e0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
d2f0: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
d300: 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
d310: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d320: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
d330: 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
d340: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
d350: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
d360: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
d370: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d380: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d390: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d3a0: 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
d3b0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
d3c0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f  t( pFile );..  O
d3d0: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
d3e0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46  E %d %lld\n", pF
d3f0: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b  ile->h, nByte));
d400: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
d410: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
d420: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
d430: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
d440: 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
d450: 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
d460: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
d470: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
d480: 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
d490: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
d4a0: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
d4b0: 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
d4c0: 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
d4d0: 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
d4e0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
d4f0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
d500: 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
d510: 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
d520: 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
d530: 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
d540: 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
d550: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
d560: 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
d570: 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
d580: 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
d590: 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
d5a0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
d5b0: 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
d5c0: 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
d5d0: 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
d5e0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
d5f0: 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
d600: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
d610: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
d620: 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
d630: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
d640: 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
d650: 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
d660: 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
d670: 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
d680: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 29  File(pFile->h) )
d690: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
d6a0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
d6b0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
d6c0: 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
d6d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
d6e0: 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
d6f0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d700: 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
d710: 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
d720: 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  th);.  }..  OSTR
d730: 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25  ACE(("TRUNCATE %
d740: 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46  d %lld %s\n", pF
d750: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72  ile->h, nByte, r
d760: 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
d770: 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
d780: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
d790: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
d7a0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
d7b0: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
d7c0: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
d7d0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
d7e0: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
d7f0: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
d800: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
d810: 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
d820: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
d830: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
d840: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
d850: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
d860: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
d870: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
d880: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
d890: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
d8a0: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
d8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
d8c0: 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
d8d0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
d8e0: 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
d8f0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
d900: 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
d910: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
d920: 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
d930: 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
d940: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
d950: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
d960: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
d970: 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
d980: 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53  \.    (defined(S
d990: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
d9a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
d9b0: 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  BUG)).  /*.  ** 
d9c0: 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
d9d0: 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
d9e0: 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
d9f0: 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
da00: 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
da10: 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
da20: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
da30: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
da40: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
da50: 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
da60: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
da70: 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
da80: 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
da90: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
daa0: 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
dab0: 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
dac0: 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
dad0: 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
dae0: 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
daf0: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
db00: 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
db10: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
db20: 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  NC %d lock=%d\n"
db30: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
db40: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
db50: 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
db60: 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
db70: 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
db80: 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
db90: 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
dba0: 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
dbb0: 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
dbc0: 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
dbd0: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
dbe0: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
dbf0: 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
dc00: 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23  QLITE_FULL );..#
dc10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
dc20: 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
dc30: 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
dc40: 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
dc50: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
dc60: 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
dc70: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
dc80: 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
dc90: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
dca0: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
dcb0: 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
dcc0: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
dcd0: 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
dce0: 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
dcf0: 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
dd00: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
dd10: 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72 6e  NO_SYNC.  return
dd20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
dd30: 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68  e.  rc = osFlush
dd40: 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c  FileBuffers(pFil
dd50: 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74  e->h);.  Simulat
dd60: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c  eIOError( rc=FAL
dd70: 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  SE );.  if( rc )
dd80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
dd90: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
dda0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
ddb0: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
ddc0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
ddd0: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
dde0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
ddf0: 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
de00: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
de10: 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70      "winSync", p
de20: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
de30: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
de40: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
de50: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
de60: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
de70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
de80: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
de90: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
dea0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
deb0: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
dec0: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
ded0: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
dee0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
def0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
df00: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
df10: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
df20: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
df30: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
df40: 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
df50: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47   lowerBits = osG
df60: 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65  etFileSize(pFile
df70: 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29  ->h, &upperBits)
df80: 3b 0a 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72  ;.  if(   (lower
df90: 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
dfa0: 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
dfb0: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
dfc0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
dfd0: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 0a  ))!=NO_ERROR) ).
dfe0: 20 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c    {.    pFile->l
dff0: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
e000: 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
e010: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
e020: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
e030: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e040: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
e050: 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
e060: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
e070: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28  }.  *pSize = (((
e080: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
e090: 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
e0a0: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74  lowerBits;.  ret
e0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e0c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
e0d0: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
e0e0: 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
e0f0: 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
e100: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
e110: 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
e120: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
e130: 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
e140: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
e150: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
e160: 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
e170: 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
e180: 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
e190: 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
e1a0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
e1b0: 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
e1c0: 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
e1d0: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
e1e0: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e   getReadLock(win
e1f0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
e200: 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69  int res;.  if( i
e210: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
e220: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
e230: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
e240: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e250: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
e260: 68 20 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e  h = 0;.    ovlp.
e270: 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  hEvent = 0;.    
e280: 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65  res = osLockFile
e290: 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  Ex(pFile->h, LOC
e2a0: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
e2b0: 49 41 54 45 4c 59 2c 0a 20 20 20 20 20 20 20 20  IATELY,.        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e2d0: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
e2e0: 2c 20 26 6f 76 6c 70 29 3b 0a 2f 2a 20 69 73 4e  , &ovlp);./* isN
e2f0: 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
e300: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
e310: 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
e320: 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
e330: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
e340: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
e350: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
e360: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
e370: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
e380: 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
e390: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
e3a0: 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
e3b0: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
e3c0: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
e3d0: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c  );.    res = osL
e3e0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
e3f0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
e400: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
e410: 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
e420: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
e430: 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20   res == 0 ){.   
e440: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e450: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
e460: 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20  or();.    /* No 
e470: 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61  need to log a fa
e480: 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f  ilure to lock */
e490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
e4a0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
e4b0: 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
e4c0: 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
e4d0: 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
e4e0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
e4f0: 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
e500: 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73  tErrno;.  if( is
e510: 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
e520: 3d 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  = osUnlockFile(p
e530: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
e540: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
e550: 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73  _SIZE, 0);./* is
e560: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
e570: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
e580: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
e590: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
e5a0: 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
e5b0: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
e5c0: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f  lse{.    res = o
e5d0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
e5e0: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
e5f0: 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72  ST + pFile->shar
e600: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
e610: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
e620: 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  .  if( res==0 &&
e630: 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
e640: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
e650: 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b  !=ERROR_NOT_LOCK
e660: 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ED) ){.    pFile
e670: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
e680: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
e690: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e6a0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46  IOERR_UNLOCK, pF
e6b0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
e6d0: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
e6e0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
e6f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
e700: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
e710: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
e720: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
e730: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
e740: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
e750: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e760: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
e770: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
e780: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
e790: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
e7a0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
e7b0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
e7c0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
e7d0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
e7e0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
e7f0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
e800: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
e810: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
e820: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
e830: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
e840: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
e850: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
e860: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
e870: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
e880: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
e890: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
e8a0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
e8b0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
e8c0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
e8d0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
e8e0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
e8f0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
e900: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
e910: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
e920: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
e930: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e940: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
e950: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
e960: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e970: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
e980: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
e990: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
e9a0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
e9b0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
e9c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
e9d0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
e9e0: 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
e9f0: 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
ea00: 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
ea10: 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
ea20: 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
ea30: 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
ea40: 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
ea50: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
ea60: 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
ea70: 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
ea80: 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
ea90: 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
eaa0: 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
eab0: 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
eac0: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
ead0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
eae0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
eaf0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eb00: 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
eb10: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
eb20: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
eb30: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
eb40: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
eb50: 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
eb60: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
eb70: 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
eb80: 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
eb90: 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
eba0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
ebb0: 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
ebc0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
ebd0: 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
ebe0: 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
ebf0: 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
ec00: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
ec10: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
ec20: 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
ec30: 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
ec40: 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
ec50: 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
ec60: 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77  E(("LOCK %d %d w
ec70: 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  as %d(%d)\n",.  
ec80: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
ec90: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  h, locktype, pFi
eca0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
ecb0: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
ecc0: 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  yte));..  /* If 
ecd0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
ece0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
ecf0: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
ed00: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
ed10: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
ed20: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
ed30: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
ed40: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
ed50: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
ed60: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
ed70: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
ed80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
ed90: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
eda0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
edb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
edc0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
edd0: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
ede0: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
edf0: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
ee00: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
ee10: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
ee20: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
ee30: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
ee40: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
ee50: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
ee60: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
ee70: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
ee80: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ee90: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
eea0: 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
eeb0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
eec0: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
eed0: 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
eee0: 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
eef0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
ef00: 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
ef10: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
ef20: 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
ef30: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
ef40: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
ef50: 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
ef60: 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
ef70: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
ef80: 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69  pe;.  if(   (pFi
ef90: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
efa0: 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28  _LOCK).     || (
efb0: 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58     (locktype==EX
efc0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
efd0: 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65         && (pFile
efe0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
eff0: 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  RVED_LOCK)).  ){
f000: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33  .    int cnt = 3
f010: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
f020: 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 6f  -->0 && (res = o
f030: 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  sLockFile(pFile-
f040: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
f050: 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
f060: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
f070: 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
f080: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
f090: 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
f0a0: 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
f0b0: 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
f0c0: 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
f0d0: 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
f0e0: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
f0f0: 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
f100: 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
f110: 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
f120: 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
f130: 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
f140: 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
f150: 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
f160: 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
f170: 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
f180: 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
f190: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
f1a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f1b0: 20 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64   OSTRACE(("could
f1c0: 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49   not get a PENDI
f1d0: 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c  NG lock. cnt=%d\
f1e0: 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20  n", cnt));.     
f1f0: 20 69 66 28 20 63 6e 74 20 29 20 6f 73 53 6c 65   if( cnt ) osSle
f200: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
f210: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
f220: 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
f230: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
f240: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f250: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
f260: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
f270: 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
f280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
f290: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f2a0: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
f2b0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
f2c0: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
f2d0: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65   );.    res = ge
f2e0: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
f2f0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
f300: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
f310: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
f320: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f330: 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
f340: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
f350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f360: 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
f370: 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
f380: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
f390: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
f3a0: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
f3b0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
f3c0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
f3d0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f  ;.    res = osLo
f3e0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
f3f0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
f400: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
f410: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
f420: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
f430: 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
f440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
f450: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f460: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
f470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
f480: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
f490: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
f4a0: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
f4b0: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
f4c0: 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
f4d0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f4e0: 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
f4f0: 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
f500: 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
f510: 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
f520: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
f530: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
f540: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
f550: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
f560: 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
f570: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
f580: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  unlockReadLock(p
f590: 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  File);.    OSTRA
f5a0: 43 45 28 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20  CE(("unreadlock 
f5b0: 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a  = %d\n", res));.
f5c0: 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b      res = osLock
f5d0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
f5e0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
f5f0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
f600: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
f610: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
f620: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
f630: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
f640: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
f650: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
f660: 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
f670: 28 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  (("error-code = 
f680: 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f  %d\n", lastErrno
f690: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
f6a0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
f6b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
f6c0: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
f6d0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
f6e0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
f6f0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
f700: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
f710: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
f720: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
f730: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
f740: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73  D_LOCK ){.    os
f750: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
f760: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
f770: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
f780: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
f790: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
f7a0: 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
f7b0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f7c0: 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
f7d0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
f7e0: 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
f7f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
f800: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f810: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
f820: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
f830: 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72  OCK FAILED %d tr
f840: 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20  ying for %d but 
f850: 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  got %d\n", pFile
f860: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
f870: 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
f880: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69  ktype));.    pFi
f890: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f8a0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
f8b0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f8c0: 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
f8d0: 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77  cktype = (u8)new
f8e0: 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  Locktype;.  retu
f8f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f900: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
f910: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
f920: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
f930: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
f940: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
f950: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
f960: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
f970: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
f980: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
f990: 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
f9a0: 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
f9b0: 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
f9c0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
f9d0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f9e0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
f9f0: 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20  t rc;.  winFile 
fa00: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
fa10: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
fa20: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
fa30: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
fa40: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
fa50: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
fa60: 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  id!=0 );.  if( p
fa70: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
fa80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
fa90: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
faa0: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
fab0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c  WR-LOCK %d %d (l
fac0: 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
fad0: 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73  >h, rc));.  }els
fae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4c 6f  e{.    rc = osLo
faf0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
fb00: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
fb10: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
fb20: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6f 73  ( rc ){.      os
fb30: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
fb40: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
fb50: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
fb60: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
fb70: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
fb80: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
fb90: 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
fba0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
fbb0: 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
fbc0: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
fbd0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fbe0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
fbf0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
fc00: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
fc10: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
fc20: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
fc30: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
fc40: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
fc50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
fc60: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
fc70: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fc80: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
fc90: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
fca0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
fcb0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
fcc0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
fcd0: 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
fce0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
fcf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
fd00: 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
fd10: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
fd20: 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
fd30: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
fd40: 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
fd50: 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
fd60: 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
fd70: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fd80: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
fd90: 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
fda0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
fdb0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
fdc0: 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
fdd0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fde0: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
fdf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fe00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
fe10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
fe20: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
fe30: 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
fe40: 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
fe50: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
fe60: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
fe70: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
fe80: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
fe90: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
fea0: 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
feb0: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
fec0: 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
fed0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
fee0: 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69  {.    osUnlockFi
fef0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
ff00: 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
ff10: 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
ff20: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
ff30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
ff40: 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  !getReadLock(pFi
ff50: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
ff60: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
ff70: 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
ff80: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
ff90: 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
ffa0: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
ffb0: 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
ffc0: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
ffd0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
ffe0: 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
fff0: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
10000 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
10010 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
10020 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
10030 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
10040 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f  ED_LOCK ){.    o
10050 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
10060 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
10070 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
10080 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
10090 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
100a0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
100b0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
100c0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
100d0 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
100e0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
100f0 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70    osUnlockFile(p
10100 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
10110 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
10120 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
10130 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
10140 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
10150 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
10160 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
10170 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
10180 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
10190 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
101a0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
101b0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
101c0 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
101d0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
101e0 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
101f0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
10200 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
10210 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
10220 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
10230 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
10240 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
10250 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
10260 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
10270 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
10280 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
10290 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
102a0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
102b0 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
102c0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
102d0 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
102e0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
102f0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
10300 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
10310 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
10320 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
10330 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
10340 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
10350 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
10360 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
10370 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
10380 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
10390 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
103a0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
103b0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  winFile*)id;.  s
103c0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
103d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
103e0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
103f0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
10400 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
10410 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ype;.      retur
10420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
10430 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
10440 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
10450 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
10460 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
10470 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
10480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10490 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
104a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
104b0 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
104c0 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75      pFile->szChu
104d0 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
104e0 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
104f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
10500 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
10510 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
10520 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
10530 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
10540 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10550 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
10560 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
10570 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
10580 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
10590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
105a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
105b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
105c0 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
105d0 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
105e0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
105f0 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
10600 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
10610 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
10620 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
10630 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
10640 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
10650 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
10660 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
10670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
10690 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
106a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
106b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
106c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
106d0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
106e0 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
106f0 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
10700 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
10710 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
10720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10730 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
10740 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
10750 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
10760 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
10770 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
10780 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
10790 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
107a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
107b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
107c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
107d0 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
107e0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
107f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10800 22 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20  "win32");.      
10810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10830 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
10840 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
10850 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
10860 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
10870 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
10880 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72         win32Ioer
10890 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20  rRetry = a[0];. 
108a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
108b0 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32      a[0] = win32
108c0 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
108d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
108e0 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
108f0 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
10900 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
10910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10920 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f    a[1] = win32Io
10930 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20  errRetryDelay;. 
10940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
10950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10960 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10970 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
10980 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
10990 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
109a0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
109b0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
109c0 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
109d0 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
109e0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
109f0 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
10a00 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
10a10 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
10a20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
10a30 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
10a40 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
10a50 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
10a60 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
10a70 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
10a80 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
10a90 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
10aa0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
10ab0 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
10ac0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
10ad0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
10ae0 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
10af0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
10b00 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
10b10 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
10b20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
10b30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10b40 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20  {.  (void)id;.  
10b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
10b60 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
10b70 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
10b80 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64  rn a vector of d
10b90 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
10ba0 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stics..*/.static
10bb0 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68   int winDeviceCh
10bc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
10bd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
10be0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20  .  winFile *p = 
10bf0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
10c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10c10 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
10c20 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20  WHEN_OPEN |.    
10c30 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c       ((p->ctrlFl
10c40 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53  ags & WINFILE_PS
10c50 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50  OW)?SQLITE_IOCAP
10c60 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
10c70 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e  RITE:0);.}..#ifn
10c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10c90 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  WAL../* .** Wind
10ca0 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
10cb0 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
10cc0 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
10cd0 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
10ce0 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
10cf0 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
10d00 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
10d10 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
10d20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
10d30 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
10d40 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
10d50 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
10d60 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a   winSysInfo;../*
10d70 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
10d80 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
10d90 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
10da0 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
10db0 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
10dc0 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
10dd0 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f  rotect the winLo
10de0 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75  ckInfo objects u
10df0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  sed by .** this 
10e00 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
10e10 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
10e20 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
10e30 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
10e40 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
10e50 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
10e60 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
10e70 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
10e80 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
10e90 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
10ea0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
10eb0 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
10ec0 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
10ed0 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
10ee0 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
10ef0 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
10f00 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
10f10 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
10f20 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
10f30 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
10f40 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
10f50 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
10f60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10f70 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
10f80 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10f90 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
10fa0 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
10fb0 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
10fc0 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
10fd0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10fe0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10ff0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
11000 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
11010 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
11020 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
11030 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
11040 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
11050 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
11060 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
11070 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
11080 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
11090 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  R));.}.#endif../
110a0 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
110b0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
110c0 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
110d0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
110e0 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
110f0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
11100 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
11110 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
11120 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
11130 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
11140 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
11150 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
11160 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
11170 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
11180 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
11190 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
111a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
111b0 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
111c0 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
111d0 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
111e0 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
111f0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
11200 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
11210 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
11220 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
11230 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
11240 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
11250 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
11260 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
11270 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
11280 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  xt .**.** The fo
11290 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
112a0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
112b0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
112c0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
112d0 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
112e0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
112f0 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
11300 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
11310 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
11320 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
11330 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
11340 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
11350 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
11360 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
11370 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
11380 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
11390 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
113a0 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
113b0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
113c0 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
113d0 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
113e0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
113f0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
11400 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11410 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
11420 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
11430 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
11440 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
11450 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
11460 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
11470 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
11480 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
11490 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
114a0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
114b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
114c0 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
114d0 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
114e0 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
114f0 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
11500 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
11510 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
11520 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
11530 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
11540 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
11550 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
11560 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
11570 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
11580 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
11590 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
115a0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
115b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
115c0 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
115d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
115e0 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
115f0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
11600 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
11610 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
11620 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
11630 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
11640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
11650 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
11660 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
11670 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ts */.#ifdef SQL
11680 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e  ITE_DEBUG.  u8 n
11690 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
116a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
116b0 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
116c0 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
116d0 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
116e0 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
116f0 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
11700 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
11710 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
11720 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
11730 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
11740 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
11750 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
11760 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
11770 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
11780 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
11790 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
117a0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
117b0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
117c0 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
117d0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
117e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
117f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
11800 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
11810 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
11820 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
11830 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
11840 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
11850 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
11860 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
11870 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
11880 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
11890 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
118a0 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
118b0 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
118c0 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
118d0 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
118e0 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
118f0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
11900 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
11910 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
11920 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
11930 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
11940 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
11950 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
11960 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
11970 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
11980 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
11990 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119b0 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
119c0 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
119d0 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
119e0 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
119f0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11a00 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
11a10 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
11a20 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
11a30 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
11a40 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
11a50 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
11a60 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
11a70 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
11a80 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
11a90 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
11aa0 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
11ab0 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
11ac0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
11ad0 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
11ae0 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
11af0 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
11b00 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
11b10 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
11b20 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
11b30 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
11b40 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
11b50 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
11b60 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
11b70 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
11b80 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
11b90 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
11ba0 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
11bb0 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
11bc0 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
11bd0 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
11be0 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
11bf0 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
11c00 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
11c10 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
11c20 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
11c30 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
11c40 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
11c50 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
11c60 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
11c70 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
11c80 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
11c90 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
11ca0 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
11cb0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
11cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
11cd0 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
11ce0 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
11cf0 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
11d00 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
11d10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d20 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
11d30 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
11d40 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
11d50 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
11d60 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  s;.  int rc = 0;
11d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11d80 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
11d90 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
11da0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
11db0 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
11dc0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
11dd0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
11de0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
11df0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11e00 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
11e10 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
11e20 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
11e30 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11e40 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
11e50 72 73 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20  rs */.  dwFlags 
11e60 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
11e70 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69  IMMEDIATELY;.  i
11e80 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
11e90 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
11ea0 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
11eb0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
11ec0 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c  .  memset(&ovlp,
11ed0 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
11ee0 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e  APPED));.  ovlp.
11ef0 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a  Offset = ofst;..
11f00 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
11f10 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
11f20 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
11f30 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
11f40 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
11f50 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  rc = osUnlockFil
11f60 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65  eEx(pFile->hFile
11f70 2e 68 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c  .h, 0, nByte, 0,
11f80 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
11f90 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4c 6f 63  {.    rc = osLoc
11fa0 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  kFileEx(pFile->h
11fb0 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c  File.h, dwFlags,
11fc0 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f   0, nByte, 0, &o
11fd0 76 6c 70 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  vlp);.  }.  .  i
11fe0 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
11ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
12010 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12020 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
12030 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
12040 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
12050 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
12060 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78 25  OCK %d %s %s 0x%
12070 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20  08lx\n", .      
12080 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
12090 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e.h,.           
120a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
120b0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 2c  "ok" : "failed",
120c0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
120d0 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
120e0 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   ? "UnlockFileEx
120f0 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22  " : "LockFileEx"
12100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
12110 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b  le->lastErrno));
12120 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
12130 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
12140 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
12150 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
12160 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
12170 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
12180 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
12190 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
121a0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
121b0 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
121c0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
121d0 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
121e0 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
121f0 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
12200 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
12210 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
12220 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
12230 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
12240 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
12250 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
12260 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
12270 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
12280 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
12290 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
122a0 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
122b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
122c0 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
122d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
122e0 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
122f0 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20  p;.  BOOL bRc;. 
12300 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
12310 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
12320 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
12330 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
12340 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
12350 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
12360 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
12370 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
12380 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d  utex ) sqlite3_m
12390 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
123a0 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ex);.      for(i
123b0 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
123c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
123d0 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
123e0 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
123f0 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
12400 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
12410 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20  HM-PURGE pid-%d 
12420 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  unmap region=%d 
12430 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
12440 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
12450 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
12460 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20  Id(), i,.       
12470 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20            bRc ? 
12480 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
12490 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
124a0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
124b0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
124c0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
124d0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
124e0 70 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67  pid-%d close reg
124f0 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12510 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
12520 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a  ProcessId(), i,.
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
12550 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
12560 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
12570 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41 4c 49  File.h != INVALI
12580 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
12590 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
125a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
125b0 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43  1);.        winC
125c0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
125d0 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b  le *)&p->hFile);
125e0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
125f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
12600 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12610 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
12620 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
12630 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
12640 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (1);.        sql
12650 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
12660 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
12670 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c   winDelete(pVfs,
12680 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   p->zFilename, 0
12690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
126a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
126b0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  c();.        Sim
126c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
126d0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
126e0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e       *pp = p->pN
126f0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
12700 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69  e3_free(p->aRegi
12710 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
12720 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
12730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20  }else{.      pp 
12740 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = &p->pNext;.   
12750 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12760 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d  Open the shared-
12770 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
12780 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ciated with data
12790 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
127a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
127b0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
127c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
127d0 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
127e0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
127f0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
12800 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
12810 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
12820 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
12830 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
12840 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
12850 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
12860 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
12870 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  der cleared..*/.
12880 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
12890 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77  enSharedMemory(w
128a0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  inFile *pDbFd){.
128b0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20    struct winShm 
128c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
128d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
128e0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
128f0 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
12900 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
12910 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54  Node = 0;   /* T
12920 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
12930 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
12940 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12970 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  e */.  struct wi
12980 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20  nShmNode *pNew; 
12990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
129a0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e  ly allocated win
129b0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ShmNode */.  int
129c0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65  /* Size of zName
129f0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
12a00 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
12a10 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  Shm==0 );    /* 
12a20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  Not previously o
12a30 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  pened */..  /* A
12a40 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
12a50 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  r the new sqlite
12a60 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41  3_shm object.  A
12a70 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c  lso speculativel
12a80 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20  y.  ** allocate 
12a90 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
12aa0 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66  winShmNode and f
12ab0 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ilename..  */.  
12ac0 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
12ad0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
12ae0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
12af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12b00 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  RR_NOMEM;.  mems
12b10 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
12b20 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  *p));.  nName = 
12b30 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12b40 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
12b50 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
12b60 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
12b70 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
12b80 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
12b90 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
12ba0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12bc0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
12bd0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
12be0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
12bf0 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 29  w) + nName + 17)
12c00 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  ;.  pNew->zFilen
12c10 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
12c20 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ew[1];.  sqlite3
12c30 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b  _snprintf(nName+
12c40 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  15, pNew->zFilen
12c50 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70  ame, "%s-shm", p
12c60 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
12c70 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
12c80 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
12c90 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
12ca0 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74  ); ..  /* Look t
12cb0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
12cc0 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69  s an existing wi
12cd0 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61  nShmNode that ca
12ce0 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20  n be used..  ** 
12cf0 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77  If no matching w
12d00 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e  inShmNode curren
12d10 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61  tly exists, crea
12d20 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
12d30 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
12d40 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
12d50 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d  ShmNode = winShm
12d60 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f  NodeList; pShmNo
12d70 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68  de; pShmNode=pSh
12d80 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  mNode->pNext){. 
12d90 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74     /* TBD need t
12da0 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62  o come up with b
12db0 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65  etter match here
12dc0 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a  .  Perhaps.    *
12dd0 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f  * use FILE_ID_BO
12de0 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75  TH_DIR_INFO Stru
12df0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
12e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
12e10 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ICmp(pShmNode->z
12e20 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e  Filename, pNew->
12e30 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20  zFilename)==0 ) 
12e40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
12e50 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
12e60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
12e70 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ew);.  }else{.  
12e80 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65    pShmNode = pNe
12e90 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  w;.    pNew = 0;
12ea0 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29  .    ((winFile*)
12eb0 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  (&pShmNode->hFil
12ec0 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  e))->h = INVALID
12ed0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20  _HANDLE_VALUE;. 
12ee0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65     pShmNode->pNe
12ef0 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  xt = winShmNodeL
12f00 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e  ist;.    winShmN
12f10 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f  odeList = pShmNo
12f20 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64  de;..    pShmNod
12f30 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
12f40 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
12f50 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
12f60 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
12f70 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
12f80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12f90 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
12fa0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
12fb0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
12fc0 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
12fd0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20  (pDbFd->pVfs,.  
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12ff0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
13000 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
13010 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
13020 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
13050 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
13060 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
13070 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   here */.       
13080 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13090 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49  _OPEN_WAL | SQLI
130a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
130b0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
130c0 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64 65 20  CREATE, /* Mode 
130d0 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  flags */.       
130e0 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
130f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13100 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  =rc ){.      got
13110 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
13120 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
13130 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
13140 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
13150 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
13160 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
13170 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
13180 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
13190 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
131a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77      */.    if( w
131b0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
131c0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
131d0 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  RLCK, WIN_SHM_DM
131e0 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
131f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
13200 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
13210 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
13220 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b  Node->hFile, 0);
13230 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13250 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
13260 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
13270 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
13280 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
132a0 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
132b0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
132c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
132d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
132e0 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
132f0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
13300 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
13310 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
13320 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
13330 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
13340 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
13350 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
13360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13370 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
13380 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
13390 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
133a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
133b0 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
133c0 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
133d0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
133e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
133f0 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
13400 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
13410 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
13420 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
13430 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
13440 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
13450 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
13460 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
13470 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
13480 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
13490 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
134a0 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
134b0 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
134c0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
134d0 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
134e0 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
134f0 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
13500 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
13510 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
13520 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
13530 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
13540 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
13550 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
13560 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
13570 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
13580 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
13590 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
135a0 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
135b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
135c0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
135d0 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
135e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
135f0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
13600 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
13610 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
13620 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
13630 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
13640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13650 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
13660 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
13670 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
13680 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
13690 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
136a0 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53  n_err:.  winShmS
136b0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
136c0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
136d0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
136e0 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70  .  winShmPurge(p
136f0 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20  DbFd->pVfs, 0); 
13700 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
13710 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
13720 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
13730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13740 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13750 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68  e(pNew);.  winSh
13760 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  mLeaveMutex();. 
13770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13780 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
13790 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
137a0 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
137b0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
137c0 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
137d0 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
137e0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
137f0 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20  t winShmUnmap(. 
13800 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
13810 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
13820 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
13830 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
13840 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
13850 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
13860 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c   Delete after cl
13870 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  osing if true */
13880 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
13890 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44  DbFd;       /* D
138a0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
138b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
138c0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  .  winShm *p;   
138d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
138e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
138f0 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e   closed */.  win
13900 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
13910 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  e; /* The underl
13920 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
13930 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  ry file */.  win
13940 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
13950 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
13960 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
13970 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  onnections */.. 
13980 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c   pDbFd = (winFil
13990 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
139a0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
139b0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
139c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
139d0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
139e0 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  e;..  /* Remove 
139f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
13a00 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
13a10 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
13a20 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
13a30 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
13a40 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13a50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
13a60 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
13a70 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
13a80 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
13a90 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
13aa0 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
13ab0 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
13ac0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
13ad0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13ae0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
13af0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
13b00 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
13b10 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
13b20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
13b30 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
13b40 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
13b50 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
13b60 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
13b70 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
13b80 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
13b90 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
13ba0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
13bb0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
13bc0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
13bd0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
13be0 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65  .    winShmPurge
13bf0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65  (pDbFd->pVfs, de
13c00 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20  leteFlag);.  }. 
13c10 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
13c20 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
13c30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13c40 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
13c50 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
13c60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
13c70 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
13c80 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a  int winShmLock(.
13c90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
13ca0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
13cb0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
13cc0 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
13cd0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
13ce0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
13cf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
13d00 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
13d10 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
13d20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
13d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13d40 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
13d50 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
13d60 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
13d70 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
13d80 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
13d90 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
13da0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
13db0 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
13dc0 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f  le*)fd;        /
13dd0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
13de0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
13df0 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
13e00 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
13e30 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
13e40 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b  */.  winShm *pX;
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
13e70 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
13e80 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
13e90 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
13ea0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
13eb0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
13ec0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ee0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
13ef0 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
13f20 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
13f30 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
13f40 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
13f50 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
13f60 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
13f70 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
13f80 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
13f90 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
13fa0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
13fb0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
13fc0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
13fd0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
13fe0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
13ff0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
14000 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
14010 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
14020 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
14030 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
14040 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
14050 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
14060 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
14070 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
14080 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
14090 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
140a0 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36  ;..  mask = (u16
140b0 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29  )((1U<<(ofst+n))
140c0 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a   - (1U<<ofst));.
140d0 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
140e0 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
140f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
14100 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
14110 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
14120 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
14130 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
14140 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
14150 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
14160 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
14170 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
14180 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
14190 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
141a0 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
141b0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
141c0 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
141d0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
141e0 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
141f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
14200 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
14210 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
14220 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
14230 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
14240 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
14250 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
14260 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
14270 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
14280 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
14290 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
142a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
142b0 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
142c0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
142d0 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_UNLCK, ofst+W
142e0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
142f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14310 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14320 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
14330 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
14340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14350 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
14360 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
14370 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
14380 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
14390 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
143a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
143b0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
143c0 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
143d0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
143e0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
143f0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
14400 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
14410 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
14420 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
14430 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
14440 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
14450 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
14460 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
14470 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
14480 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
14490 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
144a0 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
144b0 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
144c0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
144d0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
144e0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
144f0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
14500 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
14510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14520 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
14530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14540 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
14550 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
14560 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
14570 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
14580 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
14590 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
145a0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
145b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
145c0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
145d0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
145e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
145f0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
14600 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
14610 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
14620 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
14630 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14640 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14650 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
14660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
14670 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
14680 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
14690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
146a0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
146b0 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
146c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
146d0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
146e0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
146f0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
14700 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
14710 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
14720 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
14730 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
14740 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
14750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14760 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
14770 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
14780 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
14790 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
147a0 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
147b0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
147c0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
147d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
147e0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
147f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
14800 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
14810 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
14820 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
14830 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
14840 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
14850 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
14860 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
14870 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
14880 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
14890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
148a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
148b0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
148c0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
148d0 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  WRLCK, ofst+WIN_
148e0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
148f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14910 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
14920 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
14930 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
14940 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
14950 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
14960 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
14970 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
14980 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
14990 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
149a0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
149b0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
149c0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
149d0 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29 6f     p->id, (int)o
149e0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
149f0 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  ssId(), p->share
14a00 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
14a10 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72  sk,.           r
14a20 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
14a30 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
14a40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
14a50 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
14a60 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
14a70 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
14a80 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
14a90 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
14aa0 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
14ab0 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
14ac0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
14ad0 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
14ae0 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
14af0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
14b00 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
14b10 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
14b20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
14b30 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
14b40 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
14b50 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
14b60 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
14b70 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
14b80 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72  .  /* MemoryBarr
14b90 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e  ier(); // does n
14ba0 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f  ot work -- do no
14bb0 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a  t know why not *
14bc0 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
14bd0 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d  utex();.  winShm
14be0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
14bf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14c00 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
14c10 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
14c20 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
14c30 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
14c40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
14c50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14c70 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
14c80 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
14c90 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
14ca0 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
14cb0 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
14cc0 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
14cd0 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
14ce0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
14cf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14d00 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
14d10 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
14d20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
14d30 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
14d40 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72  ise, if the isWr
14d50 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ite parameter is
14d60 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
14d70 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
14d80 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
14d90 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
14da0 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
14db0 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
14dc0 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
14dd0 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
14de0 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
14df0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
14e00 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14e10 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72  ned. If .** isWr
14e20 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
14e30 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
14e40 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
14e50 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
14e60 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
14e70 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
14e80 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
14e90 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
14ea0 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
14eb0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
14ec0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
14ed0 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
14ee0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
14ef0 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
14f00 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
14f10 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
14f20 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
14f30 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
14f40 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
14f50 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
14f60 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
14f70 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
14f80 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
14f90 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
14fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
14fb0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
14fc0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
14fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
14fe0 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
14ff0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
15000 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15020 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
15030 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
15040 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
15050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
15060 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
15070 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20    int isWrite,  
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
150a0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
150b0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
150c0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
150d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
150e0 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
150f0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
15100 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
15110 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d  le*)fd;.  winShm
15120 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
15130 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  m;.  winShmNode 
15140 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
15150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15160 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
15170 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
15180 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
15190 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
151a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
151b0 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44  n rc;.    p = pD
151c0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
151d0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
151e0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69  ShmNode;..  sqli
151f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15200 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
15210 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
15220 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
15230 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
15240 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
15250 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
15260 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
15270 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
15280 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
15290 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
152a0 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
152b0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
152c0 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
152d0 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
152e0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
152f0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
15300 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
15310 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
15320 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
15330 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
15340 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
15350 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
15360 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
15370 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
15380 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
15390 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
153a0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
153b0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
153c0 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
153d0 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
153e0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
153f0 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
15400 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
15410 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
15420 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
15430 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
15440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
15450 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
15460 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
15470 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
15480 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
15490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
154a0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
154b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
154c0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
154d0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
154f0 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64  nShmMap1", pDbFd
15500 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
15510 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
15520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15530 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20   sz<nByte ){.   
15540 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
15550 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
15560 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
15570 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20  . If isWrite is 
15580 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  set to.      ** 
15590 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79  zero, exit early
155a0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
155b0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
155c0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
155d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
155e0 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
155f0 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73  y, if isWrite is
15600 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66   non-zero, use f
15610 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
15620 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  locate.      ** 
15630 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
15640 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
15650 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15660 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20  !isWrite ) goto 
15670 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
15680 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
15690 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
156a0 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
156b0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
156c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
156d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
156e0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
156f0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
15700 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
15710 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
15720 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
15730 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
15740 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
15750 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
15760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15770 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
15780 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
15790 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
157a0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
157b0 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
157c0 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
157d0 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
157e0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
157f0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
15800 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
15810 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
15820 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
15830 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
15840 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15850 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
15860 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
15870 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
15880 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
15890 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
158a0 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
158b0 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
158c0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
158d0 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
158e0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
158f0 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
15900 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
15910 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
15920 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
15930 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
15940 20 20 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20      .      hMap 
15950 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
15960 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e  pping(pShmNode->
15970 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
15980 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
15990 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
159a0 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
159b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
159c0 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64  ("SHM-MAP pid-%d
159d0 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25   create region=%
159e0 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22  d nbyte=%d %s\n"
159f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15a00 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
15a10 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15a20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
15a30 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
15a40 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
15a50 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
15a60 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
15a70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15a80 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
15a90 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
15aa0 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
15ab0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
15ac0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
15ad0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
15ae0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
15af0 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73         pMap = os
15b00 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d  MapViewOfFile(hM
15b10 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
15b20 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
15b30 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
15b40 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66  0, iOffset - iOf
15b50 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
15b60 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
15b70 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ft.        );.  
15b80 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15b90 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d  SHM-MAP pid-%d m
15ba0 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66  ap region=%d off
15bb0 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25  set=%d size=%d %
15bc0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15bd0 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
15be0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15bf0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
15c00 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
15c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
15c30 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
15c40 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
15c50 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
15c60 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
15c70 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
15c80 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
15c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
15ca0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15cb0 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
15cc0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
15cd0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
15ce0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
15cf0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
15d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
15d10 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
15d20 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
15d30 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
15d40 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
15d50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
15d60 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
15d70 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
15d80 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
15d90 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
15da0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
15db0 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
15dc0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
15dd0 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
15de0 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
15df0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
15e00 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
15e10 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
15e20 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
15e30 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
15e40 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
15e50 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
15e60 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
15e70 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
15e80 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
15e90 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
15ea0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
15eb0 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
15ec0 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
15ed0 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
15ee0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
15ef0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15f00 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
15f10 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
15f20 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
15f30 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
15f40 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
15f50 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
15f60 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
15f70 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
15f80 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
15f90 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
15fa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15fb0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
15fc0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
15fd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
15fe0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
15ff0 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
16000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16010 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
16020 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
16030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
160a0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
160b0 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
160c0 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
160d0 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
160e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
160f0 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
16100 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
16110 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
16120 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c  oMethod = {.  2,
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16150 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
16160 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16180 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
16190 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161b0 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
161c0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
161d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
161e0 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
161f0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
16200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
16210 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
16220 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16240 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
16250 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
16270 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
16280 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162a0 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
162b0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
162c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
162d0 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
162e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
162f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
16300 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
16310 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
16320 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
16330 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
16340 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
16350 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
16360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
16370 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
16380 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
16390 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
163a0 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
163b0 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
163c0 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163e0 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
163f0 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16410 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
16420 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16440 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
16450 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  .  winShmUnmap  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
16480 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  */.};../********
16490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
164e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164f0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
16500 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
16510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16520 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
16530 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
16540 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
16550 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
16560 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
16570 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
16580 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
16590 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
165a0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
165b0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
165c0 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
165d0 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
165e0 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
165f0 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
16600 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
16610 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
16620 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
16630 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
16640 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
16650 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76  tatic void *conv
16660 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
16670 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
16680 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
16690 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
166a0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
166b0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
166c0 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
166d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73  Filename);./* is
166e0 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
166f0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
16700 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
16710 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
16720 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
16730 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
16740 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  lse{.    zConver
16750 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  ted = sqlite3_wi
16760 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
16770 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e  (zFilename);.#en
16780 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20 63 61 6c  dif.  }.  /* cal
16790 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
167a0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
167b0 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
167c0 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rted;.}../*.** C
167d0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
167e0 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
167f0 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
16800 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
16810 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73  .** hold at pVfs
16820 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61  ->mxPathname cha
16830 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
16840 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61  ic int getTempna
16850 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
16860 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
16870 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
16880 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
16890 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
168a0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
168b0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
168c0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
168d0 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
168e0 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65  i, j;.  char zTe
168f0 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b  mpPath[MAX_PATH+
16900 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  2];..  /* It's o
16910 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
16920 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
16930 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
16940 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
16950 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
16960 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
16970 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
16980 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
16990 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
169a0 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
169b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
169c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
169d0 4f 45 52 52 20 29 3b 0a 0a 20 20 69 66 28 20 73  OERR );..  if( s
169e0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
169f0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
16a00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
16a10 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
16a20 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69  Path, "%s", sqli
16a30 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
16a40 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ry);.  }else if(
16a50 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63   isNT() ){.    c
16a60 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20  har *zMulti;.   
16a70 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 68   WCHAR zWidePath
16a80 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20  [MAX_PATH];.    
16a90 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d  osGetTempPathW(M
16aa0 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64  AX_PATH-30, zWid
16ab0 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
16ac0 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
16ad0 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
16ae0 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
16af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
16b00 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
16b10 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
16b20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
16b30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16b40 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d  e(zMulti);.    }
16b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
16b70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20  NOMEM;.    }./* 
16b80 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
16b90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
16ba0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
16bb0 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
16bc0 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
16bd0 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66   ANSI version of
16be0 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
16bf0 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
16c00 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
16c10 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
16c20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
16c30 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
16c40 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
16c50 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
16c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
16c70 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61   *zUtf8;.    cha
16c80 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f  r zMbcsPath[MAX_
16c90 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74  PATH];.    osGet
16ca0 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41  TempPathA(MAX_PA
16cb0 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68  TH-30, zMbcsPath
16cc0 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73  );.    zUtf8 = s
16cd0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
16ce0 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50  s_to_utf8(zMbcsP
16cf0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55  ath);.    if( zU
16d00 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tf8 ){.      sql
16d10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
16d20 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
16d30 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66  Path, "%s", zUtf
16d40 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
16d50 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
16d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16d80 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
16d90 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
16da0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
16db0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
16dc0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
16dd0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
16de0 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
16df0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
16e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16e10 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
16e20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
16e30 28 7a 54 65 6d 70 50 61 74 68 29 20 2b 20 73 71  (zTempPath) + sq
16e40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
16e50 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
16e60 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20  REFIX) + 18) >= 
16e70 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
16e80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
16e90 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71  .  }..  for(i=sq
16ea0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
16eb0 65 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26  empPath); i>0 &&
16ec0 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d   zTempPath[i-1]=
16ed0 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='\\'; i--){}.  
16ee0 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30  zTempPath[i] = 0
16ef0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
16f00 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
16f10 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Buf,.           
16f20 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51          "%s\\"SQ
16f30 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
16f40 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68  REFIX, zTempPath
16f50 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  );.  j = sqlite3
16f60 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
16f70 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
16f80 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
16f90 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
16fa0 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
16fb0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
16fc0 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
16fd0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
16fe0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
16ff0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
17000 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
17010 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a  zBuf[j+1] = 0;..
17020 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
17030 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22   FILENAME: %s\n"
17040 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
17050 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
17060 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
17070 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
17080 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 73   int winAccess(s
17090 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73  qlite3_vfs*,cons
170a0 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 2a  t char*,int,int*
170b0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  );../*.** Return
170c0 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
170d0 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
170e0 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
170f0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
17100 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
17110 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
17120 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
17130 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
17140 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
17150 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
17160 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
17170 74 20 77 69 6e 49 73 44 69 72 28 73 71 6c 69 74  t winIsDir(sqlit
17180 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
17190 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
171a0 7b 0a 20 20 69 6e 74 20 69 73 44 69 72 20 3d 20  {.  int isDir = 
171b0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  0;.  int rc;.  c
171c0 68 61 72 20 2a 7a 44 69 72 4e 61 6d 65 3b 0a 0a  har *zDirName;..
171d0 20 20 7a 44 69 72 4e 61 6d 65 20 3d 20 73 71 6c    zDirName = sql
171e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
171f0 2f 6e 75 6c 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  /nul", zName);. 
17200 20 69 66 28 20 7a 44 69 72 4e 61 6d 65 20 29 7b   if( zDirName ){
17210 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 41 63 63  .    rc = winAcc
17220 65 73 73 28 70 56 66 73 2c 20 7a 44 69 72 4e 61  ess(pVfs, zDirNa
17230 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  me, SQLITE_ACCES
17240 53 5f 45 58 49 53 54 53 2c 20 26 69 73 44 69 72  S_EXISTS, &isDir
17250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17260 72 65 65 28 7a 44 69 72 4e 61 6d 65 29 3b 0a 20  ree(zDirName);. 
17270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
17280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17290 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3d 3d   }.  return rc==
172a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 44  SQLITE_OK && isD
172b0 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  ir;.}../*.** Ope
172c0 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  n a file..*/.sta
172d0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
172e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
172f0 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVfs,        /* 
17300 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
17310 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
17320 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17330 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
17340 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
17350 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
17360 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17370 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
17380 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
17390 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
173a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
173b0 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
173c0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
173d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
173e0 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
173f0 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
17400 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
17410 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  rno;.  DWORD dwD
17420 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
17430 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
17440 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
17450 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
17460 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
17470 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
17480 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
17490 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
174a0 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
174b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
174c0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
174d0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
174e0 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
174f0 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
17500 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
17510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17520 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
17530 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e  ; /* Filename in
17540 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
17550 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
17560 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
17570 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
17580 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
17590 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
175a0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
175b0 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
175c0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
175d0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
175e0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
175f0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
17600 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32  pname[MAX_PATH+2
17610 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ];     /* Buffer
17620 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
17630 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  temp filename */
17640 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
17650 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
17660 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
17670 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
17680 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
17690 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
176a0 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
176b0 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
176c0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
176d0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
176e0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
176f0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
17700 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
17710 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
17720 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
17730 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
17740 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
17750 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
17760 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
17770 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
17780 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66  PEN_CREATE);.#if
17790 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
177a0 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
177b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
177c0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
177d0 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73  .#endif.  int is
177e0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
177f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17800 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
17810 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17820 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
17830 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
17840 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
17850 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
17860 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
17870 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
17880 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
17890 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
178a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
178b0 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64  N_WAL.  ));.#end
178c0 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
178d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
178e0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
178f0 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
17900 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
17910 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
17920 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
17930 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
17940 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
17950 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
17960 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
17970 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
17980 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
17990 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
179a0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
179b0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
179c0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
179d0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
179e0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
179f0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
17a00 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
17a10 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
17a20 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
17a30 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
17a40 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
17a50 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
17a60 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
17a70 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
17a80 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
17a90 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
17aa0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
17ab0 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
17ac0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
17ad0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
17ae0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
17af0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
17b00 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
17b10 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
17b20 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
17b30 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
17b40 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
17b50 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
17b60 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
17b70 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
17b80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
17b90 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
17ba0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
17bb0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
17bc0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
17bd0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
17be0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
17bf0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
17c00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
17c10 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
17c20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
17c30 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
17c40 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
17c50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
17c60 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
17c70 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
17c80 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
17c90 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
17ca0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
17cb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
17cc0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
17cd0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
17ce0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
17cf0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
17d00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17d10 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
17d20 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
17d30 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
17d40 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
17d50 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
17d60 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
17d70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
17d80 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
17d90 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
17da0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
17db0 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
17dc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
17dd0 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
17de0 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  id!=0 );.  UNUSE
17df0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
17e00 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  );..  pFile->h =
17e10 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
17e20 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20  VALUE;..  /* If 
17e30 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
17e40 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
17e50 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
17e60 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74  nerate a .  ** t
17e70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
17e80 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a  me to use .  */.
17e90 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
17ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69   ){.    assert(i
17eb0 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
17ec0 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  enJournal);.    
17ed0 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
17ee0 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20 7a 54 6d  (MAX_PATH+2, zTm
17ef0 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
17f00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
17f30 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
17f40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
17f50 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
17f60 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
17f70 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
17f80 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
17f90 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
17fa0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
17fb0 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
17fc0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
17fd0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
17fe0 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
17ff0 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
18000 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
18010 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
18020 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
18030 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55  I) ||.        zU
18040 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  tf8Name[strlen(z
18050 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  Utf8Name)+1]==0 
18060 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  );..  /* Convert
18070 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
18080 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
18090 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
180a0 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
180b0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66  tf8Filename(zUtf
180c0 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  8Name);.  if( zC
180d0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
180e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
180f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
18100 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  }..  if( isReadW
18110 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65  rite ){.    dwDe
18120 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
18130 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
18140 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65  ERIC_WRITE;.  }e
18150 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72  lse{.    dwDesir
18160 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
18170 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  IC_READ;.  }..  
18180 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  /* SQLITE_OPEN_E
18190 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64  XCLUSIVE is used
181a0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
181b0 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  at a new file is
181c0 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20   .  ** created. 
181d0 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
181e0 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
181f0 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
18200 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74  ess" .  ** as it
18210 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
18220 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69  rstood..  */.  i
18230 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
18240 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73  {.    /* Creates
18250 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c   a new file, onl
18260 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  y if it does not
18270 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
18280 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  */.    /* If the
18290 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74   file exists, it
182a0 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64   fails. */.    d
182b0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
182c0 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45  tion = CREATE_NE
182d0 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  W;.  }else if( i
182e0 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f  sCreate ){.    /
182f0 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
18300 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
18310 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
18320 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
18330 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
18340 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
18350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18360 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
18370 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
18380 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
18390 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
183a0 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
183b0 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64   }..  dwShareMod
183c0 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52  e = FILE_SHARE_R
183d0 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45  EAD | FILE_SHARE
183e0 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69  _WRITE;..  if( i
183f0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53  sDelete ){.#if S
18400 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
18410 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
18420 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
18430 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b  TTRIBUTE_HIDDEN;
18440 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b  .    isTemp = 1;
18450 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61  .#else.    dwFla
18460 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
18470 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
18480 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20  _TEMPORARY.     
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
184b0 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
184c0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
184f0 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65  ETE_ON_CLOSE;.#e
18500 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
18510 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
18520 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
18530 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
18540 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73    }.  /* Reports
18550 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
18560 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66  et are that perf
18570 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79  ormance is alway
18580 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66  s.  ** better if
18590 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
185a0 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64  M_ACCESS is used
185b0 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e  .  Ticket #2699.
185c0 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
185d0 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67  S_WINCE.  dwFlag
185e0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c  sAndAttributes |
185f0 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
18600 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69  OM_ACCESS;.#endi
18610 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  f..  if( isNT() 
18620 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  ){.    while( (h
18630 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57   = osCreateFileW
18640 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
18650 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
18680 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
186b0 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
186e0 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
18710 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
18740 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
18750 44 4c 45 5f 56 41 4c 55 45 0a 20 20 20 20 20 20  DLE_VALUE.      
18760 20 20 26 26 20 21 77 69 6e 49 73 44 69 72 28 70    && !winIsDir(p
18770 56 66 73 2c 20 7a 4e 61 6d 65 29 0a 20 20 20 20  Vfs, zName).    
18780 20 20 20 20 26 26 20 72 65 74 72 79 49 6f 65 72      && retryIoer
18790 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
187a0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
187b0 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
187c0 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
187d0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
187e0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
187f0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
18800 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
18810 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18830 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
18840 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
18870 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
188a0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
188d0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
188e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
18910 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
18940 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
18950 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 23  lastErrno) ){}.#
18960 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67  endif.  }..  log
18970 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f  Ioerr(cnt);..  O
18980 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
18990 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
189a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
189b0 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
189c0 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
189d0 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
189e0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
189f0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
18a00 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
18a10 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
18a20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
18a30 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
18a40 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
18a50 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
18a60 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
18a70 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
18a80 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
18a90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18aa0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
18ab0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
18ac0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
18ad0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18ae0 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
18af0 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
18b00 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
18b10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18b20 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f  ONLY)&~(SQLITE_O
18b30 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
18b40 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18b50 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  )), pOutFlags);.
18b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18b80 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
18b90 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
18ba0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
18bb0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
18bc0 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  ){.      *pOutFl
18bd0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
18be0 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
18bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
18c00 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
18c10 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
18c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65  .    }.  }..  me
18c30 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
18c40 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a  izeof(*pFile));.
18c50 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
18c60 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
18c70 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
18c80 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
18c90 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
18ca0 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
18cb0 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  pVfs;.  pFile->p
18cc0 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  Shm = 0;.  pFile
18cd0 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
18ce0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
18cf0 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65  ri_boolean(zName
18d00 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45  , "psow", SQLITE
18d10 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
18d20 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69  RITE) ){.    pFi
18d30 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
18d40 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20   WINFILE_PSOW;. 
18d50 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
18d60 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73  S_WINCE.  if( is
18d70 52 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79  ReadWrite && eTy
18d80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18d90 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26  MAIN_DB.       &
18da0 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f  & !winceCreateLo
18db0 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
18dc0 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  .  ){.    osClos
18dd0 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
18de0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
18df0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65  nverted);.    re
18e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
18e10 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OPEN_BKPT;.  }. 
18e20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
18e30 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74     pFile->zDelet
18e40 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76  eOnClose = zConv
18e50 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23  erted;.  }else.#
18e60 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
18e70 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
18e80 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f  erted);.  }..  O
18e90 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
18ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18eb0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
18ec0 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
18ed0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e  ** Note that Win
18ee0 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
18ef0 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
18f00 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
18f10 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
18f20 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
18f30 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
18f40 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
18f50 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
18f60 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
18f70 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
18f80 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
18f90 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
18fa0 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
18fb0 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
18fc0 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
18fd0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
18fe0 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
18ff0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
19000 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
19010 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
19020 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
19030 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
19040 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
19050 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
19060 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
19070 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
19080 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
19090 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
190a0 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
190b0 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
190c0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
190d0 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
190e0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
190f0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
19100 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
19110 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
19120 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
19130 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
19140 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
19150 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
19160 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
19170 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
19180 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
19190 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
191a0 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 6c 61  t rc;.  DWORD la
191b0 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20  stErrno;.  void 
191c0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
191d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
191e0 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
191f0 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
19200 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
19210 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
19220 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
19230 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  E);.  zConverted
19240 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
19250 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
19260 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
19270 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
19280 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19290 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
192a0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
192b0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69   rc = 1;.    whi
192c0 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  le( osGetFileAtt
192d0 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
192e0 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  ted)!=INVALID_FI
192f0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
19300 0a 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20  .         (rc = 
19310 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43  osDeleteFileW(zC
19320 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26  onverted))==0 &&
19330 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
19340 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
19350 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20  }.    rc = rc ? 
19360 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
19370 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a 20 69 73 4e  TE_ERROR;./* isN
19380 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
19390 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
193a0 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
193b0 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
193c0 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e  .** Since the AN
193d0 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  SI version of th
193e0 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
193f0 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
19400 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
19410 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
19420 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
19430 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
19440 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
19450 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
19460 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
19470 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65  .    while( osGe
19480 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
19490 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e  (zConverted)!=IN
194a0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
194b0 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
194c0 20 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65    (rc = osDelete
194d0 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
194e0 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f  ))==0 && retryIo
194f0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
19500 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63  rrno) ){}.    rc
19510 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f   = rc ? SQLITE_O
19520 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  K : SQLITE_ERROR
19530 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
19540 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20  f( rc ){.    rc 
19550 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
19560 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
19570 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  E, lastErrno,.  
19580 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44             "winD
19590 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
195a0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
195b0 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
195c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
195d0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
195e0 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
195f0 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c  TE \"%s\" %s\n",
19600 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20   zFilename, (rc 
19610 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
19620 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  " )));.  return 
19630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
19640 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  ck the existance
19650 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
19660 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
19670 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
19680 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19690 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
196a0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
196b0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
196c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
196d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
196e0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
196f0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
19700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
19710 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
19720 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
19730 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
19740 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
19750 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
19760 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
19770 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
19780 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
19790 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
197a0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
197b0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
197c0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
197d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
197e0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
197f0 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ; );.  zConverte
19800 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
19810 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
19820 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
19830 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
19840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19850 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
19860 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
19870 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
19880 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
19890 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
198a0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
198b0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
198c0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
198d0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
198e0 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
198f0 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
19900 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
19910 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
19940 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
19970 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
19980 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
19990 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72  o) ){}.    if( r
199a0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  c ){.      /* Fo
199b0 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45  r an SQLITE_ACCE
199c0 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c  SS_EXISTS query,
199d0 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65   treat a zero-le
199e0 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20  ngth file.      
199f0 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73  ** as if it does
19a00 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
19a10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20    */.      if(  
19a20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f    flags==SQLITE_
19a30 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20  ACCESS_EXISTS.  
19a40 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
19a50 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69  Data.nFileSizeHi
19a60 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  gh==0 .         
19a70 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
19a80 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
19a90 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
19aa0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
19ab0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
19ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
19ad0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
19ae0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
19af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
19b00 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65  se{.      logIoe
19b10 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69  rr(cnt);.      i
19b20 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  f( lastErrno!=ER
19b30 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
19b40 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  ND ){.        wi
19b50 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
19b60 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c  _IOERR_ACCESS, l
19b70 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63  astErrno, "winAc
19b80 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  cess", zFilename
19b90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19ba0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
19bb0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
19bc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19bd0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d  _ACCESS;.      }
19be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
19bf0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
19c00 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
19c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69      }.    }./* i
19c20 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
19c30 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
19c40 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
19c50 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
19c60 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
19c70 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  ANSI version of 
19c80 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
19c90 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
19ca0 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
19cb0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
19cc0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
19cd0 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
19ce0 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
19cf0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
19d00 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
19d10 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
19d20 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
19d30 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
19d40 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  f.  }.  sqlite3_
19d50 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
19d60 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
19d70 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
19d80 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
19d90 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
19da0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
19db0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
19dc0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
19dd0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
19de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19df0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
19e00 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
19e10 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
19e20 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
19e30 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ES &&.          
19e40 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f     (attr & FILE_
19e50 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
19e60 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
19e70 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
19e80 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
19e90 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
19ea0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
19eb0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
19ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ed0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
19ee0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
19ef0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
19f00 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
19f10 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
19f20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f  pathname into zO
19f30 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69  ut[].  zOut[] wi
19f40 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70  ll be at least p
19f50 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
19f60 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
19f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19f80 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
19f90 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19fa0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
19fb0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
19fc0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
19fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
19fe0 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tive,        /* 
19ff0 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
1a000 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
1a010 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20    int nFull,    
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
1a040 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
1a050 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75  s */.  char *zFu
1a060 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
1a070 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
1a080 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23  uffer */.){.  .#
1a090 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
1a0a0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
1a0b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1a0c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
1a0d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a0e0 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79  TER(nFull);.  cy
1a0f0 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c  gwin_conv_to_ful
1a100 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65  l_win32_path(zRe
1a110 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a  lative, zFull);.
1a120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a130 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
1a140 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1a150 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a160 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1a170 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
1a180 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
1a190 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  ll);.  /* WinCE 
1a1a0 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
1a1b0 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
1a1c0 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
1a1d0 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c  m told. */.  sql
1a1e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
1a1f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
1a200 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
1a210 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72  lative);.  retur
1a220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
1a230 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
1a240 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
1a250 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
1a260 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ).  int nByte;. 
1a270 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1a280 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
1a290 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1a2a0 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
1a2b0 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
1a2c0 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
1a2d0 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
1a2e0 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
1a2f0 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
1a300 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
1a310 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
1a320 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
1a330 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68  && sqlite3Isalph
1a340 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20  a(zRelative[1]) 
1a350 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d  && zRelative[2]=
1a360 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c  =':' ){.    zRel
1a370 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
1a380 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
1a390 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
1a3a0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
1a3b0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
1a3c0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
1a3d0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
1a3e0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
1a3f0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
1a400 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
1a410 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
1a420 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1a430 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
1a440 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
1a450 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
1a460 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
1a470 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
1a480 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1a490 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1a4a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1a4b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a4c0 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f  ER(nFull);.  zCo
1a4d0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
1a4e0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  tUtf8Filename(zR
1a4f0 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
1a500 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1a510 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a520 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1a530 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
1a540 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a   ){.    LPWSTR z
1a550 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
1a560 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
1a570 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
1a580 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
1a590 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
1a5a0 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
1a5b0 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
1a5c0 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
1a5d0 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
1a5e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1a5f0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1a600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1a610 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1a620 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 47  M;.    }.    osG
1a630 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
1a640 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1a650 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
1a660 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1a670 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1a680 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
1a690 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
1a6a0 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
1a6b0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 2f  3_free(zTemp);./
1a6c0 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
1a6d0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1a6e0 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
1a6f0 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
1a700 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
1a710 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
1a720 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
1a730 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
1a740 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
1a750 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
1a760 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
1a770 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
1a780 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
1a790 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
1a7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
1a7b0 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
1a7c0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
1a7d0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
1a7e0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
1a7f0 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a  0, 0) + 3;.    z
1a800 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Temp = sqlite3_m
1a810 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
1a820 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
1a830 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
1a840 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1a850 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1a860 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
1a870 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1a880 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1a890 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
1a8a0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
1a8b0 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
1a8c0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mp, 0);.    sqli
1a8d0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1a8e0 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
1a8f0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
1a900 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
1a910 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
1a920 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e  free(zTemp);.#en
1a930 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f  dif.  }.  if( zO
1a940 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
1a950 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d  3_snprintf(pVfs-
1a960 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  >mxPathname, zFu
1a970 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
1a980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a990 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
1a9a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a9b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
1a9c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a9d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
1a9e0 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
1a9f0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1aa00 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
1aa10 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
1aa20 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
1aa30 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
1aa40 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
1aa50 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
1aa60 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
1aa70 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
1aa80 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
1aa90 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
1aaa0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
1aab0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
1aac0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
1aad0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
1aae0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
1aaf0 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
1ab00 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
1ab10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
1ab20 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
1ab30 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
1ab40 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1ab50 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
1ab60 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1ab70 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1ab80 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
1ab90 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
1aba0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1abb0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1abc0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1abd0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   0;.  }.  if( is
1abe0 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20  NT() ){.    h = 
1abf0 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  osLoadLibraryW((
1ac00 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1ac10 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  ed);./* isNT() i
1ac20 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
1ac30 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
1ac40 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
1ac50 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
1ac60 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65  ince the ANSI ve
1ac70 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
1ac80 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
1ac90 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
1aca0 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
1acb0 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
1acc0 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
1acd0 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
1ace0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1acf0 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
1ad00 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
1ad10 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43  braryA((char*)zC
1ad20 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
1ad30 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  f.  }.  sqlite3_
1ad40 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1ad50 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
1ad60 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
1ad70 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
1ad80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1ad90 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1ada0 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
1adb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1adc0 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72  fs);.  getLastEr
1add0 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
1ade0 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
1adf0 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69  BufOut);.}.stati
1ae00 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  c void (*winDlSy
1ae10 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
1ae20 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
1ae30 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
1ae40 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b  zSymbol))(void){
1ae50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1ae60 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
1ae70 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
1ae80 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72  d))osGetProcAddr
1ae90 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61  essA((HANDLE)pHa
1aea0 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
1aeb0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
1aec0 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
1aed0 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
1aee0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
1aef0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1af00 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69  Vfs);.  osFreeLi
1af10 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
1af20 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
1af30 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
1af40 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1af50 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
1af60 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
1af70 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
1af80 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
1af90 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
1afa0 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
1afb0 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
1afc0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
1afd0 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
1afe0 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
1aff0 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
1b000 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
1b010 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
1b020 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1b030 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1b040 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
1b050 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b060 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
1b070 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1b080 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
1b090 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
1b0a0 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
1b0b0 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
1b0c0 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
1b0d0 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
1b0e0 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
1b0f0 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
1b100 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
1b110 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
1b120 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
1b130 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
1b140 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
1b150 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
1b160 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
1b170 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
1b180 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
1b190 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
1b1a0 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
1b1b0 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
1b1c0 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
1b1d0 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
1b1e0 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20  {.    DWORD cnt 
1b1f0 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
1b200 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
1b210 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
1b220 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
1b230 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
1b240 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
1b250 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
1b260 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  R)<=nBuf-n ){.  
1b270 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
1b280 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65  i;.    osQueryPe
1b290 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
1b2a0 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&i);.    memcpy
1b2b0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73  (&zBuf[n], &i, s
1b2c0 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e  izeof(i));.    n
1b2d0 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20   += sizeof(i);. 
1b2e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1b2f0 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
1b300 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
1b310 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
1b320 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1b330 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  time slept..*/.s
1b340 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65  tatic int winSle
1b350 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
1b360 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73  pVfs, int micros
1b370 65 63 29 7b 0a 20 20 6f 73 53 6c 65 65 70 28 28  ec){.  osSleep((
1b380 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
1b390 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
1b3a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1b3b0 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
1b3c0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
1b3d0 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
1b3e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1b3f0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
1b400 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
1b410 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1b420 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
1b430 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
1b440 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
1b450 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
1b460 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
1b470 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
1b480 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
1b490 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1b4a0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
1b4b0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
1b4c0 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
1b4d0 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
1b4e0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
1b4f0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
1b500 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
1b510 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
1b520 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
1b530 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
1b540 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
1b550 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
1b560 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
1b570 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
1b580 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
1b590 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
1b5a0 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
1b5b0 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
1b5c0 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
1b5d0 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
1b5e0 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
1b5f0 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
1b600 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
1b610 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
1b620 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
1b630 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
1b640 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
1b650 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
1b660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b670 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b680 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
1b690 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
1b6a0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1b6b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b6c0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
1b6d0 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
1b6e0 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
1b6f0 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
1b700 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
1b710 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
1b720 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
1b730 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
1b740 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
1b750 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
1b760 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
1b770 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
1b780 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
1b790 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
1b7a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1b7b0 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
1b7c0 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
1b7d0 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
1b7e0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
1b7f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1b800 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
1b810 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
1b820 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
1b830 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
1b840 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
1b850 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
1b860 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
1b870 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
1b880 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
1b890 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1b8a0 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
1b8b0 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71  lue = .      (sq
1b8c0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
1b8d0 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
1b8e0 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
1b8f0 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
1b900 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a  t64)294967296;..
1b910 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1b920 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
1b930 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79   time;.  osGetSy
1b940 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
1b950 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
1b960 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
1b970 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
1b980 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
1b990 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  (!osSystemTimeTo
1b9a0 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26  FileTime(&time,&
1b9b0 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ft)){.    return
1b9c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b9d0 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74   }.#else.  osGet
1b9e0 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
1b9f0 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
1ba00 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  dif..  *piNow = 
1ba10 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
1ba20 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   +.            (
1ba30 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
1ba40 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
1ba50 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75  me)*max32BitValu
1ba60 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
1ba70 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
1ba80 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65  t64)ft.dwLowDate
1ba90 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69  Time)/(sqlite3_i
1baa0 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66  nt64)10000;..#if
1bab0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1bac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
1bad0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
1bae0 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
1baf0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
1bb00 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1bb10 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
1bb20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
1bb30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1bb40 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Vfs);.  return S
1bb50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1bb60 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
1bb70 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
1bb80 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
1bb90 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
1bba0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
1bbb0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
1bbc0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
1bbd0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
1bbe0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
1bbf0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
1bc00 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
1bc10 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1bc20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc30 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73  winCurrentTime(s
1bc40 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bc50 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
1bc60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1bc70 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20  lite3_int64 i;. 
1bc80 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74   rc = winCurrent
1bc90 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20  TimeInt64(pVfs, 
1bca0 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29  &i);.  if( !rc )
1bcb0 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69  {.    *prNow = i
1bcc0 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d  /86400000.0;.  }
1bcd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bce0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ./*.** The idea 
1bcf0 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
1bd00 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65  ction works like
1bd10 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
1bd20 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  f.** GetLastErro
1bd30 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65  r() and FormatMe
1bd40 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f  ssage() on Windo
1bd50 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64  ws (or errno and
1bd60 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
1bd70 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72   on Unix). After
1bd80 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1bd90 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a  urned by an OS.*
1bda0 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69  * function, SQLi
1bdb0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
1bdc0 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66  nction with zBuf
1bdd0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
1bde0 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66  a buffer of nBuf
1bdf0 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c   bytes. The OS l
1be00 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75  ayer should popu
1be10 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66  late the.** buff
1be20 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65  er with a nul-te
1be30 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65  rminated UTF-8 e
1be40 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73  ncoded error mes
1be50 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69  sage.** describi
1be60 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65  ng the last IO e
1be70 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63  rror to have occ
1be80 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  urred within the
1be90 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65   calling.** thre
1bea0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
1beb0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1bec0 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
1bed0 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
1bee0 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c  fer,.** it shoul
1bef0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20  d be truncated. 
1bf00 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1bf10 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f   of xGetLastErro
1bf20 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  r.** is zero if 
1bf30 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
1bf40 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
1bf50 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
1bf60 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
1bf70 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
1bf80 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49  as truncated). I
1bf90 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  f non-zero is re
1bfa0 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  turned,.** then 
1bfb0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1bfc0 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ary to include t
1bfd0 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  he nul-terminato
1bfe0 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  r character.** i
1bff0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
1c000 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73  fer..**.** Not s
1c010 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f  upplying an erro
1c020 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68  r message will h
1c030 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65  ave no adverse e
1c040 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69  ffect.** on SQLi
1c050 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74  te. It is fine t
1c060 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d  o have an implem
1c070 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65  entation that ne
1c080 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ver.** returns a
1c090 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a  n error message:
1c0a0 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65  .**.**   int xGe
1c0b0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
1c0c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1c0d0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1c0e0 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65  uf){.**     asse
1c0f0 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27  rt(zBuf[0]=='\0'
1c100 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  );.**     return
1c110 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a   0;.**   }.**.**
1c120 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65   However if an e
1c130 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
1c140 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c  supplied, it wil
1c150 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65  l be incorporate
1c160 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69  d.** by sqlite i
1c170 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nto the error me
1c180 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20  ssage available 
1c190 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e  to the user usin
1c1a0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  g.** sqlite3_err
1c1b0 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20  msg(), possibly 
1c1c0 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73  making IO errors
1c1d0 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67   easier to debug
1c1e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c1f0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28  winGetLastError(
1c200 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c210 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
1c220 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
1c230 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1c240 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74  s);.  return get
1c250 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
1c260 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
1c270 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f  Buf, zBuf);.}../
1c280 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1c290 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65  and deinitialize
1c2a0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
1c2b0 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
1c2c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c2d0 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20  os_init(void){. 
1c2e0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
1c2f0 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20  vfs winVfs = {. 
1c300 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
1c310 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
1c320 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
1c330 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
1c340 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
1c350 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20     MAX_PATH,    
1c360 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
1c370 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
1c3a0 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20    "win32",      
1c3b0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
1c3c0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1c3e0 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
1c3f0 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
1c400 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
1c410 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
1c420 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
1c430 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
1c440 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
1c450 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
1c460 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
1c470 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
1c480 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
1c490 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
1c4a0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
1c4b0 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
1c4c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
1c4d0 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
1c4e0 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
1c4f0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
1c500 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
1c510 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
1c520 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
1c530 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
1c540 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
1c550 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
1c560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c570 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
1c580 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
1c590 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
1c5a0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
1c5b0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
1c5c0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
1c5d0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
1c5e0 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
1c5f0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
1c600 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
1c610 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
1c620 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
1c630 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
1c640 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
1c650 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
1c660 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
1c670 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
1c680 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
1c690 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  };..  /* Double-
1c6a0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
1c6b0 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
1c6c0 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
1c6d0 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
1c6e0 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
1c6f0 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
1c700 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
1c710 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
1c720 63 61 6c 6c 29 3d 3d 36 30 20 29 3b 0a 0a 23 69  call)==60 );..#i
1c730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c740 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d  T_WAL.  /* get m
1c750 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61  emory map alloca
1c760 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79  tion granularity
1c770 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69   */.  memset(&wi
1c780 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  nSysInfo, 0, siz
1c790 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29  eof(SYSTEM_INFO)
1c7a0 29 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  );.  osGetSystem
1c7b0 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
1c7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53  );.  assert(winS
1c7d0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1c7e0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e  ionGranularity >
1c7f0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73   0);.#endif..  s
1c800 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1c810 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
1c820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c830 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c  _OK; .}..int sql
1c840 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
1c850 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
1c860 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
1c870 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
1c880 49 4e 20 2a 2f 0a                                IN */.